int func(int a, int b, int c, int d, int e, int x, int y, int z)
int main()
g++ -s檢視彙編
subq $16, %rsp
pushq $8
pushq $7
movl $6, %r9d
movl $5, %r8d
movl $4, %ecx
movl $3, %edx
movl $2, %esi
movl $1, %edi
call _z4funciiiiiiii
addq $16, %rsp
movl %eax, -4(%rbp)
從右向左依次傳參;
x86_64 linux貌似就這一種呼叫約定,6個以內的使用個暫存器,其他使用堆疊參考:x64 linux c 呼叫約定
x86 linux全部使用堆疊傳參,從右到左一次入棧;
其他參考:c語言函式呼叫約定
了解呼叫規則後,再看彙編應該怎麼寫;
int func(int x, int y)
int main()
檢視對應的.s檔案:
subq $16, %rsp
movl $2, -4(%rbp)
movl $3, -8(%rbp)
movl -8(%rbp), %eax
movl -4(%rbp), %edx
leaq _z4funcii(%rip), %rcx
# 36 "main.cpp" 1
movl %edx, %esi;movl %eax, %edi;call %rcx;movl %eax, %eax;
# 0 "" 2
movl %eax, -12(%rbp)
Linux C語言內聯彙編使用
最近要改個c語言演算法的關鍵部分用組合語言實現,linux裡嵌入彙編基本使用at t彙編,比如linux系統的啟動部分用的就是at t彙編 以前學過at t彙編,但學過一段時間就忘了,但對intel彙編基礎比較熟悉,兩者使用方法基本相似,所以對著intel彙編,花點時間看at t彙編也就容易了。下面...
Linux C語言內聯彙編使用
最近要改個c語言演算法的關鍵部分用組合語言實現,linux裡嵌入彙編基本使用at t彙編,比如linux系統的啟動部分用的就是at t彙編 以前學過at t彙編,但學過一段時間就忘了,但對intel彙編基礎比較熟悉,兩者使用方法基本相似,所以對著intel彙編,花點時間看at t彙編也就容易了。下面...
Linux C語言內聯彙編 條件跳轉
void jump 當sum的約束條件是 r 時,內聯彙編中應該初始化一下,movl 0,0 相當於初始化sum的中轉暫存器 比如下面,編譯器選擇 edx來暫存sum,如果不清零操作,其中的值是不確定的 再看看生成的.s檔案 subq 16,rsp movl 10,4 rbp movl 0,8 rb...