Как работает программа

Тема в разделе "WASM.RESEARCH", создана пользователем IPKILLER, 18 сен 2004.

  1. IPKILLER

    IPKILLER New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2004
    Сообщения:
    9
    Здравствуйте!

    Не могли бы вы объяснить как работает программа, которая расположена ниже. Понятно, что она заставляет пикнуть спикер, но мне нужно подробно знать для чего нужна каждая строчка машинного кода. И ещё один вопросик. Почему E2FE - это loop 0118. E2 - это loop, а как получается 0118?


    Код (Text):
    1. :0001.0100 50                     push ax
    2. :0001.0101 51                     push cx
    3. :0001.0102 B0B6                   mov al, B6
    4. :0001.0104 E643                   out 43, al
    5. :0001.0106 B000                   mov al, 00
    6. :0001.0108 E642                   out 42, al
    7. :0001.010A B00A                   mov al, 0A
    8. :0001.010C E642                   out 42, al
    9. :0001.010E E461                   in al, 61
    10. :0001.0110 50                     push ax
    11. :0001.0111 0C03                   or al, 03
    12. :0001.0113 E661                   out 61, al
    13. :0001.0115 B90400                 mov cx, 0004
    14. :0001.0118 E2FE                   loop 0118
    15. :0001.011A 58                     pop ax
    16. :0001.011B E661                   out 61, al
    17. :0001.011D 59                     pop cx
    18. :0001.011E 58                     pop ax
    19. :0001.011F B8004C                 mov ax, 4C00
    20. :0001.0122 CD21                   int 21




    Заранее спасибо!
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    IPKILLER

    для чего нужна каждая строчка машинного кода
    Код (Text):
    1.     push    ax
    2.     push    cx
    3. ;;
    4. ;; программирование микросхемы таймера 8253/8254
    5. ;;
    6. ;; 43h - 8-битный командный регистр управляет способом загрузки в канал
    7. ;;
    8. ;; 0B6h = 10 11 011 0
    9. ;;        -- -- --- -
    10. ;;        |  |   |  |-> тип данных 0 - двоичные
    11. ;;        |  |   -----> номер режима 3 - генератор прямоугольных
    12. ;;        |  |            импульсов
    13. ;;        |  ---------> последовательность передачи
    14. ;;        |               3 - младший потом старший
    15. ;;        ------------> номер программируемого канала - 2
    16. ;;
    17.     mov al, 0B6h
    18.     out 43h, al
    19. ;;
    20. ;; загрузка счетчика: 0A00h - 2560 -> 1193180 / 2560 ~ 466Гц
    21. ;;
    22. ;; можно было так
    23. ;;
    24. ;;  push    bx
    25. ;;  push    dx
    26. ;;  mov dx, 12h
    27. ;;  mov ax, 34DCh   ; DX:AX = 1193180
    28. ;;  mov bx, 466
    29. ;;  div bx
    30. ;;  pop bx
    31. ;;  pop bx
    32. ;;  out 42h, al
    33. ;;  mov al, ah
    34. ;;  out 42h, al
    35. ;;
    36.     mov al, 00h
    37.     out 42h, al
    38.     mov al, 0Ah
    39.     out 42h, al
    40. ;;
    41. ;; получить и сохранить текущее значение 61h порта
    42. ;; порт 61h - Programmable Peripheral Interface chip "Port B"
    43. ;;
    44.     in  al, 61h
    45.     push    ax
    46. ;;
    47. ;; 3h - xxxxxx 1 1
    48. ;;             - -
    49. ;;             | +-> 1 - разрешить 2-ому каналу управлять
    50. ;;             + --> 1 - включить динамик
    51. ;;
    52.     or  al, 03h
    53.     out 61h, al
    54. ;;
    55. ;; выждать паузу
    56. ;;
    57. ;; длительность паузы, организованной таким образом, зависит от
    58. ;; производительности процессора, если нужна пауза с точностью
    59. ;; до 5 мс, то можно следить за изменением слова по адресу 0000:046Ch
    60. ;;
    61.     mov cx, 0004
    62. l1: loop    l1
    63.  
    64. ;;
    65. ;; восстановить оригинальное значение в "Port B",
    66. ;; обычно обнуляются нулевой и первый биты
    67. ;;
    68.     pop ax
    69.     out 61h, al
    70.  
    71.     pop cx
    72.     pop ax
    73.  
    74.     mov ax, 4C00h   ;; AH = 4Ch - завершить выполнение программы
    75.                 ;; AL = 00h - код завершения (errorlevel)
    76.     int 21h     ;; вызов диспетчера функций dos




    Почему E2FE - это loop 0118. E2 - это loop, а как получается 0118?

    Читай описание системы команд.

    FE (-2) - это смещение относительно адреса команды следующей за loop, 11Ah - 2 = 118h.
     
  3. IPKILLER

    IPKILLER New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2004
    Сообщения:
    9
    Большое спасибо!