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

时间:2013-09-30来源:网络

例如,指令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被破坏。

注意

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

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伪操作无关。

1 2 3 4 5 6 7 8 9 10 11

关键词: C C++ 汇编语言 内联汇编 嵌入型汇编 ARM

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版