[英]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.