微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 混合使用C、C++和汇编语之:内联汇编和嵌入型汇编的使用

混合使用C、C++和汇编语之:内联汇编和嵌入型汇编的使用

时间:08-30 来源:3721RD 点击:

达式。列表中的值可以是物理寄存器、可修改长值表达式或单个物理寄存器名称。

内联汇编程序从特定的物理寄存器中取值并赋值到特定的表达式中。指定物理寄存器名称而并不赋值,导致相同名称虚拟寄存器被物理寄存器中的值更新。

例如,BL foo { }, {result1=r0, r1}生成以下伪码:

BL foo

MOV result1, (physical) r0

MOV (virtual) r1, (physical) r1

(4)被破坏的寄存器列表(Corrupted register list)

此列表指定被函数调用破坏的物理寄存器。如果条件标志被调用的函数修改,必须在被破坏的寄存器列表中指定PSR。

BL和SWI指令总是破坏lr。

如果指令中缺少此列表项,则r0~r3、ip、lr和PSR被破坏。

注意

指令BL和B的区别在于,跳转指令B只能使程序跳转到C或C++程序的一个地址标号,不能用于子程序调用。

9.内嵌汇编中的标号

内联汇编代码中定义的标号可被用作跳转或C和C++"goto"语句的目标。在内联汇编代码中,C和C++中定义的标号可被用作跳转指令的目标。

10.内嵌汇编器版本间的差异

不同版本的ARM编译器对内联汇编程序的语法要求有显著差异。在具体使用时请参见相关文档。

· 如果使用的是 ADS v1.2,请参阅 ADS 开发者指南;

· 如果使用的是 RVCT v1.2,请参阅 RealView 编译工具 1.2 版开发者指南。

12.1.2 嵌入式汇编

利用 ARM 编译器可将汇编代码包括到一个或多个C或C++函数定义中去。嵌入式汇编器提供对目标处理器不受限制的低级别访问,利用它可以使用C和C++预处理程序伪操作(preprocessor directive)并可以方便的使用偏移量访问结构成员。

本小节将介绍以下内容:

· 嵌入式汇编程序语法;

· 嵌入式汇编语句的限制;

· 嵌入式汇编程序表达式和C或C++表达式之间的差异;

· 嵌入式汇编函数的生成;

· __cpp 关键字;

· 手动重复解决方案;

· 相关基类的关键字;

· 成员函数类的关键字;

· 调用非静态成员函数。

有关为 ARM 处理器编写汇编语言的详细信息,请参阅ADS或RealView编译工具的汇编程序指南。

1.嵌入式汇编语言语法

嵌入式汇编函数定义由 --asm(C和C++)或asm(C++) 函数限定符标记,可用于:

· 成员函数;

· 非成员函数;

· 模板函数;

· 模板类成员函数。

用__asm或asm声明的函数可以有调用参数和返回类型。它们从C和C++中调用的方式与普通C和C++函数调用方式相同。嵌入式汇编函数语法是:

__asm return-type function-name(parameter-list)

{

// ARM/Thumb/Thumb-2 assembler code

instruction[;instruction]

...

[instruction]

}

嵌入式汇编的初始执行状态是在编译程序时由编译选项决定的。这些编译选项如下所示:

· 如果初始状态为ARM状态,则内嵌汇编器使用--arm选项;

· 如果初始状态为Thumb状态,则内嵌汇编器使用--thumb选项。

注意

嵌入式汇编的初始状态由编译器的编译选项确定,与程序中的#pragma arm 和 #pragma thumb伪操作无关。

可以显示地使用ARM、THUMB和CODE16伪操作改变嵌入式汇编的执行状态。关于ARM伪操作的详细信息请参加指令伪操作一节。如果使用的处理器支持Thumb-2指令,则可以在Thumb状态下,在嵌入式汇编中使用Thumb-2指令。

参数名允许用在参数列表中,但不能用在嵌入式汇编函数体内。例如,以下函数在函数体内使用整数i,但在汇编中无效:

__asm int f(int i) {

ADD i, i, #1 // 编译器报错

}

可以使用 r0 代替 i。

下面通过嵌入式汇编的例子,来进一步熟悉嵌入式汇编的使用。

下面的例子实现了字符串的拷贝,注意和上一节中内联汇编中字符串拷贝的例子相比较,分析其中的区别。

#include <stdio.h>

__asm void my_strcpy(const char *src, const char *dst) {

loop

LDRB r3, [r0], #1

STRB r3, [r1], #1

CMP r3, #0

BNE loop

MOV pc, lr

}

void main()

{

const char *a = "Hello world!";

char b[20];

my_strcpy (a, b);

printf("Original string: '%s'\n", a);

printf("Copied string: '%s'\n", b);

}

2.嵌入式汇编语言的使用限制

嵌入式汇编的使用有下面一些限制。

① 在预处理之后,__asm 函数只能包含汇

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top