ARM 中的 C 和汇编混合编程和示例

 2024-02-13 01:02:17  阅读 0

ARM 中的 C 和汇编混合编程和示例

我之前学ARM的时候就读过这篇文章。 我认为这是一个很好的介绍。 你可以参考一下。 ARM 中的 C 和汇编混合编程和示例

在嵌入式系统的开发中,目前使用的主要编程语言是C和汇编。 C++已经有了相应的编译器,但是仍然很少使用。 在较大规模的嵌入式软件中,例如操作系统,大部分代码都是用C编写的。

主要是因为C语言结构更好,更容易让人理解,并且有大量的支持库。 尽管如此,很多地方仍然使用了汇编语言,比如开机时硬件系统的初始化,包括设置CPU状态、使能中断、设置主频,以及RAM控制参数和初始化,以及一些中断处理方面。 还可能涉及组装。 另一个使用汇编的地方是在一些对性能非常敏感的代码块中。 这不能依赖C编译器生成的代码,而必须手动编写汇编来达到优化的目的。 而且,汇编语言与CPU的指令集紧密相连。 作为底层嵌入式系统开发,熟练使用汇编语言也是必须的。

C或汇编编程请参考相关书籍或手册。 这里主要讨论C和汇编的混合编程,包括

函数之间相互调用。 下面分四种情况进行讨论,C++暂时不涉及。

1.C语言嵌入式汇编

C 中嵌入的汇编指令包括大部分 ARM 和 Thumb 指令,但它们的使用与汇编文件中的指令有些不同,并且存在一些限制,主要有以下几个方面:

A。 不能直接给PC寄存器赋值。 必须使用B或BL指令跳转到程序。

b. 使用物理寄存器时,不要使用过于复杂的C表达式,以避免物理寄存器冲突。

C。 R12和R13可以被编译器用来存储中间编译结果,并且可以在计算表达式值时使用。

R0到R3、R12和R14用于子程序调用,因此避免直接使用这些物理寄存器

d. 一般不直接指定物理寄存器,让编译器分配。

内联汇编中使用的标签是__asm或asm关键字,其用法如下:

__asm

[; ]

...

[]

asm(“[;]”);

下面通过一个例子来说明如何

C 中的嵌入式汇编语言,

#

void (const char *src, char *dest)

字符ch;

__asm

环形:

ldrb ch,[源代码],#1

strb ch,[目标],#1

CMP 通道,#0

骨循环

int main()

char *a = "继续前进!";

字符b[64];

(一、二);

(“:%s”,a);

(“:%s”,b);

0;

它在这里

C 和汇编之间的值传递是使用 C 指针实现的。 因为指针对应的是地址,所以在汇编中也可以访问。

2.用于装配

C定义的全局变量的内联汇编不需要单独的汇编语言文件,相对简洁,但有很多限制。 当汇编代码较大时,一般放在单独的汇编文件中。 这时,需要在汇编和C之间传递一些数据。最简单的方法就是使用全局变量。

/* cfile.c

* 定义全局变量并作为调用程序

*/

#

整数=12;

(空白);

int main()

(" 的值为:%d", );

();

(" 的值为:%d", );

0;

对应的汇编语言文件

; 通过 main(C 中),到 an ,使用 C 中的 var 。

c语言与汇编混合编程规则_c语言汇编混合编程意义_c和汇编混合编程

区号,

ldr r0,=

ldr r1,[r0]

莫夫r2,#2

乘 r3、r1、r2

str r3, [r0]

移动电脑,LR

结尾

3.存在

在 C 中调用汇编函数

要在 C 中调用汇编文件中的函数,需要完成两个主要任务。 一种是在C中声明函数原型并添加

关键词; 其次,在汇编中使用导出的函数名,以函数名作为汇编代码段的标识符,最后使用mov pc,lr返回。 然后,就可以在C中使用该函数了。从C的角度来看,不知道该函数是用C实现的还是用汇编实现的。 更深层次的原因是C函数名的作用是指示函数代码的起始地址,与汇编标号一致。

/* cfile.c

* 在C中,调用汇编,

*2004 年 9 月 9 日

*/

#

void (const char *src, char *dest);

int main()

const char *s = "在阳光下";

字符d[32];

(s、d);

(“:%s”,s);

(“:%s”,d);

0;

;汇编

区号,

c和汇编混合编程_c语言汇编混合编程意义_c语言与汇编混合编程规则

环形

ldrb r4, [r0], 读取后的#1

CMP r4,#0

请求结束

strb r4,[r1],#1

b循环

超过

移动电脑,LR

结尾

这里,C与汇编之间的参数传递是通过ATPCS(ARM Thumb Call)的规定进行的。 简单来说,如果函数的参数不超过4个,则使用R0-R3来传递对应的参数。 如果参数超过4个,则使用堆栈,通过R0返回函数的返回值。

4. 汇编中调用

当C函数调用汇编中的C函数时,需要汇编中对应的C函数名,然后将C代码放在独立的C文件中进行编译,连接器处理剩下的工作。

;来自 ATPCS

;如果参数超过4个,则使用栈

区号,

乐趣

入口

移动 r0,#11

莫夫R1,#22

莫夫R2,#33

BL cFun

结尾

/*C文件,由*/

int cFun(int a, int b, int c)

a+b+c;

在汇编中调用C函数时,参数传递也是通过ATPCS实现的。 需要指出的是,当函数的参数个数大于4时,必须使用栈。 有关详细信息,请参阅 ATPCS 规范。

概括

以上通过几个简单的例子演示了嵌入式开发中常用的C与汇编混合编程的一些方法和基本思想。 其实核心问题是如何在C和汇编之间传递值。 剩下的问题就自己处理吧。

标签: 汇编 函数 编程

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码