sseg SEGMENT STACK
db 64 dup (?)
sseg ENDS
dseg SEGMENT PARA PUBLIC 'DATA'
ipsave dw 0h
cssave dw 0h
msg db '.$'
dseg ENDS
cseg SEGMENT
main proc FAR
ASSUME cs:cseg,ds:dseg,ss:sseg
start:
push ds
mov ax, 0h
push ax
; Init Data segment
mov ax, dseg
mov ds, ax
; Get native handler
mov ah, 35h
; INT type: step-by-step trace
mov al, 1h
int 21h
mov ipsave, bx
mov ax, es
mov cssave, ax
push ds
mov dx, offset int_trace
mov ax, seg int_trace
mov ds, ax
; Set our handler
mov ah, 25h
mov al, 1h
int 21h
pop ds
mov dx, 0h
mov cx, 0Fh
; Push flags register
pushf
pop ax
; Set T-bit
or ax, 0100h
push ax
popf
loop_inc:
inc bx
loop loop_inc
; Reset T-bit
pushf
pop ax
and ax, 0FEFFh
push ax
popf
push ds
mov dx, ipsave
mov ax, cssave
mov ds, ax
; Restore native handler
mov ah, 25h
mov al, 1h
int 21h
pop ds
ret
main ENDP
int_trace proc FAR
push ax
push dx
lea dx, msg
; Display message
mov ah, 9h
int 21h
pop dx
pop ax
iret
int_trace ENDP
cseg ENDS
END start
Результаты выполнения программы:
Программа 6. Реализует реализующая возможность трассировки фрагмента кода с помощью прерывания int 1, при этом сброс T-бита происходит в обработчике прерывания.
itrace2.asm
sseg SEGMENT STACK
db 64 dup (?)
sseg ENDS
dseg SEGMENT PARA PUBLIC 'DATA'
ipsave dw 0h
cssave dw 0h
msg db '-$'
dseg ENDS
cseg SEGMENT
main proc FAR
ASSUME cs:cseg,ds:dseg,ss:sseg
start:
push ds
mov ax, 0h
push ax
; Init Data segment
mov ax, dseg
mov ds, ax
; Get native handler
mov ah, 35h
; INT type: step-by-step trace
mov al, 1h
int 21h
mov ipsave, bx
mov ax, es
mov cssave, ax
push ds
mov dx, offset int_trace
mov ax, seg int_trace
mov ds, ax
; Set our handler
mov ah, 25h
mov al, 1h
int 21h
pop ds
mov dx, 0h
mov cx, 0Fh
; Push flags register
pushf
pop ax
; Set T-bit
or ax, 0100h
push ax
popf
loop_inc:
inc bx
loop loop_inc
push ds
mov dx, ipsave
mov ax, cssave
mov ds, ax
; Restore native handler
mov ah, 25h
mov al, 1h
int 21h
pop ds
ret
main ENDP
int_trace proc FAR
push ax
push dx
push bp
lea dx, msg
; Display message
mov ah, 9h
int 21h
cmp cx,0h
jne not_end
; Reset T-bit
mov bp,sp
and [bp+10], 0FEFFh
not_end:
pop bp
pop dx
pop ax
iret
int_trace ENDP
cseg ENDS
END start
Результаты выполнения программы:
Программа 7. Реализует трассировку кода в рамках области, задаваемой точками останова, устанавливаемыми с помощью прерывания int 3. Во время трассировки выводятся адреса выполняемых команд.
itrace3.asm
sseg SEGMENT STACK
db 64 dup (?)
sseg ENDS
dseg SEGMENT PARA PUBLIC 'DATA'
ipsave_1 dw 0h
cssave_1 dw 0h
ipsave_3 dw 0h
cssave_3 dw 0h
msg1 db 'Choose program branch (1|2): $'
msg2 db 0Ah,'instruction #: '
inum db '00000$'
dseg ENDS
cseg SEGMENT
main proc FAR
ASSUME cs:cseg, ds:dseg, ss:sseg
start: push ds
mov ax, 0h
push ax
; Init Data segment
mov ax, dseg
mov ds, ax
; Get INT1 handler adress
mov ah, 35h
mov al, 1h
int 21h
mov ipsave_1, bx
mov ax, es
mov cssave_1, ax
; Get INT3 handler adress
mov ah, 35h
mov al, 3h
int 21h
mov ipsave_3, bx
mov ax, es
mov cssave_3, ax
push ds
mov dx, offset new_handler_1
mov ax, seg new_handler_1
mov ds, ax
; Set our INT1 handler
mov ah, 25h
mov al, 1h
int 21h
pop ds
push ds
mov dx, offset new_handler_3
mov ax, seg new_handler_3
mov ds, ax
; Set our INT3 handler
mov ah, 25h
mov al, 3h
int 21h
pop ds
; Display message
mov dx,offset msg1
mov ah,9h
int 21h
klav_wait:
; Klav input
mov ah,8h
int 21h
cmp al,'1'
je branch_1
cmp al,'2'
je branch_2
jne klav_wait
branch_1:
mov cx,2h
jmp start_trace
branch_2:
mov cx,3h
start_trace:
; Stop point - INT3
int 3h
traced_block:
inc bx
loop traced_block
; Stop point #2 - INT3
int 3h
; Restore int handlers
push ds
mov dx, ipsave_1
mov ax, cssave_1
mov ds, ax
mov ah, 25h
mov al, 1h
int 21h
pop ds
push ds
mov dx, ipsave_3
mov ax, cssave_3
mov ds, ax
mov ah, 25h
mov al, 3h
int 21h
pop ds
ret
main ENDP
new_handler_1 proc FAR
push ax
push dx
push bp
; Get ip
mov bp, sp
mov ax,word ptr ss:[bp+6]
; Convert to ASCII
mov bx,10000
mov dx,0h
div bx
add ax,30h
mov byte ptr inum,al
mov bx,1000
mov ax,dx
mov dx,0h
div bx
add ax,30h
mov byte ptr inum+1,al
mov bx,100
mov ax,dx
mov dx,0h
div bx
add ax,30h
mov byte ptr inum+2,al
mov bx,10
mov ax,dx
mov dx,0h
div bx
add ax,30h
mov byte ptr inum+3,al
add dx,30h
mov byte ptr inum+4,dl
; Display message
mov dx,offset msg2
mov ah,9h
int 21h
pop bp
pop dx
pop ax
iret
new_handler_1 ENDP
new_handler_3 proc FAR
push ax
push bp
mov bp,sp
mov ax,word ptr ss:[bp+8]
not ax
mov word ptr ss:[bp+8],ax
pop bp
pop ax
iret
new_handler_3 ENDP
cseg ENDS
END start
Результаты выполнения программы:
Выводы
Таким образом, внутренние прерывания позволяют нам отлавливать различные логические ситуации, которые иным образом контролировать не столь удобно. Используя собственные обработчики прерывания, появляеются значительно более гибкие возможности по контролю ошибок, чем при обычном методе программирования. Прерывания, служащие для трассировки, позволяют получить максимум требуемой информации, что делает процесс отладки значительно более удобным и информативным.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.