iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
自我挑戰組

C 語言筆記系列 第 5

[C 語言筆記--Day05] C 語言的 function call 如何被組合語言實作 II

  • 分享至 

  • xImage
  •  

延續上一篇的話題

這篇文章要來講當 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/


上一篇
[C 語言筆記--Day04] C 語言的 function call 如何被組合語言實作
下一篇
[C 語言筆記--Day06] 解題紀錄:MAX-MEX Cut
系列文
C 語言筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言