新闻中心

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

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

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

本文引用地址://m.amcfsurvey.com/article/257034.htm

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

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

__asmintf(inti){

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

}

可以使用r0代替i。

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

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

#includestdio.h>

__asmvoidmy_strcpy(constchar*src,constchar*dst){

loop

LDRBr3,[r0],#1

STRBr3,[r1],#1

MPr3,#0

BNEloop

MOVpc,lr

}

voidmain()

{

constchar*a=Helloworld!;

charb[20];

my_strcpy(a,b);

printf(Originalstring:'%s'n,a);

printf(opiedstring:'%s'n,b);

}

2.嵌入式的使用限制

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

①在预处理之后,__asm函数只能包含汇编代码,但以下标识符除外:

·__cpp(expr);

·__offsetof_base(D,B);

·__mcall_is_virtual(D,f);

·__mcall_is_in_vbase(D,f);

·__mcall_this_offset(D,f);

·__vcall_offsetof_vfunc(D,f);

②编译程序不为__asm函数生成返回指令。如果要从__asm函数返回,必须将用汇编代码编写的返回指令包含到函数体内。由于嵌入式汇编执行__asm函数的顺序是在编译时定义好的,所有从一个内嵌汇编跳转到一个内嵌汇编程序是运行的,但在中却不能实现。

③__asm函数调用遵循AAPCS规则。所以,即使在__asm函数体内可用的汇编代码(例如,更改状态),在__asm函数和普通C或函数相互调用时,未必可用,因为此调用也必须遵循AAPCS规则。

c语言相关文章:c语言教程


c++相关文章:c++教程




评论


相关推荐

技术专区

关闭