實驗13 編寫、應用中斷例程(續)

(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號子程序重置光標,然後再例程中顯示出來(再次制定了行和列),因此個人感覺,題目還是想考察讀者對於本章中斷的使用,不過兩種都能想到使用,知識面才能拓展更寬!

 

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