用匯編實現add函式

weixin_33763244發表於2018-09-24

平臺

  • macOS

工具

  • nasm
  • clang

檔案

  • main.c

#include <stdio.h>

int add(int a, int b);

int main() {
    printf("the reuslt of 2 plus 3 is %d\n", add(2, 3));
    return 0;
}
  • add.asm

; 宣告給linker, 這樣才能連線上該函式
global add
section .data

section .text
add:
    ; 這兩句在所有函式中都是必須的, 功能就是將從父函式的棧切換到子函式的棧
    push rbp
    mov rbp, rsp
    
    ; 在macOS中函式引數的傳遞的順序是--> 見下面
    mov rax, rdi ; 獲取第一個引數
    add rax, rsi ; 獲取第二個引數, 函式的返回值放在rax中
    leave ; 作用: 將棧清除並還原(清除子函式的棧, 恢復父函式的棧, **注意: 子函式的棧用來存放區域性變數**), 相當於
    ; mov esp, ebp
    ; pop ebp
    ret
  • 函式引數傳遞的順序

  mov rdi,strformat    ;第一個引數
  mov rsi,1       ;第二個引數
  mov rdx,2       ;第三個引數
  mov rcx,3       ;第四個引數
  mov r8,4        ;第五個引數
  mov r9,5        ;第六個引數
  mov dword [rsp],6    ;第七個引數    
  mov dword [rsp+8],7  ;第八個引數
  mov dword [rsp+16],8 ;第九個引數
  mov dword [rsp+24],9 ;第十個引數

編譯

  • nams -f macho64 --prefix _ add.asm

連結

  • clang main.c add.o -o main

相關文章