新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 混合使用C、C++和汇编语之:内联汇编和嵌入型汇编的使用

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

作者:时间:2013-09-30来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257034.htm

例如,指令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)被破坏的寄存器列表(orruptedregisterlist)

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

BL和SWI指令总是破坏lr。

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

注意

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

9.内嵌汇编中的标号

代码中定义的标号可被用作跳转或C和“goto”语句的目标。在代码中,C和中定义的标号可被用作跳转指令的目标。

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

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

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

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

12.1.2嵌入式汇编

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

本小节将介绍以下内容:

·嵌入式汇编程序语法;

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

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

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

·__cpp关键字;

·手动重复解决方案;

·相关基类的关键字;

·成员函数类的关键字;

·调用非静态成员函数。

有关为处理器编写的详细信息,请参阅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++教程




评论


相关推荐

技术专区

关闭