彙編語言(王爽第三版)檢測點13

(1)在上面內容中,我們用7cH中斷例程實現loop功能,則上面的7cH中斷例程所能進行的最大轉移位移是多少?

答案:題目描述個人感覺有二義性,因此從loop實現角度和位移值bx變量兩方面來討論

       如果從loop的指令角度上看,loop是段內短轉移,它的範圍是-128~127,也就是說最大轉移位移是128.

       如果從bx變量來說,bx存儲二進制補碼數據的表示範圍。對於16位來說它表示的範圍是-32768~32767。

       我們知道在內存中是按照計算機補碼方式存儲的,最小的負數(也就是絕對值最大的數)是8000H也就是-32768,那麼它最大的轉移位移是32768。

(2)用7ch中斷例程完成jmp near ptr s指令功能,用bx向中斷例程傳送轉移位移。

應用舉例:在屏幕的第12行,顯示data段中以0結尾的字符串。

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
		  mov al, [si]
		  mov es:[di], al
		  mov ah, 2
		  mov es:[di + 1], ah
		  inc si
		  add di, 2
		  mov bx, offset s - offset ok
		  int 7ch
	   ok:mov ax, 4c00h
		  int 21h

code ends
end start

根據題目要求,7ch的處理程序如下:

     lp:push bp
        mov bp, sp
	add [bp+2], bx
	pop bp
	iret
   lpend:nop  

源碼如下:

assume cs:code
data segment
	db 'conversation', 0
data ends
code segment
	start:mov ax, cs
		  mov ds, ax
		  mov si, offset lp
		  
		  mov ax, 0
		  mov es, ax
		  mov di, 200h
		  mov cx, offset lpend - offset lp
		  
		  cld			;傳輸方向爲正
		  rep movsb		;字節傳輸
		  
		  ;設置7ch到中斷向量表
		  mov ax, 0
		  mov es, ax
		  mov word ptr es:[7ch*4], 200h
		  mov word ptr es:[7ch*4 + 2], 0
		  
		  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
		  mov al, [si]
		  mov es:[di], al
		  mov ah, 2    ;這裏是爲了便於觀察程序執行結果
		  mov es:[di + 1], ah
		  inc si
		  add di, 2
		  mov bx, offset s - offset ok
		  int 7ch
	   ok:mov ax, 4c00h
		  int 21h

	   lp:push bp
		  mov bp, sp
		  add [bp+2], bx
		  pop bp
		  iret
    lpend:nop  
code ends
end start

程序運行如下:

題目主要考察對於比較指令cmp的理解使用和對段內近轉移jmp near ptr s指令的掌握情況

 

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