汇编语句里面的ret 8是什么意思?CALL 的地址为什么和跳过去的不一样?

[复制链接]
查看11 | 回复5 | 2018-6-2 18:02:36 | 显示全部楼层 |阅读模式
如果王爽出32汇编,估计我们就没那么难学了,王爽的讲解真的是通俗易懂.给子例程传参数有用寄存器传递的,和堆栈传递的我给你说下ret8 的动作顺序 吧首先
弹出偏移地址(ret)然后
esp+8
(8) 为什么后面要有个8呢?因为调用子例程的时候压进了2个32位的参数(传递给子例程的参数),也就是8个字节,如果是压进1个参数那就是ret4了,所以子例程结束返回的时候esp+8是让栈指针回到没压进参数的时候的值。。这个叫做子例程负责清理堆栈,,C是调用者负责清理 看例子:
push eax
...
回复

使用道具 举报

千问 | 2018-6-2 18:02:36 | 显示全部楼层
呵呵 为你正确解答:1汇编语句里面的ret 8 是什么意思?ret 8;为段内带立即数返回指令, 其中8 为指令 ret携带的立即数 。执行时,(IP)<----((SP)+1,(SP))
(SP)<----(SP)+2
(SP)<----(SP) + 8 作用: 在子程序返回时,从堆栈将...
回复

使用道具 举报

千问 | 2018-6-2 18:02:36 | 显示全部楼层
汇编语句里面的ret 8是什么意思?还有 ret不是弹出栈 pop eip吗? 8是什么意思?答:子程序的运行,有时需要一些数据。那么,在调用之前,可以把这些数据压入堆栈,供子程序取用。子程序返回后,为了保证堆栈的平衡,应该再弹出这些数据。但是,这些数据,在主程序里面,如果没有用处,弹出,就是不必要的操作。那么,可以直接修改堆...
回复

使用道具 举报

千问 | 2018-6-2 18:02:36 | 显示全部楼层
如果,“CALL 01200000”为“E800002001”,那么01200000是相对偏移值,这个近跳转不算“近”啊!ret 8,返回调用处,并弹出栈顶8个字节!同一助记符不一定有相同的机器操作码,这与许多因素有关!提问时应提供尽量多的信息,例如,同时提供机器码及寄存器状态是个好习惯。另外在提问前,可以先参看下相关的文档,如《Intel&...
回复

使用道具 举报

千问 | 2018-6-2 18:02:36 | 显示全部楼层
计算机自己算的。 由你指定标号,例如JMP loop 只要知道标号就好了。。然后计算机计算出标号距离跳转位置的偏移地址。RET 8
看楼上做而论道的吧、不必给我满意。。不过有什么不懂可以HI我、...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行