程序的入口是main,在main里调用汇编的函数。

首先要解决怎么定义函数的问题

在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。

在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段

例子是一个六个数相加的函数。

C语言:

#include<stdio.h>

extern int sum(int a,int b,int c,int d,int e,int f);

int main(){

    int result = sum(,,,,,);

    return ;

}

汇编代码:

        AREA    EXAMPLE,CODE,READONLY
EXPORT sum
ENTRY sum
ADD R0,R0,R1
ADD R2,R2,R3
ADD R0,R0,R2 LDR R4,[SP]
LDR R5,[SP,#] ADD R4,R4,R5
ADD R0,R4,R0 BX LR END

其实关键的问题是参数和返回值。

我们能看到,C里面调用这个函数,C给里面传参数。

汇编是怎么接受这些参数的呢?

4个以内的参数,直接存放在R0~R3 这4个寄存器里面。

4个以后的参数放在堆栈里。

如果函数有返回值,那么返回值放在R0里。

Debug看看编译器是怎么处理的,我们就怎样把参数取出来。

还是比较易懂

首先是

R0 =6

R1=5

R2=3

R3=4

然后把R1的值放在堆栈里,R13=5,然后R1=2

然后吧R0的值放在堆栈的下一个位置,R13+4=6,然后R0=1.

之后就是:

R0=1,R1=2,R2=3,R3=4

堆栈里面:

所以取参数的时候就是:

LDR    R4,[SP];R4=
LDR R5,[SP,#];R5=

把相加的结果放在R0,然后BX LR返回

可以看到:

可以验证的确R0是存放返回值的。

C语言调用汇编的更多相关文章

  1. C语言调用汇编实现字符串对换

    1. 前面配置arm交叉编译环境. 2. 配置好qemu-arm C语言代码string-switch.c: #include <stdio.h> #include <stdlib. ...

  2. arm:c语言和汇编混合编程

    仅作演示. 1.C和汇编可相互调用,汇编子函数格式参考 汇编:普通的函数调用的汇编代码解析 http://www.cnblogs.com/mylinux/p/4139972.html 本文演示了 : ...

  3. c语言里如何调用汇编里的变量?

    c语言里如何调用汇编里的变量? 汇编语言:是声明全局变量 .globl _end_ofs _end_ofs: .word _end - _start c语言:声明这个变量,然后再调用这个变量 void ...

  4. c语言环境初始化&c语言和汇编混合编程

    bootloader通常会分为两个阶段:第一阶段采用汇编语言来编写,主要是一些核心的初始化工作(内存,时钟的初始化),第二阶段使用C语言来编写,主要是它会完成一些板载硬件的初始化(串口,网口)然后其启 ...

  5. C语言调用Intel处理器CPUID指令的实例

    C语言调用Intel处理器CPUID指令的实例 来源 https://blog.csdn.net/subfate/article/details/50789905 在Linux环境下,使用C语言内嵌汇 ...

  6. C语言与汇编的嵌入式编程:求100以内素数

    写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明 C代码如下: #include <stdio.h> void main(){ int i,j; ; ;i<=;i+ ...

  7. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  8. C++ 编写DLL文件给易语言调用

    摸索了两天了,终于解决了所有问题,在此跟大家分享. 需要三个文件,dll_demo.h.dll_demo.cpp.dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEM ...

  9. Golang通过Thrift框架完美实现跨语言调用

    每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...

随机推荐

  1. C++语言的url encode 和decode

    std::string UrlEncode(const std::string& szToEncode) { std::string src = szToEncode; char hex[] ...

  2. [Linux]Ubuntu中的System Setting

    问题 使用Ubuntu的过程中,安装搜狗输入法,卸载了系统自带的ibus.输入法搞定后,发现System Setting没有了... 原因 因为在卸载ibus等软件时,会删除一些依赖包,删除过程可能会 ...

  3. 编程技巧:使用整数同时进行多个true|false判断

    情景 : 假设需要判断某银行用户的其中一个账号(profileA),币种(Currency)为人民币(CNY),余额是否大于1,0000,然后进行某业务逻辑处理. 概述: 为了进行这种判断,需要判断/ ...

  4. Ubuntu 12.04 LTS 安裝无线网卡驱动

    1,当然,首先下载得到驱动的源代码: 2,解压缩到指定位置,我就是用鼠标拖到 home 里面: 3,进入驱动所在目录 CD ~/mt7610u,(我将解压缩出来的驱动目录改名为 mt7610u 这个了 ...

  5. 每天一个linux命令(性能、优化):【转载】vmstat命令

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深 ...

  6. 原生Ajax使用

    Ajax基础 Ajax(Asynchronous JavaScript And XML)概念:通过XMLHttpRequest对象向服务器提出请求并处理响应,进行页面的局部更新. AJAX都有哪些优点 ...

  7. MyEclipse异常关闭导致Tomcat不能启动的问题

    由于MyEclipse的异常关闭从而导致Tomcat并没有关闭,所以再次启动Tomcat当然是无法启动的啦,解决方法:在任务管理器中关闭一个叫javaw.exe的进程,如果你这时已经启动了MyEcli ...

  8. Machine Schedule(二分图匹配之最小覆盖点,匈牙利算法)

    个人心得:二分图啥的一点都不知道,上网借鉴了下,请参考http://blog.csdn.net/thundermrbird/article/details/52231639 加上自己的了解,二分图就是 ...

  9. Apache Tez 了解

    你可能听说过Apache Tez,它是一个针对Hadoop数据处理应用程序的新分布式执行框架.但是它到底是什么呢?它的工作原理是什么?哪些人应该使用它,为什么?如果你有这些疑问,那么可以看一下Bika ...

  10. 【转】VC 模式对话框和非模式对话框的创建,销毁和区别

    原文网址:http://blog.csdn.net/mycaibo/article/details/6002151 VC 模式对话框和非模式对话框的创建,销毁和区别   在WIN32中,模式对话框的创 ...