[Chapter 13] - [检测点13.1]

(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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值