汇编语言call与ret

本文详细探讨call指令的入栈过程,包括call+标号、callfarptr+标号、call+寄存器和内存地址的情况,并对比其与jmp指令的相似性和区别。同时,讲解ret和retf指令的栈操作和转移机制,突出它们在近/远转移中的作用。
摘要由CSDN通过智能技术生成

call与ret

 

ax=6 (因为只跳了一次)

1、call + 标号

这个指令是先将call + 标号的下一条语句的IP放入栈中,然后使当前的IP+16位位移

看到上面的解释会让你想到什么?会想到jmp指令吧,jmp有个指令格式是:jmp near ptr 标号,这里的call唯一这种jmp多的一步就是多了一次入栈操作;

 

ax=1000+9*2 (跳了两次)

2、call far ptr + 标号

这个指令是先将call指令的下一个指令的代码段地址入栈,再把call下一条指令的偏移地址入栈,然后使其跳到标号所在处

这又会让你想到什么?还是jmp指令,jmp指令的: jmp far ptr 标号, 这种jmp的使用是在段间转移的,这种call和jmp的区别就是多了两次入栈的操作;

 

3、call + 16位寄存器

这个指令先将call的下一条指令的IP入栈,然后再以ax为IP的代码处

这还是会想到jmp指令:jmp + 16位寄存器,这里的call唯一比jmp多的一步就是多了一步入栈操作;


 

再来:

 

4、call word ptr + 内存单元地址(sp的值因为是一个字也就是两个字节所以应该减2)

这个指令的是先将call指令的下一条指令的IP入栈,然后跳到以内存单元地址为IP的代码处

这里同样还是会联想到jmp指令的:jmp word ptr + 内存单元地址,这里的call比jmp多的一步同样是入栈的操作;

5、call dword ptr + 内存单元地址(sp的值因为是2个字也就是4个字节所以应该减4)

这个指令先将call指令的下一条指令的CS入栈,再将call指令的下一条指令的IP入栈,然后跳到以内存单元的高位为CS,低位为IP的代码处

这里还是会想到jmp指令:jmp dword ptr + 内存单元地址,这里的call和jmp的区别还是多了入栈的操作


 

综上所述:

call指令:

第一步:先将call指令的下一条指令的CS和IP入栈(当然如果是段间转移就要将CS和IP入栈,如果是段内转移就只要将IP入栈)

第二步:就是操作与call对应的jmp指令

所有的call指令都是可以用上面的两步来确定的,这是个通用的法则。



 

ret和retf

ret指令用栈中的数据,修改IP的内容,从而实现近转移;

retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。

CPU执行ret指令时,进行下面的两步操作:

(1)(IP) = ((ss)*16 +(sp))



(2)(sp) = (sp)+2

CPU执行retf指令时,进行下面四步操作:

(1)(IP) = ((ss)*16) + (sp)



(2)(sp) = (sp) + 2



(3)(CS) = ((ss)*16) + (sp)



(4)(sp) = (sp) + 2


 

用汇编语法来解释ret和retf指令,则:

CPU执行ret指令时,相当于进行:

pop IP


 

CPU执行retf指令时,相当于进行:

pop IP



pop CS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值