我有以下C代码:
#include <stdio.h>
void function(int a, int b, int c) {
int buff_1[5];
int buff_2[10];
buff_1[0] = 6;
buff_2[0] = 'A';
buff_2[1] = 'B';
}
int main(void) {
int i = 1;
function(1,2,3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我想分析相关的汇编代码:函数调用前的汇编指令,根据我正在阅读的书是:
pushl $3
pushl $2
pushl $1
call function
Run Code Online (Sandbox Code Playgroud)
底层对象文件是使用创建的gcc-5.3 -O0 -c functions.c.但是,如果我使用I创建汇编代码,请objdump获取以下说明:
movl $3, %edx
movl $2, %esi
movl $1, %edi
Run Code Online (Sandbox Code Playgroud)
据我所知,汇编(我对它很新)第一个对我更有意义.
这本书完全错了吗?或者书籍输出因使用而过时gcc 2.9
这本书已经过时了64位x86.每个维基百科的x86-64调用约定是:
System V AMD64 ABI System V AMD64 ABI
的调用约定遵循Solaris,Linux,FreeBSD,OS X和其他类UNIX或POSIX兼容的操作系统.前六个整数或指针参数在寄存器RDI,RSI,RDX,RCX(Linux内核接口中的R10),R8和R9中传递,而使用XMM0,XMM1,XMM2,XMM3,XMM4,XMM5,XMM6和XMM7对于某些浮点参数.与Microsoft x64调用约定一样,在堆栈上传递其他参数,返回值存储在RAX中.
因为你传递的32位值,GCC使用每个寄存器的下半部分,因此%edi,%esi和%edx.