實驗13 編寫 應用中斷例程

2021-09-27 11:26:28 字數 3005 閱讀 5838

(2)編寫並安裝int 7ch中斷例程,功能為完成loop指令的功能。

引數:(cx)=迴圈次數,(bx)=位移。

以上中斷例程安裝好後,對下面的程式進行單步跟蹤,尤其注意int,iret指令執行前後cs,ip的和棧中的狀態。

assume cs:code

code segment

start: mov ax, 0b800h

mov es, ax

mov di, 160*12

mov bx, offset s – offset se

mov cx, 80

s: mov byte ptr es:[di], '!'

add di, 2

int 7ch

se: nop

mov ax, 4c00h

int 21h

code ends

end start

程式分析:

為了模擬loop指令, 7ch中斷例程必須具備下面功能

1、dec 程式

2、如果cx≠0,轉到標號s處執行,否則繼續向下執行

轉移到標號s處需要設定cs = 標號s的段位址,ip = 標號s的偏移位址,我們知道,在7ch中斷觸發後,當前的標誌暫存器、cs和ip都要壓棧,此時壓入的cs和ip中的內容分別是呼叫程式的段位址(可以認為是標號s的段位址)和7ch後一條指令的偏移位址(即標號se的偏移位址)

showstr:push bp

mov bp, sp

dec cx

jcxz ok

add [bp + 2], bx

ok:pop bp

iret

showend:nop

此時,棧頂為bp,所以se的偏移位址為ss*16+bp+2,將它加上bx中的轉移位移就標為s的偏移位址,最後用iret出棧返回,cs:ip即從標號s處開始執行指令,如果cx=0,則不需要修改棧中se的偏移位址,直接返回即可。cpu從se處向下執行指令

完成原始碼如下:

assume cs:code

code segment

start:mov ax, cs

mov ds, ax

mov si, offset showstr

mov ax, 0

mov es, ax

mov di, 200h

mov cx, offset showend - offset showstr

cldrep movsb

mov ax, 0

mov es, ax

mov word ptr es:[7ch*4], 200h

mov word ptr es:[7ch*4 + 2], 0

mov ax, 0b800h

mov es, ax

mov di, 160*12

mov bx, offset s - offset se

mov cx, 80

s:mov byte ptr es:[di], '!'

add di, 2

int 7ch

se:nop

showstr:push bp

mov bp, sp

dec cx

jcxz ok

add [bp + 2], bx

ok:pop bp

iret

showend:nop

mov ax, 4c00h

int 21h

code ends

end start

執行結果:

(3)下面的程式,分別在螢幕的第2、4、6、8行顯示4句英文詩,補全程式。

程式原始碼為:

assume cs:code

code segment

s1: db 'good, better, best,','$'

s2: db 'never let it rest,', '$'

s3: db 'till good is better,', '$'

s4: db 'and better, best.', '$'

s: dw offset s1, offset s2, offset s3, offset s4

row: db 2, 4, 6, 8

start:mov ax, cs

mov ds, ax

mov bx, offset s

mov si, offset row ;行數索引

mov cx, 4 ;共需要4行資料

ok:mov bh, 0 ;第0頁

mov dh, [si] ;第幾行

mov dl, 0 ;第幾列

mov ah, 2 ;置游標功能

int 10h ;呼叫10h號中斷處理程式的2號子程式

mov dx, [bx] ;在游標處顯示字串

mov ah, 9 ;呼叫21h號中斷處理程式的9號子程式

int 21h

inc si

add bx, 2 ;dw定義字型資料,增量為2

loop ok

mov ax, 4c00h

int 21h

code ends

end start

程式執行結果:

題目靈活利用標號偏移位址指出各資料段的記憶體位址,其次,每次字串都以$結尾,可利用21h中斷的9號處理程式來完成題目要求

實驗十三 編寫 應用中斷例程 3

下面的程式,分別在螢幕的第2 4 6 8行顯示四句英文詩,補全程式。完成後編譯執行,體會其中的程式設計思想。assume cs code code segment s1 db good,better,beat,s2 db never let it rest,s3 db till good is be...

王爽彙編 實驗13編寫int 7cH中斷例程 1

assume cs codesg codesg segment start mov ax,cs mov ds,ax 程式段位址 mov si,offset div s mov ax,0 mov es,ax mov di,0200h 儲存中斷處理程式的記憶體位址 mov cx,offset div o...

DOS中斷例程應用

程式設計 在螢幕的5行12列顯示字串 wlcome to masm assume cs code data segment db welcome to masm data ends code segment start mov ah,2 呼叫第10號中斷例程的2號子程式,功能為設定游標位置 mov ...