平台

  • 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

用汇编实现add函数的更多相关文章

  1. [Leveldb源码剖析疑问]-block_builder.cc之Add函数

    Add函数是给一个Data block中添加对应的key和value,函数源码如下,其中有一处不理解: L30~L34是更新last_key_的,不理解这里干嘛不直接last_key_ = key.T ...

  2. Calendar中add函数和roll函数的用法及区别

    Calendar中add()和roll()函数的用法一.取某个时间点后的整点时刻.例如1984年7月7日15:23:05后的整点时刻即为1984-07-07 16:00:00.实现如下:Calenda ...

  3. arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值

    环境及代码介绍 环境和源码 由于有时候要透彻的理解C里面的一些细节问题,所有有必要看看汇编,首先这一切的开始就是从汇编代码进入C的main函数过程.这里不使用编译器自动生成的这部分汇编代码,因为编译器 ...

  4. Win32汇编常用系统函数

    汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...

  5. 简单的add函数的N种写法

    最近在学习es6,看到for-of这里,就想自己写着练习一下,于是就准备写一个小函数add来求和.函数很简单,如add(1,2,3)这样.于是我开始着手 一开始我是这么写的 function add( ...

  6. zepto 事件分析3(add函数)

    在上一篇的分析中,最后$.on方法返回了一个add方法函数的执行,在这里先看一下其代码: function add(element, events, fn, data, selector, deleg ...

  7. 学习笔记之Java队列Queue中offer/add函数,poll/remove函数,peek/element函数的区别

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. Java中Que ...

  8. gcc 在c代码中内嵌汇编调用c函数: 只是证明曾经我来过

    我怕我不写下来,将来我都不记得我还在 c 中嵌套过汇编语言,用汇编代码调用一个c函数的过程. 折腾了一下午,在网上查看相关的资料,然后照葫芦画瓢地在c代码中嵌套汇编,希望解决我所遇到的问题,可最后发现 ...

  9. 汇编指令ADD

    格式: ADD OPRD1,OPRD2 功能: 两数相加(不带进位) 例子: add ax,bx add ax,ax 解释:

随机推荐

  1. SharePoint Project Server List 列表CURD操作使用rest api接口

    //#region 界面交互代码 var issuesUtils = issuesUtils || {}; (function () { /** * 点击问题提处理方案按钮事件 */ issuesUt ...

  2. jquery easyui 推荐博客 (MVC+EF+EasyUI+Bootstrap)

    构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(52)-美化EasyUI皮肤和图标   系列目录 我很久以前就想更新系统的皮肤功能,Easyui 自 ...

  3. 面试题: mysql数据库 已看1 简单的sql练习

    数据库总结--MySQL常见面试题 2015年03月24日 17:56:06 阅读数:7787 1.根据部门号从高到低,工资从低到高列出员工的信息 select * from employee ord ...

  4. hibernate&nbsp;hql&nbsp;查询指定…

    以数组的形式抛出,前台页面就要把它当成一个数组来处理 以对象抛出,就要当成一个对象来处理. 在JSP页面使用标签时一定要注意这点. 版权声明:本文为博主原创文章,未经博主允许不得转载.

  5. Python短小精悍的Orator查询构造器

    查询构造器 介绍 这个数据库查询构造器,提供便利的接口可以创建和执行查询操作,可以在大多数数据库中使用. 查询select操作 查询表中所有的数据. users = db.table('users') ...

  6. URAL 2018 The Debut Album (DP)

    题意:给出n长度的数列,其实1的连续个数不超过a,2的连续个数不超过b. 析:dp[i][j][k] 表示前 i 个数,以 j 结尾,并且连续了k个长度,要用滚动数组,要不然MLE. 代码如下: #p ...

  7. Java数学相关工具类

    1.求百分比 public class Test1 { public static String myPercent(int y, int z) { String baifenbi = "& ...

  8. System.Threading.Thread的使用及传递参数等总结

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  9. 设置css属性

  10. centos运行netcore error:package: ‘Microsoft.AspNetCore.Antiforgery‘, version: ‘2.0.3‘

    Error: An assembly specified in the application dependencies manifest (*.*.deps.json) was not found: ...