· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Как работает программа

Посл.отвђт Сообщен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