延续上一篇的话题
这篇文章要来讲当 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/
那个 W 开头的 你是不是看我书读得少,想随便拿一串英文符号呼隆我? 这误会可不是普通的小啊!必须...
infrastructure 也可以 for each 之三 课程内容与代码会放在 Github 上...
网站必备!连结动态 连结的Hover动态算是网页动态最基本款, 一个好的动态绝对可以帮网页 点击率(...
目录 零、要讨论的主题 一、图解什麽是L 二、为什麽是L 三、参考资料 四、彩蛋 零、要讨论的主题 ...
有些工程师的至理名言是:「人生不能重来,但是 Git 可以。」 所以,什麽是 Git? 维基百科说:...