|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 18, 2004 00:48:28 · Поправил: Безпощадный даос Здравствуйте! Не могли бы вы объяснить как работает программа, которая расположена ниже. Понятно, что она заставляет пикнуть спикер, но мне нужно подробно знать для чего нужна каждая строчка машинного кода. И ещё один вопросик. Почему E2FE - это loop 0118. E2 - это loop, а как получается 0118? :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 Заранее спасибо! |
|
|
Дата: Сен 18, 2004 08:03:23 · Поправил: q_q IPKILLER для чего нужна каждая строчка машинного кода 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. |
|
|
Дата: Сен 19, 2004 14:54:55 Большое спасибо! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.053 |