文章目錄
中斷信息可以來自CPU的內部和外部,當CPU內部有需要處理的事情發生的時候,將產生需要馬上處理的中斷信息,引發中斷過程。這一章中,我們講解另一種重要的內中斷,由int指令引發的中斷。
13.1 int指令
int指令的格式爲:int n,n爲中斷類型碼,它的功能是引發中斷過程。
13.2 編寫供應用程序調用的中斷例程
問題1:編寫、安裝中斷7ch的中斷例程
安裝程序如下:
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset sqr ;設置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ;設置es:di指向目的地址
mov cx,offset sqrend - offset sqr ;設置cx爲傳輸長度
cld ;設置傳輸方向爲正
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,4c00h
int 21h
sqr: mul ax
iret
sqrend:nop
code ends
end start
問題二:編寫、安裝中斷7ch的中斷例程。
安裝程序:
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset capital ;設置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ;設置es:di指向目的地址
mov cx,offset capitalend - offset capital ;設置cx爲傳輸長度
cld ;設置傳輸方向爲正
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,4c00h
int 21h
capital: push cx
push si
change: mov cl,[si]
mov ch,0
jcxz ok
and byte ptr [si],11011111b
inc si
jmp short change
ok: pop si
pop cx
iret
capitalend:nop
code ends
end start
在中斷例程capital中用到了寄存器si和cx,編寫中斷例程和編寫子程序的時候具有同樣的問題,就是要避免寄存器的衝突。應該注意例程中用到的寄存器的值的保存和恢復。
13.3 對int、iret和棧的深入理解
問題:用7ch中斷例程完成loop指令的功能
檢測點 13.1
如果從loop的指令角度上看,loop就是個段內短轉移,它的範圍是-128~127,也就是說最大轉移位移是128.
如果從例程中bx變量來說,先搞定bx存儲二進制補碼數據的表示範圍。對於16位來說它表示的範圍是(-32768~32767),最大位移是32768
assume cs:code
data segment
db 'conversation',0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov di,12*160
s: cmp byte ptr [si],0
je ok ;如果是0跳出循環
mov al,[si]
mov es:[di],al
inc si
add di,2
mov bx,offset s-offset ok ;設置從標號ok到標號s的轉移位移
int 7ch ;轉移到標號s處
ok: mov ax,4c00h
int 21h
code ends
end start
assume cs:code
code segment
start: ;7cH中斷例程的安裝程序
mov ax, cs
mov ds, ax
mov si, offset lp ;將ds:si指向源地址(captial的機器碼)
mov ax, 0000H
mov es, ax
mov di, 200H ;將es:di指向目的地址(0:200H向量表中)
mov cx, offset lpend - offset lp ;設置傳輸長度
cld ;傳輸方向爲正
rep movsb ;字節傳輸
;設置中斷向量表,使7cH條目中斷向量指向0000:200H
mov ax, 0000H
mov es, ax
mov word ptr es:[7cH*4], 200H
mov word ptr es:[7cH*4+2], 0000H
mov ax, 4c00H
int 21H
;-------
;裝載的例程:7cH
;功能:int 7cH實現和jmp near ptr s指令相同的功能
;入口參數:bx相對地址偏移量
;返回值:無
;-------
lp: push bp ;將bp這個ss棧的偏址保存
mov bp, sp ;將當前棧頂指針值送入到bp
add [bp+2], bx ;修改ss棧中的從棧頂向下第2個單元的值
lpret: pop bp ;恢復bp值
iret ;返回到調用處。
lpend: nop ;代碼段結尾,便於計算7cH例程的長度。
code ends
end start
13.4 BIOS和DOS所提供的中斷例程
13.5 BIOS和DOS中斷例程的安裝過程
BIOS和DOS提供的中斷例程是如何安裝到內存中的呢?
檢測點 13.2
(1)錯誤。由於FFFF:0處的指令是無法改變的,只讀的。
(2)錯誤。中斷例程19h是主板上的ROM中固化的例程,是由BIOS提供的。不是由DOS提供的。
13.6 BIOS中斷例程應用
編程:在屏幕的5行12列顯示3個紅底高亮閃爍綠色的’a’。
注意,閃爍的效果必須在全屏DOS方式下才能看到。
13.7 DOS中斷例程應用
編程:在屏幕的5行12列顯示字符串"Welcome to masm!"