用汇编实现add函数

简介: 平台macOS工具nasmclang文件main.c#include int add(int a, int b);int main() { printf("the reuslt of 2 plus 3 is %d\n", add(2, 3)); return 0;}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
目录
相关文章
|
2月前
|
C语言
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
【汇编语言实战】基础知识+函数的引用(求1+2+..+N)+OllyDBG的使用
14 1
|
2月前
|
编译器 API C语言
在x86架构汇编语言中函数参数传递的三种约定
在x86架构汇编语言中函数参数传递的三种约定
52 2
|
2月前
|
存储 程序员 开发者
深入理解汇编:push、pop、add、sub、lea 指令详解
深入理解汇编:push、pop、add、sub、lea 指令详解
232 1
|
2月前
|
前端开发 rax Linux
汇编语言与x64函数参数传递
汇编语言与x64函数参数传递
36 0
|
2月前
|
存储 程序员 数据处理
【汇编】mov和add指令、确定物理地址的方法、内存分段表示法
【汇编】mov和add指令、确定物理地址的方法、内存分段表示法
289 1
【汇编】mov和add指令、确定物理地址的方法、内存分段表示法
|
2月前
汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)
汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)
54 0
|
9月前
汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)
汇编指令学习(ADD,SUB,MUL,DIV,XADD,INC,DEC,NEG)
119 0
8086汇编中mov,add,sub语法
8086汇编中mov,add,sub语法
192 0
|
存储
ARM64汇编的函数有那些需要重点注意?
ARM64汇编的函数有那些重点
438 0
ARM64汇编的函数有那些需要重点注意?