彙編語言(王爽版)學習筆記 第十三章 int指令


中斷信息可以來自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!"

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章