ARM中C和汇编的相互调用(5个数求和、字符串拷贝)

开发环境:Keil5

工程目录:

 

一、汇编调用C——多数相加

使用汇编调用C,需要注意的是参数的传递。不同于X86的传参规则,在ARM体系中,如果形参的个数不超过4个,使用特殊寄存去R0~R3传递;而如果参数大于4个,就要将多出来的那部分参数使用堆栈传递。

压栈的之后移动位置指针,压栈顺序别忘了是最后一个参数先入栈->倒数第二个参数->,,,,

下面的代码实现了五个参数求和,首先使R0=0,R1=1,R2=2,R3=3,第五个参数使用栈传递,并移动堆栈指针。

(1)startup.s

Stack_Size EQU 0x100         ;初始化栈的大小为256B
    AREA STACK, NOINIT, READWRITE, ALIGN = 3
Stack_Mem SPACE Stack_Size
__initial_sp

    PRESERVE8
    THUMB

    AREA RESET, DATA, READONLY;中断向量表
        DCD __initial_sp
        DCD Reset_Handler
    AREA RESET, DATA, READWRITE

    AREA Sum, CODE, READONLY ;声明一个叫Sum的代码段,可读
Reset_Handler PROC;          ;复位函数,从这里开始执行
    IMPORT  main             ;main函数不在此文件中,所以需要引入
    IMPORT  sum5             ;sum5函数不在此文件中,所以需要引入

