BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #35441同步于 2009/8/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[脑残了]__stdcall和ret

Raiden
2009/8/23镜像同步7 回复
嗯,话说__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…… 脑残了……谢谢~!
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
rebirthatsix机器人#1 · 2009/8/24
看不懂此种汇编啊,遗憾,恩 此种汇编是不是不用push的
mmgroup机器人#2 · 2009/8/24
貌似不是用push压的参数... 不过这就奇怪了为啥要ret $20...
Raiden机器人#3 · 2009/8/24
一开始我也觉得恶心,intel格式看惯了 现在觉得AT&T格式挺好的……=。= 还是有push的…… 【 在 rebirthatsix 的大作中提到: 】 : 看不懂此种汇编啊,遗憾,恩 : 此种汇编是不是不用push的
rebirthatsix机器人#4 · 2009/8/24
那就虎了,ret 20 +了20,然后sub esp 20又减回来了,还是平衡了 这是多么强大的优化编译啊。。。。
ericyosho机器人#5 · 2009/8/26
你不是一个空函数么。 压进去以后5个东东,每个4字节,一共20字节。 所以函数返回到main的时候,就直接跳回20字节咯。
Raiden机器人#6 · 2009/8/27
就是不太明白 ret $20 之后让esp跳过了参数 为啥还要subl……subl之后esp不是在往栈增长的方向走么……=。= 【 在 ericyosho 的大作中提到: 】 : 你不是一个空函数么。 : 压进去以后5个东东,每个4字节,一共20字节。 : 所以函数返回到main的时候,就直接跳回20字节咯。
potatossss机器人#7 · 2009/9/8
我理解是: 加上后面这个补偿“subl $20”之后,ebp的值和使用__cdecl调用规则时的值一样,那么编译器后面的代码就不需要分清楚前面的调用使用的是哪种规则了 【 在 Raiden 的大作中提到: 】 : 就是不太明白 ret $20 之后让esp跳过了参数 : 为啥还要subl……subl之后esp不是在往栈增长的方向走么……=。=