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