8086汇编语言-奇怪的程序(jmp 跳转)

不多说,直接上程序

程序示例

assume cs:codesg
codesg segment
    mov ax,4c00h
    int 21h
start:
    mov ax,0
s:
    nop
    nop
    
    mov di,offset s
    mov si,offset s2
    mov ax,cs:[si]
    mov cs:[di],ax
    
s0:
    jmp short s

s1:
    mov ax,0
    int 21h
    mov ax,0

s2:
    jmp short s1
    nop

codesg ends
end start
  • 程序执行效果:最终正确return

程序运行分析

需要了解的知识点

  • jmp short xxx最终会被编译成jmp 具体数值,具体数值的范围为[-128,127]
  • nop无意义,占一个字节

我们来看其中一小段

s1:
    mov ax,0
    int 21h
    mov ax,0

s2:
    jmp short s1
    nop

jmp short s1最终被翻译成:EBF6,其中EB表示jmp,F6(此为补码)即为-10,即向前jmp 10个字节地址,也就是代码中的mov ax,0.

而,

    mov ax,4c00h
    int 21h
start:
    mov ax,0
s:
    nop
    nop
    
    mov di,offset s
    mov si,offset s2
    mov ax,cs:[si]
    mov cs:[di],ax
s0:
    jmp short s

mov cs:[di],ax将s2的jmp short s1(也就是EBF6)写入了s开头的两个nop中,而在程序执行到s0中的jmp short s时,将执行插入的EBF6,又跳转到了mov ax,4c00h,然后程序结束.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值