从gcc2.9到5.3的不同汇编指令

hGe*_*Gen 2 c assembly gcc

我有以下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

Joh*_*ode 5

这本书已经过时了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.

  • @MargaretBloom:得了.我通常不会在这个级别工作,所以我不知道所有的细微差别.如果您认为有必要,请随时编辑答案. (2认同)