返回信息流嗯,话说__stdcall调用约定会调整堆栈,从子过程返回时,例如:
#include <stdio.h>
void __stdcall foo(int a, int b, int c, int d, int e) { }
int main() {
foo(1, 2, 3, 4, 5);
return 0;
}
这个东西用 gcc -S 出来是
call _foo@20
从foo返回时会
ret $20
因为压进去了5个int参数……
但是……
call ___main
movl $5, 16(%esp)
movl $4, 12(%esp)
movl $3, 8(%esp)
movl $2, 4(%esp)
movl $1, (%esp)
call _foo@20
subl $20, %esp
movl $0, %eax
leave
ret
红色那一行,为啥还要把esp减20……
脑残了……谢谢~!
这是一条镜像帖。来源:北邮人论坛 / soft-design / #35441同步于 2009/8/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
[脑残了]__stdcall和ret
Raiden
2009/8/23镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
一开始我也觉得恶心,intel格式看惯了
现在觉得AT&T格式挺好的……=。=
还是有push的……
【 在 rebirthatsix 的大作中提到: 】
: 看不懂此种汇编啊,遗憾,恩
: 此种汇编是不是不用push的
就是不太明白 ret $20 之后让esp跳过了参数
为啥还要subl……subl之后esp不是在往栈增长的方向走么……=。=
【 在 ericyosho 的大作中提到: 】
: 你不是一个空函数么。
: 压进去以后5个东东,每个4字节,一共20字节。
: 所以函数返回到main的时候,就直接跳回20字节咯。
我理解是:
加上后面这个补偿“subl $20”之后,ebp的值和使用__cdecl调用规则时的值一样,那么编译器后面的代码就不需要分清楚前面的调用使用的是哪种规则了
【 在 Raiden 的大作中提到: 】
: 就是不太明白 ret $20 之后让esp跳过了参数
: 为啥还要subl……subl之后esp不是在往栈增长的方向走么……=。=