OS X调用约定返回值

时间:2012-07-06 12:36:23

标签: macos calling-convention disassembly

我见过一个主函数的gdb反汇编输出,没有什么特别之处,它看起来像这样:

1  push    %rbp
2  mov     %rsp, %rbp
3  sub     $0x10,%rsp
4  movl    $0x0, -0x8(%rbp)    ;
5  mov     -0x8(%rbp), %eax    ;
6  mov     %eax, -0x4(%rbp)    ;
7  mov     -0x4(%rbp), %eax    ;
8  add     $0x10, %rsp
9  pop     %rbp
10 retq

我不是Mac用户,但我很好奇,从4到7的行是什么?不应该是这样的:

push    %rbp
mov     %rsp, %rbp
sub     $0x10, %rsp
xor     %eax, %eax
add     $0x10, %rsp
pop     %rbp
retq

注意 :请随时改进问题标题,我找不到更好的标题。

1 个答案:

答案 0 :(得分:0)

从这个汇编代码看起来,看起来你有64位机器。

 4  movl    $0x0, -0x8(%rbp)    ;
 5  mov     -0x8(%rbp), %eax    ;
 6  mov     %eax, -0x4(%rbp)    ;
 7  mov     -0x4(%rbp), %eax    ;

他们是正确的指示。此处的%rbp注册包含对Stack segment的引用。符号-08x(%rbp)指的是内存位置,特别是堆栈指针的第8个索引。
那么第4 - 5行说:

4 put 0 in the 8th index of the stack segment
5 put the value of the 8th index of the stack segment in %eax

第6 - 7行也是如此 如果我没错,那么最初的程序只能由分配...