在Linux,*BSD和Mac OS X里使用同一种方式来传递函数参数。头6个参数使用来传递的,剩下的要靠栈。

    这是一个重点,在64位模式下,对低32位进行操作的时候,会清空高32位的内容。比如 MOV EAX,011223344h将会把值写到RAX里,并且清空RAX的高32位区域。 如果我们打开编译好的对象文件(object file[.o]),我们会看到所有的指令:

    1. .text:00000000004004D0 main proc near
    2. .text:00000000004004D0 48 83 EC 08 sub rsp, 8
    3. .text:00000000004004D9 31 C0 xor eax, eax
    4. .text:00000000004004DB E8 D8 FE FF FF call _printf
    5. .text:00000000004004E2 48 83 C4 08 add rsp, 8
    6. .text:00000000004004E6 C3 retn

    就像看到的那样,在04004d4那行给edi写字串指针的那句花了5个bytes。如果把这句换做给rdi写指针,会花掉7个bytes.就是说GCC在试图节省空间,为此数据段(data segment)中包含的字串不会被分配到高于4GB地址的空间上。

    参考【21】 MichaelMatz/JanHubicka/AndreasJaeger/MarkMitchell. Systemvapplicationbinaryinterface.amdarchitecture processor supplement, . Also available as .