延續上一篇的話題
這篇文章要來講當 C 語言中的 function 需要 6 個以上的參數時(雖然這種情況不多)
組合語言該如何實作
這裡所說的 stack 特別指的是 C 語言用來管理各個 function call 的那個 stack
可參考這篇文章
stack 的功用包含了:
這篇文章只探討傳遞參數的部份
就跟規定第一到第六個參數分別要放在哪裡一樣
從第七個參數開始也要約定好要先放在哪裡
他們會放到 stack 中:
第幾個|存放位置
------+------
7 | %rsp+8
8 | %rsp+16
9 | %rsp+24
10 | %rsp+32
11 | %rsp+40
12 | %rsp+48
13 | %rsp+56
14 | %rsp+64
6+n | %rsp+ 8*n
考慮以下 C 語言程式碼:
void proc(long a1, long *a1p,
int a2, int *a2p,
short a3, short *a3p,
char a4, char *a4p)
{
*a1p += a1;
*a2p += a2;
*a3p += a3;
*a4p += a4;
}
第幾個|參數|存放位置|大小
------+------+---------+-----
1 | a1 | %rdi | 64 bits
2 | a1p | %rsi | 64 bits
3 | a2 | %edx | 32 bits
4 | a2p | %rcx | 64 bits
5 | a3 | %r8w | 16 bits
6 | a3p | %r9 | 64 bits
7 | a4 | %rsp+8 | 8 bits
8 | a4p | %rsp+16 | 64 bits
編譯出的組合語言:
proc:
mov 16(%rsp),%rax # Fetch a4p
add %rdi,(%rsi) # *a1p += a1;
add %edx,(%rcx) # *a2p += a2;
add %r8w,(%r9) # *a30 += a3;
mov 8(%rsp),%edx # Fetch a4
add %dl,(%rax) # *a4p += a4;
retq # Return
Computer Systems: A Programmer's Perspective, 3/E (CS:APP3e)
https://blog.gtwang.org/programming/memory-layout-of-c-program/