Linux C語言內聯彙編 函式呼叫

2021-08-20 22:19:06 字數 965 閱讀 4261

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...