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