汇编语句里面的ret 8是什么意思?CALL 的地址为什么和跳过去的不一样?
例如CALL01200000而到的地址不是012000000别人说这是偏移。这是怎么算的?还有ret不是弹出栈popeip吗?8是什么意思?...
例如 CALL 01200000 而到的地址不是012000000 别人说这是偏移。这是怎么算的?
还有 ret 不是弹出栈 pop eip吗? 8是什么意思? 展开
还有 ret 不是弹出栈 pop eip吗? 8是什么意思? 展开
8个回答
展开全部
如果王爽出32汇编,估计我们就没那么难学了,王爽的讲解真的是通俗易懂.
给子例程传参数有用寄存器传递的,和堆栈传递的
我给你说下ret 8 的动作顺序 吧
首先 弹出偏移地址 (ret)
然后 esp+8 (8)
为什么后面要有个8呢?因为调用子例程的时候压进了2个32位的参数(传递给子例程的参数),也就是8个字节,如果是压进1个参数那就是ret 4了,所以子例程结束返回的时候esp+8是让栈指针回到没压进参数的时候的值。。这个叫做子例程负责清理堆栈,,C是调用者负责清理
看例子:
push eax
push ebx ;假设要向子例程传递的参数存放在eax和ebx里
call myabc ;调用myabc子例程
????????? ;你觉得这里应该是什么代码呢?
呵呵,压栈了2个32位数,是不是应该恢复下栈啊
add esp, 8 ;你也可以想象成,pop ebx pop eax
C就是这样做的,调用者负责清理堆栈
汇编里的是在子例程里面的最后返回时清理,由被调用的子例程负责清理
不要以为这样是多余的,如果不清理,在子例程里面再调用其它子例程就会发生
返回时错误,弹出栈的是你压进去的参数,而不是正确的返回地址
希望能帮到你。加油 。。。。另外希望大家回答的时候尽量别说太多的术语。。。。。。
给子例程传参数有用寄存器传递的,和堆栈传递的
我给你说下ret 8 的动作顺序 吧
首先 弹出偏移地址 (ret)
然后 esp+8 (8)
为什么后面要有个8呢?因为调用子例程的时候压进了2个32位的参数(传递给子例程的参数),也就是8个字节,如果是压进1个参数那就是ret 4了,所以子例程结束返回的时候esp+8是让栈指针回到没压进参数的时候的值。。这个叫做子例程负责清理堆栈,,C是调用者负责清理
看例子:
push eax
push ebx ;假设要向子例程传递的参数存放在eax和ebx里
call myabc ;调用myabc子例程
????????? ;你觉得这里应该是什么代码呢?
呵呵,压栈了2个32位数,是不是应该恢复下栈啊
add esp, 8 ;你也可以想象成,pop ebx pop eax
C就是这样做的,调用者负责清理堆栈
汇编里的是在子例程里面的最后返回时清理,由被调用的子例程负责清理
不要以为这样是多余的,如果不清理,在子例程里面再调用其它子例程就会发生
返回时错误,弹出栈的是你压进去的参数,而不是正确的返回地址
希望能帮到你。加油 。。。。另外希望大家回答的时候尽量别说太多的术语。。。。。。
展开全部
呵呵 为你正确解答:
1汇编语句里面的ret 8 是什么意思?
ret 8 ;为段内带立即数返回指令, 其中8 为指令 ret 携带的立即数 。
执行时,(IP)<----((SP)+1,(SP)) (SP)<----(SP)+2 (SP)<----(SP) + 8
作用:
在子程序返回时,从堆栈将断点地址取出后,允许修改堆栈指针,(在调用子程序时,把子程序需要用到的参数压入堆栈,以便使用,当子程序结束,返回时,放在堆栈中的这些参数就没有保留的必要了,这时可以在子程序返回时,使用段内带立即数的返回指令,修改回原来堆栈指针所指的内容。
2 CALL 01200000 是段内直接调用指令
012000000 是偏移量,转移的目标地址是:它是转移地址和返回地址(断点地址)的差值。
所以你程序的转移地址应为: 断点地址+012000000 。
备注:断点地址就是 CALL 01200000 指令的下一条指令的地址
呵呵 还有不清楚的 可以继续问 如果感到满意 请给俺加分 以示鼓励
1汇编语句里面的ret 8 是什么意思?
ret 8 ;为段内带立即数返回指令, 其中8 为指令 ret 携带的立即数 。
执行时,(IP)<----((SP)+1,(SP)) (SP)<----(SP)+2 (SP)<----(SP) + 8
作用:
在子程序返回时,从堆栈将断点地址取出后,允许修改堆栈指针,(在调用子程序时,把子程序需要用到的参数压入堆栈,以便使用,当子程序结束,返回时,放在堆栈中的这些参数就没有保留的必要了,这时可以在子程序返回时,使用段内带立即数的返回指令,修改回原来堆栈指针所指的内容。
2 CALL 01200000 是段内直接调用指令
012000000 是偏移量,转移的目标地址是:它是转移地址和返回地址(断点地址)的差值。
所以你程序的转移地址应为: 断点地址+012000000 。
备注:断点地址就是 CALL 01200000 指令的下一条指令的地址
呵呵 还有不清楚的 可以继续问 如果感到满意 请给俺加分 以示鼓励
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
汇编语句里面的ret 8是什么意思?
还有 ret 不是弹出栈 pop eip吗? 8是什么意思?
答:
子程序的运行,有时需要一些数据。
那么,在调用之前,可以把这些数据压入堆栈,供子程序取用。
子程序返回后,为了保证堆栈的平衡,应该再弹出这些数据。
但是,这些数据,在主程序里面,如果没有用处,弹出,就是不必要的操作。
那么,可以直接修改堆栈指针来保证平衡。
RET:即可返回到调用子程序之前的地址;
8:再把 SP 加上8。 有了这个 8,就可以省略 4 条 POP 指令(16位的)。
RET 8,就是直接修改堆栈的指针,使其多加上8,这就省略了 POP 操作,也不用再编写对 SP 相加的运算指令。
----
CALL 的地址为什么和跳过去的不一样?例如 CALL 01200000 而到的地址不是012000000 别人说这是偏移。这是怎么算的?
答:这个01200000,并不是目的地。 它是指 目的地 与 当前地址 之差。
还有 ret 不是弹出栈 pop eip吗? 8是什么意思?
答:
子程序的运行,有时需要一些数据。
那么,在调用之前,可以把这些数据压入堆栈,供子程序取用。
子程序返回后,为了保证堆栈的平衡,应该再弹出这些数据。
但是,这些数据,在主程序里面,如果没有用处,弹出,就是不必要的操作。
那么,可以直接修改堆栈指针来保证平衡。
RET:即可返回到调用子程序之前的地址;
8:再把 SP 加上8。 有了这个 8,就可以省略 4 条 POP 指令(16位的)。
RET 8,就是直接修改堆栈的指针,使其多加上8,这就省略了 POP 操作,也不用再编写对 SP 相加的运算指令。
----
CALL 的地址为什么和跳过去的不一样?例如 CALL 01200000 而到的地址不是012000000 别人说这是偏移。这是怎么算的?
答:这个01200000,并不是目的地。 它是指 目的地 与 当前地址 之差。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果,“CALL 01200000”为“E800002001”,那么01200000是相对偏移值,这个近跳转不算“近”啊!
ret 8,返回调用处,并弹出栈顶8个字节!
同一助记符不一定有相同的机器操作码,这与许多因素有关!提问时应提供尽量多的信息,例如,同时提供机器码及寄存器状态是个好习惯。另外在提问前,可以先参看下相关的文档,如《Intel® 64 and IA-32 Architectures Software Developer’s Manual》中包含你所需要的答案。
ret 8,返回调用处,并弹出栈顶8个字节!
同一助记符不一定有相同的机器操作码,这与许多因素有关!提问时应提供尽量多的信息,例如,同时提供机器码及寄存器状态是个好习惯。另外在提问前,可以先参看下相关的文档,如《Intel® 64 and IA-32 Architectures Software Developer’s Manual》中包含你所需要的答案。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
计算机自己算的。 由你指定标号,例如JMP loop 只要知道标号就好了。。然后计算机计算出标号距离跳转位置的偏移地址。
RET 8 看楼上做而论道的吧、
不必给我满意。。不过有什么不懂可以HI我、
RET 8 看楼上做而论道的吧、
不必给我满意。。不过有什么不懂可以HI我、
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询