(1)編寫並安裝int 7ch中斷例程,功能爲顯示一個用0結尾的字符串,中斷例程安裝在0:200處。
參數: (dh)=行號, (dl)=列號, (cl)=顏色 ds:si指向字符串首地址
以上中斷例程安裝好後,對下面的程序進行單步跟蹤,尤其注意int,iret指令執行前後cs,ip的和棧中的狀態。
assume cs:code
data segment
db 'Welcome to masm!', 0
data ends
code segment
start: mov dh, 10 ;所在行數:11行
mov dl, 10 ;所在列數:11列
mov cl, 2 ;字符屬性
mov ax, data
mov ds, ax
mov si, 0 ;入口參數ds:si指向字符串data
int 7ch ;調用9號子程序,顯示字符串
mov ax, 4c00H
int 21H
code ends
end start
根據題目要求,在學習本章內容之前,如第十章中實驗做法一樣,我們可以使用B8000H~BFFFFH這段空間來放置需要顯示的字符串,除此之外,也可以使用本章的中斷處理程序:21H號中斷的9號子程序來顯示字符串
首選我們使用本章學習的新內容來完成題目;
裝載程序代碼如下:
assume cs:code
data segment
db "welcome to masm!", 0
data ends
code segment
start:mov ax, cs
mov ds, ax
mov si, offset show
mov ax, 0
mov es, ax
mov di, 200h
mov cx, offset showend - offset show
cld ;傳輸方向爲正
rep movsb
;設置中斷向量表,使7cH條目中斷向量指向0000:200H
mov ax, 0
mov es, ax
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0h
mov dh, 10 ;行
mov dl, 10 ;列
mov cl, 2 ;顏色
mov ax, data
mov ds, ax
mov si, 0
int 7ch
mov ax, 4c00h
int 21h
mov ax, 4c00h
int 21h
code ends
end start
安裝例程7ch, 入口參數:dh-行數、dl-列數、cl-字符屬性:
show: push ax
push bx
push cx
push dx
push si
mov ch, 0
push cx
s1: mov ah, 2 ;置光標
mov bh, 0
int 10h
mov ah, 9
mov al, cl
mov cl, [si]
mov ch, 0h
jcxz ok
mov al, cl
pop cx
mov bl, cl
mov bh, 0
push cx
mov cx, 1
int 10h
inc si
inc dl
jmp short s1
ok: pop si
pop dx
pop cx
pop bx
pop ax
iret
mov ax, 4c00h
int 21h
showend:nop
程序執行結果:
現在我們使用直接操縱顯示緩衝區的方時來實現一次,裝載程序不變,只修改安裝例程,代碼如下:
assume cs:code
data segment
db "welcome to masm!", 0
data ends
code segment
start:mov ax, cs
mov ds, ax
mov si, offset show
mov ax, 0
mov es, ax
mov di, 200h
mov cx, offset showend - offset show
cld
rep movsb
mov ax, 0
mov es, ax
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0h
mov dh, 10 ;行
mov dl, 10 ;列
mov cl, 2 ;顏色
mov ax, data
mov ds, ax
mov si, 0
int 7ch
mov ax, 4c00h
int 21h
show: push ax
push bx
push cx
push dx
push si
push di
mov ah, 2 ;置光標
mov bh, 0
int 10h
mov dl, 02h
mov ax, 0b800h
mov es, ax
mov di, 10*160+10*2 ;每個字符佔兩個字節(低字節存放數值,高字節存放字符屬性值)
s1: mov ch, 0
mov cl, [si]
jcxz ok
mov es:[di], cl
mov es:[di+1], dl
inc si
add di, 2
jmp short s1
ok: pop di
pop si
pop dx
pop cx
pop bx
pop ax
iret
mov ax, 4c00h
int 21h
showend:nop
code ends
end start
執行結果爲:
第二種做法中首選使用10h中斷處理程序中的2號子程序重置光標,然後再例程中顯示出來(再次制定了行和列),因此個人感覺,題目還是想考察讀者對於本章中斷的使用,不過兩種都能想到使用,知識面才能拓展更寬!