Изучение принципов обработки внутренних прерываний. Знание внутренних прерываний и флаговой логики процессора, источников возникновения внутренних прерываний, страница 2

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


Результаты выполнения программы:

Выводы

Таким образом, внутренние прерывания позволяют нам отлавливать различные логические ситуации, которые иным образом контролировать не столь удобно. Используя собственные обработчики прерывания, появляеются значительно более гибкие возможности по контролю ошибок, чем при обычном методе программирования. Прерывания, служащие для трассировки, позволяют получить максимум требуемой информации, что делает процесс отладки значительно более удобным и информативным.