[C 语言笔记--Day05] C 语言的 function call 如何被组合语言实作 II

延续上一篇的话题

这篇文章要来讲当 C 语言中的 function 需要 6 个以上的参数时(虽然这种情况不多)

组合语言该如何实作

大纲

  1. 拥有许多功能的 stack
  2. 如何传送 6 个以上的参数
  3. 例子
  4. 参考资料

拥有许多功能的 stack

这里所说的 stack 特别指的是 C 语言用来管理各个 function call 的那个 stack

可参考这篇文章

stack 的功用包含了:

  • 储存 return address
  • 配置变数的的空间
  • 传递参数

这篇文章只探讨传递参数的部份

如何传送 6 个以上的参数

就跟规定第一到第六个参数分别要放在哪里一样

从第七个参数开始也要约定好要先放在哪里

他们会放到 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/


<<:  Day1 - 你适合观看本系列教学影片吗?

>>:  Day01 iPhone捷径是啥

Day 2. Pre-Start × WYSIWYG

那个 W 开头的 你是不是看我书读得少,想随便拿一串英文符号呼隆我? 这误会可不是普通的小啊!必须...

Day 16-infrastructure 也可以 for each 之三: Count meta-argument

infrastructure 也可以 for each 之三 课程内容与代码会放在 Github 上...

#1-连结Hover动起来!(CSS 伪元素)

网站必备!连结动态 连结的Hover动态算是网页动态最基本款, 一个好的动态绝对可以帮网页 点击率(...

What's radiance?

目录 零、要讨论的主题 一、图解什麽是L 二、为什麽是L 三、参考资料 四、彩蛋 零、要讨论的主题 ...

【Day03】Git 版本控制 - 什麽是 Git

有些工程师的至理名言是:「人生不能重来,但是 Git 可以。」 所以,什麽是 Git? 维基百科说:...