在c/c++代码中嵌入汇编指令
扫描二维码
随时随地手机看文章
在ARM C语言程序中使用关键词 ̄asm来标识一段汇编指令程序,其格式如下。
其中,asm后面的括号中必须是一个单独的字符串,该字符串中不能包含注释语句。
在C/C++程序中使用内嵌的汇编指令应注意以下事项。
在汇编指令中,逗号(,)用作分隔符。因此如果指令中的C/C++表达式中包含有逗号(,),则该表达式应该被包含在括号中。例如:
其中,(f(),Z)为C/C++表达式
如果在指令中使用物理寄存器,则应该保证该寄存器不会被编译器在计算表达式值时破坏。例如,在下面的代码段中,编译器通过程序调用来计算表达式x/y的值。在这个过程中编译器破坏了寄存器R2、R3、IP、LR的值;更新了CPSR寄存器的NZCV条件标志位;并在寄存器R0中返回表达式的商,在寄存器RI中返回表达式的余数。这时程序中寄存器R0的数据就丢掉了。
这种情况下可以用C变量来代替第1条指令中的物理寄存器RO,如下所示。
这时编译器将会为变量cvar分配合适的寄存器,从而避免冲突的发生。如果编译器不能分配合适的寄存器,那么它将报告错误。例如,在下面的代码段中,由于编译器将会展开ADD指令,在展开时会用到P寄存器,从而破坏了第1条指令为IP寄存器赋的值,这时编译器将报告错误。
不要使用物理寄存器去引用一个C变量。比如,在下面的例子中,用户可能认为进入子程序example1中后,参数x的值保存在寄存器RO中,因而在内嵌的汇编指令中直接使用寄存器RO,最后返回结果。实际上,编译器认为子程序中没有作任何有意义的操作,于是将该段汇编代码优化掉了,从而返回的结果与输八的参数值相同,并没有做加1操作。
对于内嵌汇编器可能会用到的寄存器,编译器自己会保存和恢复这些寄存器,用户不用保存和恢复这些寄存器。除常量寄存器CPSR和寄存器SPSR外,其他寄存器必须先赋值后读取,否则编译器将会报错。例如,在下面的例子中,第1条指令在没有给寄存器R0赋值前读取其值,这是错误的;而最后一条指令恢复寄存器R0的值,也是没有必要的。
来源:ks990次