C语言和ARM汇编语言的相互调用

简介:

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);

目录
相关文章
|
8月前
|
编译器 C语言
ARM与C语言的混合编程【嵌入式系统】
ARM与C语言的混合编程【嵌入式系统】
83 0
|
存储 Linux C语言
嵌入式Linux系统中ARM汇编语言的使用方法
大家好,今天主要大家聊一聊,如何在ARM中使用汇编语言的方法。
171 0
嵌入式Linux系统中ARM汇编语言的使用方法
|
Android开发
【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
301 0
【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )
|
C语言
C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .
<p><span style="font-size:18px">我们在C语言编程中会遇到一些参数个数可变的函数,一般人对它的实现不理解。例如Printf():</span></p> <p align="center"><span style="font-size:18px">  Printf()函数是C语言中非常常用的一个典型的变参数函数,它</span></p> <p align="
1490 0
|
16天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
26 0
|
1天前
|
C语言
C语言:内存函数(memcpy memmove memset memcmp使用)
C语言:内存函数(memcpy memmove memset memcmp使用)
|
1天前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
3天前
|
存储 C语言
C语言函数的返回值
C语言函数的返回值
7 0