(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指令的掌握情況