簡體   English   中英

從gcc2.9到5.3的不同組裝說明

[英]different assembly instructions from gcc2.9 to 5.3

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

現在我要分析相關的匯編代碼:根據我正在閱讀的書,在函數調用之前的匯編指令為:

pushl $3
pushl $2
pushl $1
call function

基礎對象文件是使用gcc-5.3 -O0 -c functions.c 但是,如果我使用objdump創建匯編代碼,則會得到以下說明:

movl $3, %edx
movl $2, %esi
movl $1, %edi

據我了解匯編(我很陌生),第一個對我來說更有意義。

這本書真的錯了嗎? 還是因為使用gcc 2.9導致書籍輸出剛剛過時

關於64位x86,這本書已經過時了。 每個Wikipedia的x86-64調用約定為:

系統V AMD64 ABI

在Solaris,Linux,FreeBSD,OS X和其他類似UNIX或POSIX的操作系統上遵循System V AMD64 ABI的調用約定。 前六個整數或指針參數在寄存器RDI,RSI,RDX,RCX(Linux內核接口中為R10),R8和R9中傳遞,而使用XMM0,XMM1,XMM2,XMM3,XMM4,XMM5,XMM6和XMM7對於某些浮點參數。 與Microsoft x64調用約定中一樣,其他參數在堆棧上傳遞,並且返回值存儲在RAX中。

由於您要傳遞32位值,因此gcc使用的是每個寄存器的下半部分,因此使用%edi%esi%edx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM