Здравствуйте! Не могли бы вы объяснить как работает программа, которая расположена ниже. Понятно, что она заставляет пикнуть спикер, но мне нужно подробно знать для чего нужна каждая строчка машинного кода. И ещё один вопросик. Почему E2FE - это loop 0118. E2 - это loop, а как получается 0118? Код (Text): :0001.0100 50 push ax :0001.0101 51 push cx :0001.0102 B0B6 mov al, B6 :0001.0104 E643 out 43, al :0001.0106 B000 mov al, 00 :0001.0108 E642 out 42, al :0001.010A B00A mov al, 0A :0001.010C E642 out 42, al :0001.010E E461 in al, 61 :0001.0110 50 push ax :0001.0111 0C03 or al, 03 :0001.0113 E661 out 61, al :0001.0115 B90400 mov cx, 0004 :0001.0118 E2FE loop 0118 :0001.011A 58 pop ax :0001.011B E661 out 61, al :0001.011D 59 pop cx :0001.011E 58 pop ax :0001.011F B8004C mov ax, 4C00 :0001.0122 CD21 int 21 Заранее спасибо!
IPKILLER для чего нужна каждая строчка машинного кода Код (Text): push ax push cx ;; ;; программирование микросхемы таймера 8253/8254 ;; ;; 43h - 8-битный командный регистр управляет способом загрузки в канал ;; ;; 0B6h = 10 11 011 0 ;; -- -- --- - ;; | | | |-> тип данных 0 - двоичные ;; | | -----> номер режима 3 - генератор прямоугольных ;; | | импульсов ;; | ---------> последовательность передачи ;; | 3 - младший потом старший ;; ------------> номер программируемого канала - 2 ;; mov al, 0B6h out 43h, al ;; ;; загрузка счетчика: 0A00h - 2560 -> 1193180 / 2560 ~ 466Гц ;; ;; можно было так ;; ;; push bx ;; push dx ;; mov dx, 12h ;; mov ax, 34DCh ; DX:AX = 1193180 ;; mov bx, 466 ;; div bx ;; pop bx ;; pop bx ;; out 42h, al ;; mov al, ah ;; out 42h, al ;; mov al, 00h out 42h, al mov al, 0Ah out 42h, al ;; ;; получить и сохранить текущее значение 61h порта ;; порт 61h - Programmable Peripheral Interface chip "Port B" ;; in al, 61h push ax ;; ;; 3h - xxxxxx 1 1 ;; - - ;; | +-> 1 - разрешить 2-ому каналу управлять ;; + --> 1 - включить динамик ;; or al, 03h out 61h, al ;; ;; выждать паузу ;; ;; длительность паузы, организованной таким образом, зависит от ;; производительности процессора, если нужна пауза с точностью ;; до 5 мс, то можно следить за изменением слова по адресу 0000:046Ch ;; mov cx, 0004 l1: loop l1 ;; ;; восстановить оригинальное значение в "Port B", ;; обычно обнуляются нулевой и первый биты ;; pop ax out 61h, al pop cx pop ax mov ax, 4C00h ;; AH = 4Ch - завершить выполнение программы ;; AL = 00h - код завершения (errorlevel) int 21h ;; вызов диспетчера функций dos Почему E2FE - это loop 0118. E2 - это loop, а как получается 0118? Читай описание системы команд. FE (-2) - это смещение относительно адреса команды следующей за loop, 11Ah - 2 = 118h.