int指令理解

2021-05-21 17:09:42 字數 2055 閱讀 3140

以下是王爽老師的《組合語言》中第十五章中的一段程式**,其功能是增加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

retint9:

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配套了 

int指令(軟體中斷指令)

int 軟體中斷指令 是call指令的一種特殊形式。call指令呼叫呼叫的子程式是使用者程式的一部分,而int指令呼叫的作業系統提供的子程式或者其他特殊的子程式。中斷服務子程式和標準過程的最大區別是 匯程式設計序可以有任意個過程,中斷服務子程式最多有256個過程 int指令共有四中不同的格式 1 i...

170428 彙編 int指令

1625 5 王子昂 總結 2017年4月28日 連續第209天總結 a.組合語言 第十三章 60 在中斷過程中,當前的標誌暫存器,cs和ip都要壓棧,此時壓入的cs和ip的內容分別是呼叫程式的段位址 可以看做是標號s的段位址 和int 後一條指令的偏移位址 即標號send的偏移位址 而用send的...

組合語言 int指令代替 loop指令

問題 使用7ch中斷例程完成loop指令的功能 loop 指令的功能 1 判斷cx值是否為0 2 不是則跳轉到標號s處 應用舉例 在螢幕中間顯示80個 assume codesg codesg segment start mov ax,0b800h mov es,ax mov di,160 12 m...