汇编 段内转移和段间转移

a.段内直接转移

具体格式:CALL 过程名。此时CS不入栈,IP的内栈入栈,入栈后再将加上目的地址与CALL指令的下一条指令的偏移地址之差值就可以转移到目的地址,详细过程:

    SP-2=>SP;将堆栈指针SP减2
    (SP)<=IP;将IP进栈
    IP+偏移地址之差;转到目的地址

 b.段内间接转移

具体格式:CALL OPRD,那么在这里OPRD可以寄存器或内存单元,它的具体实现过程:

    SP-2=>SP;将堆栈指针SP减2
    (SP)<=IP;将IP进栈
    IP<=(OPRD);转到目的地址
    同a一样,CS不入栈

 c.段间直接转移

具体格式:CALL [FAR] 过程名 ,此时CS,IP均要入栈,详细的实现过程:

    SP-2=>SP;将堆栈指针减2
    (SP)<=CS;将CS入栈
    SP-2=>SP;将堆栈指针再减2
    (SP)<=IP;将IP入栈
    ;装入新的CS,IP
    IP<=过程入口的偏移地址
    CS<=过程入口的段地址

d.段间间接转移

具体格式:CALL [FAR] OPRD ,此时CS,IP均要入栈,OPRD是32位,你知道在8086中没有32位寄存器。因此,这里的OPRD一定是存储单元,高16位是CS的值,低16位是IP值,详细的实现过程:

    SP-2=>SP;将堆栈指针减2
    (SP)<=CS;将CS入栈
    SP-2=>SP;将堆栈指针再减2
    (SP)<=IP;将IP入栈
    ;装入新的CS,IP
    IP<=(OPRD+2,OPRD+3)
    CS<=(OPRD,OPRD1)
 e.段内返回
    格式:RET。实际上它的实现过程:
    (SP)=>IP;从当前栈顶弹出一个字,将它送给IP指令计数器
    SP+2=>SP;SP
 f.段间返回
    格式:RETF,实际上它的实现过程:
    (SP)=>IP;IP出栈
    SP+2=>SP;
    (SP)=>CS;CS出栈

    SP+2=>SP;


补充:

int 调用中断返回
iref 弹出 3个参数,一个给 ip,一个 给 cs ,一个 个 flag标志位

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值