- 论坛徽章:
- 12
|
zylthinking 发表于 2013-01-28 16:11
你的是 x86-64 代码, 我的是 -m32 的代码, 不知道你的 func 反汇编是什么; 但 64 位机器上的 -m32 ...
我以为我们讨论的是64位的情况。如果是32位,gcc遵循的调用约定不是我给出的那个,而是你们说的cdecl。
但原理是一样的:
1.ABI不会被打破
2.假设参数都放到栈上,按从左到右入栈本身就是不对的。从这个假设推导出的结论自然也不对。
不过,我试了下-m32的情况,得到的结果正是楼主预期的,从汇编上看32位下几个参数全部通过寄存器传递的。
32位汇编:- .file "abi.c"
- .section .rodata.str1.1,"aMS",@progbits,1
- .LC0:
- .string "a = %p\n"
- .LC1:
- .string "b = %p\n"
- .LC2:
- .string "c = %p\n"
- .text
- .p2align 4,,15
- .globl func
- .type func, @function
- func:
- .LFB12:
- .cfi_startproc
- subl $28, %esp
- .cfi_def_cfa_offset 32
- leal 32(%esp), %eax
- movl %eax, 4(%esp)
- movl $.LC0, (%esp)
- call printf
- leal 36(%esp), %eax
- movl %eax, 4(%esp)
- movl $.LC1, (%esp)
- call printf
- leal 40(%esp), %eax
- movl %eax, 4(%esp)
- movl $.LC2, (%esp)
- call printf
- addl $28, %esp
- .cfi_def_cfa_offset 4
- ret
- .cfi_endproc
- .LFE12:
- .size func, .-func
- .section .rodata.str1.1
- .LC3:
- .string "hello world"
- .section .text.startup,"ax",@progbits
- .p2align 4,,15
- .globl main
- .type main, @function
- main:
- .LFB11:
- .cfi_startproc
- pushl %ebp
- .cfi_def_cfa_offset 8
- .cfi_offset 5, -8
- movl %esp, %ebp
- .cfi_def_cfa_register 5
- andl $-16, %esp
- subl $16, %esp
- movl $.LC3, 8(%esp)
- movl $99999, 4(%esp)
- movl $18, (%esp)
- call func
- xorl %eax, %eax
- leave
- .cfi_restore 5
- .cfi_def_cfa 4, 4
- ret
- .cfi_endproc
- .LFE11:
- .size main, .-main
- .ident "GCC: (SUSE Linux) 4.7.1 20120723 [gcc-4_7-branch revision 189773]"
- .section .comment.SUSE.OPTs,"MS",@progbits,1
- .string "Ospwg"
- .section .note.GNU-stack,"",@progbits
复制代码 |
|