混合使用C、C++和汇编语之:内联汇编和嵌入型汇编的使用
例如,指令BLfoo{r0=expression1,r1=expression2,r2}生成以下伪代码:
MOV(physical)r0,expression1
MOV(physical)r1,expression2
MOV(physical)r2,(virtual)r2
BLfoo
(3)输出参数列表
输出参数列表{output_value_list}列出了用来存放功能函数和SWI调用返回值的寄存器或表达式。列表中的值可以是物理寄存器、可修改长值表达式或单个物理寄存器名称。
内联汇编程序从特定的物理寄存器中取值并赋值到特定的表达式中。指定物理寄存器名称而并不赋值,导致相同名称虚拟寄存器被物理寄存器中的值更新。
例如,BLfoo{},{result1=r0,r1}生成以下伪码:
BLfoo
MOVresult1,(physical)r0
MOV(virtual)r1,(physical)r1
(4)被破坏的寄存器列表(Corruptedregisterlist)
此列表指定被函数调用破坏的物理寄存器。如果条件标志被调用的函数修改,必须在被破坏的寄存器列表中指定PSR。
BL和SWI指令总是破坏lr。
如果指令中缺少此列表项,则r0~r3、ip、lr和PSR被破坏。
注意 |
9.内嵌汇编中的标号
内联汇编代码中定义的标号可被用作跳转或C和C++“goto”语句的目标。在内联汇编代码中,C和C++中定义的标号可被用作跳转指令的目标。
10.内嵌汇编器版本间的差异
不同版本的ARM编译器对内联汇编程序的语法要求有显著差异。在具体使用时请参见相关文档。
·如果使用的是ADSv1.2,请参阅ADS开发者指南;
·如果使用的是RVCTv1.2,请参阅RealView编译工具1.2版开发者指南。
12.1.2嵌入式汇编
利用ARM编译器可将汇编代码包括到一个或多个C或C++函数定义中去。嵌入式汇编器提供对目标处理器不受限制的低级别访问,利用它可以使用C和C++预处理程序伪操作(preprocessordirective)并可以方便的使用偏移量访问结构成员。
本小节将介绍以下内容:
·嵌入式汇编程序语法;
·嵌入式汇编语句的限制;
·嵌入式汇编程序表达式和C或C++表达式之间的差异;
·嵌入式汇编函数的生成;
·__cpp关键字;
·手动重复解决方案;
·相关基类的关键字;
·成员函数类的关键字;
·调用非静态成员函数。
有关为ARM处理器编写汇编语言的详细信息,请参阅ADS或RealView编译工具的汇编程序指南。
1.嵌入式汇编语言语法
嵌入式汇编函数定义由--asm(C和C++)或asm(C++)函数限定符标记,可用于:
·成员函数;
·非成员函数;
·模板函数;
·模板类成员函数。
用__asm或asm声明的函数可以有调用参数和返回类型。它们从C和C++中调用的方式与普通C和C++函数调用方式相同。嵌入式汇编函数语法是:
__asmreturn-typefunction-name(parameter-list)
{
//ARM/Thumb/Thumb-2assemblercode
instruction[;instruction]
...
[instruction]
}
嵌入式汇编的初始执行状态是在编译程序时由编译选项决定的。这些编译选项如下所示:
·如果初始状态为ARM状态,则内嵌汇编器使用--arm选项;
·如果初始状态为Thumb状态,则内嵌汇编器使用--thumb选项。
注意 | 嵌入式汇编的初始状态由编译器的编译选项确定,与程序中的#pragmaarm和#pragmathumb伪操作无关。 |
c语言相关文章:c语言教程
c++相关文章:c++教程
评论