汇编语言检测点13.1详细解析
建议先自己思考问题的答案,不懂则返回看书
7ch中断例程如下:
;bx表示两标号之间的转移位移
lp: push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret:
pop bp
iret
1、在上面的内容中,用7ch中断例程实现loop的功能,则上面的7ch中断例程所能进行的最大转移位移是多少?
此题存在几个困惑的点,仁者见仁,智者见智,以下仅为我自己的观点看法,敬请指正。
首先,在上面的例程中,模拟实现的是loop功能。此外,只有 add [bp+2],bx 指令可以进行 ‘较大’ 位移,更细点来看,只有 bx 的值可以改变位移,具体分析如下:
(1)、 此中断例程实现的是 loop 功能,而 loop 是短转移指令,范围为 [-128,+127], 所以从这个角度来看,最大转移位移是128.
(2)、 从bx 的角度来看,若视bx为有符号数,则bx的范围为 [-32768,+32767] , 此时最大转移为 32768 ;若视bx为无符号数,则bx的范围为 [0,65535], 此时最大转移为 65535 .
当然针对上述疑问,在DOSBox中测试几组数据便可得知。而显示结果是此例程的转移位移是 65535 。当然这只是我的结论,每个人都有自己的见解,仁者见仁智者见智。
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,cs
mov ds,ax
mov si,offset cst
mov ax,0
mov es,ax
mov di,200h
mov cx,offset ce - offset cst
cld
rep movsb
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+35*2
s:
cmp byte ptr [si],0
je ok
mov al,ds:[si]
mov es:[di],al
inc si
add di,2
mov bx,offset s - offset ok
int 7ch
ok:
mov ax,4c00h
int 21h
cst:
push bp
mov bp,sp
add [bp+2],bx
pop bp
iret
ce: nop
code ends
end start
此代码在DOSBox下的运行结果截图: