用汇编实现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
目录
相关文章
|
关系型数据库 PostgreSQL
|
Unix Linux Shell
patch 命令用法详解(转)
patch,是打补丁的命令,有很多用法,见帮助#man patch patch -p0       (“p”指的是路径,后面的数字表示去掉路径的第几部分。"0",表示不去掉,为全路径) patch -p1       (“p”后面的数字"1",表示去掉前第一个路径) fetch http://people.
11324 0
|
10月前
|
传感器 人工智能 边缘计算
智能就在身边:AI如何优化边缘计算
智能就在身边:AI如何优化边缘计算
513 2
|
前端开发 Java 测试技术
毕业设计中使用支付宝沙箱完成在线支付流程
毕业设计中使用支付宝沙箱完成在线支付流程
941 0
|
SQL Java 数据库连接
Mybatis入门简介
Mybatis入门简介
785 0
|
8月前
|
数据采集 人工智能 算法
美团 LongCat 团队发布全模态一站式评测基准UNO-Bench:揭示单模态与全模态能力的组合规律
美团LongCat团队推出一站式全模态大模型评测基准UNO-Bench,首创“组合定律”揭示多模态能力协同增益,支持中文场景,以98%跨模态问题占比和创新多步开放式题型,科学评估模型真实融合能力。
845 5
|
开发框架 运维 应用服务中间件
EDAS(Enterprise Distributed Application Service)
EDAS(Enterprise Distributed Application Service)是阿里云提供的一款企业级分布式应用服务平台,帮助企业快速构建、部署和管理分布式应用程序。EDAS提供了一系列的功能和工具,包括微服务架构、容器化部署、服务治理、流量控制、故障诊断等,可以帮助企业实现分布式应用的快速迭代和运维管理。
1704 0
|
SQL 存储 开发框架
数据定义语言 - DDL
数据定义语言 - DDL
1380 0
|
JavaScript 前端开发
学习Vue3 第三十二章(详解Scoped和样式 穿透)
vue中的scoped 通过在DOM结构以及css样式上加唯一不重复的标记:data-v-hash的方式,以保证唯一(而这个工作是由过PostCSS转译实现的),达到样式私有化模块化的目的。
606 0
学习Vue3 第三十二章(详解Scoped和样式 穿透)
|
uml C语言
架构设计:系统时序图
时序图(Sequence Diagram),亦称为序列图、循序图或顺序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。时序图是一个二维图,横轴表示对象,纵轴表示时间,消息在各对象之间横向传递,依照时间顺序纵向排列。
1799 0