C语言和ARM汇编语言的相互调用
来源:互联网 发布:mac微信截屏快捷键 编辑:程序博客网 时间:2024/05/16 03:00
1.汇编程序访问C语言全局变量
全局变量只能通过地址间接调用,为了访问C语言中全局变量,首先要通过extern伪指令引入全局变量,然后将其地址装入寄存器中。
对于unsigned char类型,使用LDRB/STRB访问;
对于unsigned short类型,使用LDRH/STRH访问;
对于unsigned int类型,使用LDR/STR访问;
对于char类型,使用LDRSB/STRSB访问;
对于short类型,使用LDRSH/STRSH访问;
例子:
.text
.global asmsubroutine
.extern globvar
asmsubroutine:
LDR R1,=globvar
LDR R0,[R1]
ADD R0,R0,#2
STR R0,[R1]
MOV PC,LR
.end
2.C程序调用汇编程序
C程序调用汇编程序首先通过extern声明要调用的汇编程序模块,声明中形参个数要与汇编程序模块中需要的变量个数一致,且参数传递要满足ATPCS规则,然后在C程序中调用。
例子:
#include<stdio.h>
extern void *strcopy(char*d,char*s);//模块声明
int main()
{
char*srcstr="first";
char*dststr="second";
strcopy(dststr,srcstr);//汇编模块调用;
}
.text
.global strcopy
Strcopy:
LDRB R2,[R1],#1
STRB R2,[R0],#1
CMP R2,#0
BNE Sstcopy
MOV PC,LR
.end
汇编程序调用C程序
在调用之前必须根据C语言模块中需要的参数个数,以及ATPCS参数规则,完成参数传递,即前四个参数通过R0-R3传递,后面的参数通过堆栈传递,然后再利用B、BL指令调用。
例子:
int g(int a,int b,int c,int d,int e)//C语言函数原型
{
return(a+b+c+d+e);
}
汇编语言完成是求i+2i+3i+4i+5i的结果;
.global _start
.text
_start:
.extern g ;引入c程序
STR LR,{SP,-#4}!;保存PC
ADD R1,R0,R0
ADD R2,R1,R0
ADD R3,R1,R2
STR R3,{SP,#-4}!
ADD R3,R1,R1
BL g ;调用C函数g
ADD SP,SP,#4
LDR PC,[SP],#4
.end
return(0);
- C语言和ARM汇编语言的相互调用
- C语言和ARM汇编语言的相互调用
- C语言和ARM汇编语言的相互调用
- C语言与汇编语言的相互调用
- 关于C语言和汇编语言相互嵌套调用
- C语言与汇编语言相互调用
- 基于ARM的C语言和汇编语言的混合使用
- ARM汇编 C语言 C++ 相互调用
- c语言和c++的相互调用
- C语言与汇编语言相互调用原理以及实例
- C语言与汇编语言相互调用原理以及实例
- ARM基础:为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
- arm汇编语言调用C函数
- C语言调用汇编语言的简单方法
- c++和c语言中的函数相互调用的问题
- ARM中C语言和汇编语言混合编程
- (四)ARM中通信协议的总结,以及c语言和汇编语言的混编
- arm c函数的调用过程arm汇编语言调用C函数之参数传递
- Oracle 11g安装图文攻略
- 程序版本在线更新分析
- 网络IT认证三大主流
- 素数
- C语言和ARM汇编语言的相互调用
- C语言和ARM汇编语言的相互调用
- 字符串转换为HashKey的一种算法
- 杀掉任务管理器杀不了的进程 ntsd -c q -p
- 技术团队新官上任之中层篇
- [剑指offer][面试题39]二叉树的深度
- 解决Android中“Android SDK Content loader has encountered a problem” “parseSdkContent Failed ”错误
- IT职场规划与学习方法
- 浅谈C/C++内存泄漏及其检测工具
- GNS3模拟ASA解决重起不保存配置