混合使用C、C++和汇编语之:内联汇编和嵌入型汇编的使用
达式。列表中的值可以是物理寄存器、可修改长值表达式或单个物理寄存器名称。
内联汇编程序从特定的物理寄存器中取值并赋值到特定的表达式中。指定物理寄存器名称而并不赋值,导致相同名称虚拟寄存器被物理寄存器中的值更新。
例如,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 函数只能包含汇
C C++ 汇编语言 ARM 内联汇编 嵌入型汇编 相关文章:
- RedHatLinux新手入门教程(5)(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- VXWORKS内核分析(11-11)
- 嵌入式开发工具简介(11-09)
- Linux2.4内核为我们带来了什么?(11-12)
- RedHatLinux新手入门教程(11-12)