混合使用C、C++和汇编语之:内联汇编和嵌入型汇编的使用
可以显示地使用ARM、THUMB和CODE16伪操作改变嵌入式汇编的执行状态。关于ARM伪操作的详细信息请参加指令伪操作一节。如果使用的处理器支持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
CMPr3,#0
BNEloop
MOVpc,lr
}
voidmain()
{
constchar*a=Helloworld!;
charb[20];
my_strcpy(a,b);
printf(Originalstring:'%s'n,a);
printf(Copiedstring:'%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或C++函数相互调用时,未必可用,因为此调用也必须遵循AAPCS规则。
c语言相关文章:c语言教程
c++相关文章:c++教程
评论