int指令理解

以下是王爽老师的《汇编语言》中第十五章中的一段程序代码,其功能是增加9号中断的功能,当按下Esc键时屏幕中显示的字母改变颜色

assume cs:codesg,ss:stack,ds:data

data segment

dw 0,0 

data ends

stack segment

db 128 dup(0)

stack ends

codesg segment

start:

mov ax,data

mov ds,ax

mov ax,stack

mov ss,ax

mov sp,128

mov ax,0

mov es,ax

push es:[9*4]

pop ds:[0]

push es:[9*4 + 2]

pop ds:[2]

mov word ptr es:[9*4],offset int9

mov word ptr es:[9*4 + 2],cs

mov ax,0b800h

mov es,ax

mov ah,11000001b

mov dl,'a'

s:

mov byte ptr es:[160*12+40*2],dl

call delay

inc dl

cmp dl,'z'

jna s

mov ax,0

mov es,ax

push ds:[0]

pop es:[9*4]

push ds:[2]

pop es:[9*4+2]

        mov ax,4c00h

        int 21h

delay:

push ax

push dx

mov ax,0

mov dx,2000h

s1:

sub ax,1

sbb dx,0

cmp ax,0

jne s1

cmp dx,0

jne s1

pop dx

pop ax

ret

int9:

push ax

push bx

push es

 

in al,60h

pushf

pushf

pop bx

and bh,11111100b

push bx

popf

call dword ptr ds:[0]

 

cmp al,1

jne int9ret

mov ax,0b800h

mov es,ax

inc  byte ptr es:[160*12+40*2+1]

int9ret:

pop es

pop bx

pop ax

iret

codesg ends

end start

1.其中红色代码处最后出有条iret指令,而代码中并没有pushf,push ip,push cs指令,难道代码错了,可是编译执行后,程序并没有错

那么代码是正确的。

看下程序框架,红色代码段是改写的BIOS中的9号中断,9号中断执行的过程是,当键盘被敲击是,处理键盘的芯片就产生键盘扫描码,扫描码被送入60h端口,引发9号中断,cpu执行int 9中断例程处理键盘输入。

所以程序实际是先执行了int 9指令,再从标号int9:出执行,也就是与int 9与iret成对配套了。

int中断执行过程如下

1)取中断类型码n

2)pushf,IF=0,TF=0

3)push IP,push CS

4)(IP)=(n*4),(CS)=(n*4+2)

2.也就很容易理解

pushf

pushf

pop bx

and bh,11111100b

push bx

popf

call dword ptr ds:[0]

与BIOS中的int 9号中断例程中的iret配套了 

原文地址:https://www.cnblogs.com/johnnyflute/p/3764408.html