(1)
书中示例 int 7ch 虽然模仿了loop功能,但是:
- loop是有条件转移,位移范围是8位,即短转移jmp short s
- int 7ch是通过对栈中的IP进行修改(位移)完成跳转,使用了bx作为位移数,而bx是16位,所以它在功能上可实现16位跳转(与jmp near ptr等效)。也就是说,在功能上int 7ch的16位跳转能力(范围)超过了loop的8位跳转
- 这里需要注意,bx的值由 offset s-offset se 得到,故bx的值不会超过偏移地址的范围[0,FFFF],考虑到bx中存储的是有符号数,bx的范围介于[-32768,32767]
但将 int 7ch 作为loop使用时,仍然只能进行8位转移,否则就不能完全模仿loop功能,但这种8位转移只是我们人为限制(也就是让bx的值介于[-128,127]),它本身拥有16位转移的能力,这一点要意识到。
模仿jmp near ptr s时,因为不涉及到对cx的操作,所以去掉 dec cx 及 jcxz lpret 这两句即可
(2)
;检测点11.3
;int 7ch的安装程序
assume cs:code
data segment
db 'conversation',0
data ends
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset jnear
mov ax,0
mov es,ax
mov di,200h
mov cx,offset jnear_end-offset jnear
cld
rep movsb
;设置中断向量表
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
;int 7ch的应用程序(测试代码),需要先安装完中断例程后,才能测试
mov ax,data
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov di,11*160
mov bx,offset s-offset se;位移
s: mov al,[si]
cmp al,0
je se
mov es:[di],al
inc si
add di,2
;jmp near ptr s
int 7ch
se: nop
mov ax,4c00h
int 21h
;int 7ch自身
jnear:
push bp
mov bp,sp
;与cx不再有关系,因为模仿的是jmp near ptr,不再是loop
;bx是16bit,能实现 IP+16位 的位移
add [bp+2],bx
pop bp
iret
jnear_end:nop
code ends
end start