Skip to content
This repository was archived by the owner on Jun 27, 2020. It is now read-only.
wcdbmv edited this page Sep 19, 2019 · 4 revisions

Лабораторная работа 1. Дизассемблирование INT 8h

>DEBUG
-D 0000:0020 L 4
0000:0020  46 07 0A 02
-Q

Листинг INT 8h

;; Вызов процедуры sub_1
020A:0746  E8 0070				call	sub_1			; (07B9)

;; Сохранение регистров ES, DS, AX, DX
020A:0749  06					push	es
020A:074A  1E					push	ds
020A:074B  50					push	ax
020A:074C  52					push	dx

;; Установка сегмента данных
020A:074D  B8 0040				mov	ax,40h
020A:0750  8E D8				mov	ds,ax
020A:0752  33 C0				xor	ax,ax			; Zero register
020A:0754  8E C0				mov	es,ax

;; Инкремент счётчика реального времени по известному адресу в области данных BIOS
;  Инкремент двух младших байтов счётчика реального времени по адресу 0040:006C
020A:0756  FF 06 006C				inc	word ptr ds:[6Ch]	; (0040:006C=0E873h)
020A:075A  75 04				jnz	loc_1			; Jump if not zero
;  Инкремент двух старших байтов счётчика реально времени по адресу 0040:006E
020A:075C  FF 06 006E				inc	word ptr ds:[6Eh]	; (0040:006E=0Ch)

;; Сброс счётчика реального времени при наступлении новых суток
020A:0760			loc_1:
020A:0760  83 3E 006E 18			cmp	word ptr ds:[6Eh],18h	; (0040:006E=0Ch)
020A:0765  75 15				jne	loc_2			; Jump if not equal
020A:0767  81 3E 006C 00B0			cmp	word ptr ds:[6Ch],0B0h	; (0040:006C=0E873h)
020A:076D  75 0D				jne	loc_2			; Jump if not equal
;  Обнуление двух старших байтов счётчика реального времени по адресу 0040:006E
020A:076F  A3 006E				mov	word ptr ds:[6Eh],ax	; (0040:006E=0Ch)
;  Обнуление двух младших байтов счётчика реального времени по адресу 0040:006C
020A:0772  A3 006C				mov	word ptr ds:[6Ch],ax	; (0040:006C=0E873h)
;  Установка флага прошедших суток по адрему 0040:0070
020A:0775  C6 06 0070 01			mov	byte ptr ds:[70h],1	; (0040:0070=0)
020A:077A  0C 08				or	al,8

;; Декремент счётчика времени до отключения моторчика дисковода по известному адресу в области данных BIOS
020A:077C			loc_2:
020A:077C  50					push	ax
020A:077D  FE 0E 0040				dec	byte ptr ds:[40h]	; (0040:0040=2Bh)
020A:0781  75 0B				jnz	loc_3			; Jump if not zero
;  Установка флага отключения моторчика дисковода
020A:0783  80 26 003F F0			and	byte ptr ds:[3Fh],0F0h	; (0040:003F=0)
;  Посылание команды отключения OCh в порт дисковода 3F2h
020A:0788  B0 0C				mov	al,0Ch
020A:078A  BA 03F2				mov	dx,3F2h
020A:078D  EE					out	dx,al			; port 3F2h, dsk0 contrl output

;; Вызов прерывания 1Ch
020A:078E			loc_3:
020A:078E  58					pop	ax
;  Установлен ли флаг разрешения прерываний IF?
020A:078F  F7 06 0314 0004			test	word ptr ds:[314h],4	; (0040:0314=3200h)
020A:0795  75 0C				jnz	loc_4			; Jump if not zero
;  Косвенный вызов прерывания 1Ch
020A:0797  9F					lahf				; Load ah from flags
020A:0798  86 E0				xchg	ah,al
020A:079A  50					push	ax
020A:079B  26: FF 1E 0070			call	dword ptr es:[70h]	; (0000:0070=6ADh)
020A:07A0  EB 03				jmp	short loc_5		; (07A5)
020A:07A2  90					nop
;  Вызов прерывания 1Сh
020A:07A3			loc_4:
020A:07A3  CD 1C				int	1Ch			; Timer break (call each 18.2ms)

;; Вызов процедуры sub_1
020A:07A5			loc_5:
020A:07A5  E8 0011				call	sub_1			; (07B9)

;; Сброс контроллера прерываний записью 20h в порт 20h
020A:07A8  B0 20				mov	al,20h			; ' '
020A:07AA  E6 20				out	20h,al			; port 20h, 8259-1 int command
										;  al = 20h, end of interrupt

;; Восстановление регистров DX, AX, DS, ES
020A:07AC  5A					pop	dx
020A:07AD  58					pop	ax
020A:07AE  1F					pop	ds
020A:07AF  07					pop	es

;; Завершение обработчика прерывания 8h
020A:07B0  E9 FE99				jmp	$-164h			; (07B0-164=064C)

020A:064C  1E					push	ds
020A:064D  50					push	ax
; ... 
020A:06AA  58					pop	ax
020A:06AB  1F					pop	ds
020A:06AC  CF					iret				; Interrupt return

Листинг подпрограммы sub_1

				sub_1		proc	near

;; Сохранение регистров DS, AX
020A:07B9  1E					push	ds
020A:07BA  50					push	ax

;; Установка сегмента данных = 0040
020A:07BB  B8 0040				mov	ax,40h
020A:07BE  8E D8				mov	ds,ax

; Загрузка EFLAGS в AH
020A:07C0  9F					lahf				 ; Load ah from flags
;; 
020A:07C1  F7 06 0314 2400			test	word ptr ds:[314h],2400h ; (0040:0314=3200h)
020A:07C7  75 0C				jnz	loc_7			 ; Jump if not zero
020A:07C9  F0> 81 26 0314 FDFF	           lock	and	word ptr ds:[314h],0FDFFh; (0040:0314=3200h)
020A:07D0			loc_6:
020A:07D0  9E					sahf				; Store ah into flags
020A:07D1  58					pop	ax
020A:07D2  1F					pop	ds
020A:07D3  EB 03				jmp	short loc_8		; (07D8)
020A:07D5			loc_7:
020A:07D5  FA					cli				; Disable interrupts
020A:07D6  EB F8				jmp	short loc_6		; (07D0)
020A:07D8			loc_8:
020A:07D8  C3					retn
				sub_1		endp

Clone this wiki locally