这样,我们就获的C代码对应的x86平台的汇编代码(为了显示清晰,我删除了以"."开头的标记性语句): func1: pushq %rbp movq %rsp, %rbp movl %edi, -4(%rbp) movl %esi, -8(%rbp) movl %edx, -12(%rbp) popq %rbp ret func2: pushq %rbp movq %rsp, %rbp movl %edi, -4(%rbp) movl %esi...
而对于七个参数的函数,最后一个参数用栈来传递。 在32位结构上,情况却不太相同: main: .LFB2: .cfi_startproc pushl%ebp .cfi_def_cfa_offset8.cfi_offset5, -8movl%esp, %ebp .cfi_def_cfa_register5call __x86.get_pc_thunk.ax addl $_GLOBAL_OFFSET_TABLE_,%eax pushl $306pushl $305pushl $304...
在x86_64架构中,整数和指针等的大小就是giant word。g:giant word (gdb)x/3g $rsp 和x/3g $sp一样的 0x7fffffffe388:<-栈内容:返回地址:main中的func()的下一条命令的地址 4195740 6293952<-剩余的参数i,v1的指针 0x7fffffffe398: 4196072<-剩余的参数j,字符串“string”的指针 2.确认指针i和j所...
所以我们现在知道, 在 x86_64/linux/gcc3.2 中, 即使不打开优化选项, 函数的参数也会通过寄存器来传递, 这肯定是阔了的表现(通用寄存器多了). 我试验了多个参数的情况,发现一般规则为, 当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。当参数为 7 个以上时, 前 6 个与前面...
以下关于x86-64过程调用的叙述中,错误的是( )。 A. 前6个参数采用通用寄存器传递,其余参数通过栈传递 B. 在通用寄存器中传递的参数,都存放在64位寄存器中 C. 在栈中的参数若是基本类型,则被分配8个字节空间 D. 返回参数存放在RAX相应宽度的寄存器中 ...