CALLSUM5
    MOV R0,#0
    MOV R1,#1
    MOV R2,#2
    MOV R3,#3
    MOV R4,#4                ;前4个参数使用R0~R3传递,
    STR R4,[SP, #-4]!        ;第5个使用栈传递
    BL  sum5                 ;调用c程序
    LDR  R0, = main
    BX      R0               ;回到C的main函数
    ENDP
    END

(2)main.c

int sum5(int a, int b, int c, int d, int e) {
    return (a+b+c+d+e);
}
int main(void) {

    return 0;
}

二、C调用汇编——strcopy

逻辑上比较好理解,首先在汇编文件中定义C要调用的函数,然后在.c文件extern这个函数,调用即可。

(1)startup.s

    AREA |.text|, CODE, READONLY ;声明一个叫|.text|的代码段,可读
Reset_Handler PROC
    IMPORT  main                 ;main函数不在此文件中,所以需要引入
    EXPORT  Reset_Handler        ;声明外部函数

    LDR     R0, =main
    BX      R0
    ALIGN
    ENDP    

    AREA SCopy, CODE, READONLY
    EXPORT strcopy               ;想要被外部调用,必须声明函数
strcopy
    LDRB R2,[R1],#1              ;B 代表一个字节,#1 代表 R1 的地址 1
    STRB R2,[R0],#1
    CMP  R2,#0                   ;0 是字符串额结束标志,比较R2和0就可以看到字符串是否结束
    BNE  strcopy                 ;跳转指令,不相等的时候跳转到上面,形成了循环
    BX   LR                      ;返回现场

    END    

(2)main.c

extern void strcopy(char *d, const char *s);

int main(void) {
    const char  srcstr[] = "ABCDEFGH";//0x41-0x48
          char  dststr[] = "abcdefgh";//0x61-0x68
    strcopy(dststr, srcstr);

    return 0;
}

原文地址:https://www.cnblogs.com/Irvingcode/p/12111301.html

时间: 2024-10-13 07:16:20

ARM中C和汇编的相互调用(5个数求和、字符串拷贝)的相关文章

Hybrid App开发模式中, IOS/Android 和 JavaScript相互调用方式

IOS:Objective-C 和 JavaScript 的相互调用 iOS7以前,iOS SDK 并没有原生提供 js 调用 native 代码的 API.但是 UIWebView 的一个 delegate 方法使我们可以做到让 js 需要调用时,通知 native.在 native 执行完相应调用后,可以用stringByEvaluatingJavaScriptFromString 方法,将执行结果返回给 js.这样,就实现了 js 与 native 代码的相互调用.具体让 js 通知 na

13.c和汇编的相互调用

? 新建light.c: 修改start.S: 修改Makefile:加light.o 最后make成功,烧写成功. ? 同样,我们也可以在C函数里调用我们的汇编里面的函数: 修改start.S:把light_led申明为global: 在light.c中被调用: Make编译烧写到开发板:发现灯是可以被点亮的.在C中调用汇编函数成功. 接下来的是在C中嵌入汇编代码,而不是调用: C内嵌入汇编的格式: ? 输出部分:是从c到r,输入是从r到c.破坏部是程序改变的寄存器. ? ? ? ? ? ?

类中嵌套另一个类时,调用构造,析构,拷贝,赋值运算符等函数的次序

class A { public: A(int a = 0) :a(a) { cout << "A()" << endl; } A(const A& other) { cout << "A&()" << endl; } A& operator =(const A& other) { cout << "operator = " << endl;

iOS原生和H5的相互调用

为什么现在越来越多的APP中开始出现H5页面? 1,H5页面开发效率更高,更改更加方便: 2,适当缩小APP安装包的大小: 3,蹭热点更加方便,比如五一,十一,双十一搞活动: 那么为什么说H5无法取代原生的APP,只能处在一个共存的例子呢? 1,这个是由系统的底层决定的,极端例子,所有的应用都通过H5展示,那么你是否需要一个浏览器? 2,涉及庞大的功能,涉及复杂的逻辑结构,涉及安全性的要求,H5可以胜任吗? 所以,H5和原生的融合会出现动态的调和,最终会找到一个平衡. 那么接下来就说下iOS开发

OC-关于OC中的对象方法和类方法的相互调用1

对象方法和类方法的区别和概念,大家都知道,关于两者之间的相互调用,本人小有总结 #import "NSString+WW.h" @implementation NSString (WW) //类方法------------------------ +(int )numberCountOfString:(NSString *)str{ //    int count=0; //    for (int i=0; i<str.length; i++) { //     char c

Android中通过WebView控件实现与JavaScript方法相互调用的地图应用

在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用android方法,在这里我个人觉得有点和DWR相似. 为了让大家容易理解,我写了一个简单的Demo,具体步骤如下: 第一步:新建一个Android工程,命名为WebViewDemo(这里我在assets里定义了一个html页面). 第二步:修改main.xml布局文件,增加了一个WebView控件还有But

理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)

我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以拿来学习应该是很方便的.但是因为ATL的代码充满了模板和宏,内部还夹杂着汇编,所以如果没有比较丰富的C++模板和系统底层的知识,一般人会看得一头雾水. 下面我们主要分析一下ATL中的一些汇编代码. ATL中出现汇编代码主要是2处,一处是通过Thunk技术来调用类成员函数处理消息:还有一处是通过打开_

WebView中Js与Android本地函数的相互调用

介绍 随着Html5的普及,html在表现力上不一定比原生应用差,并且有很强的扩展兼容性,所以越来越多的应用是采用Html与Android原生混合开发模式实现. 既然要实现混合开发,那么Js与Android原生函数的相互调用就必不可少了.这里写了一个demo,实现点击html中的图片进行本地展示. 原理 1.Android调用js很简单,直接webView.loadUrl("javascript:JS中的方法名称()");即可. 2.js调用Android方法,需要使用WebView.

Thinkphp中项目下的分组间的相互调用中的配置调用不能跨组

起因: 今天在Home组下面的一个控制器中调用RequestApi组里的控制器下的方法,结果发现一直为Null调用不到,但是当单独打印RequestApi里的方法,是没问题的,郁闷死了.开始检测费了九牛二虎之力就是不行,最后看到RequestApi中调用了配置项,莫非是这个导致的,于是单独打印配置项,可以啊,将配置项在RequestApi中单独写死,运行Home下的方法居然可以了,尼玛,坑爹,配置项的问题. 解决方案: 坚决在应用下新建一个所以分组公用的配置项,将RequestApi中的配置项提