用匯編實現add函數


平台

  • 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM