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

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

可以显示地使用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规则。

1 2 3 4 5 6 7 8 9 10 11

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

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

或用微信扫描左侧二维码

相关文章

查看电脑版