在c/c++代码中嵌入汇编指令

11-20| http://www.dianzi6.com | EDA/PLD|人气:826

在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的值,也是没有必要的。

  


如果觉得 在c/c++代码中嵌入汇编指令这篇文章不错,可以推荐给朋友分享哦。
本文Tags:eda技术,eda技术实用教程,EDA/PLD,
相关EDA/PLD资料


温馨提示; 本站的资料全部免费下载,为方便下次找到本站记得将本站加入收藏夹哦,牢记网址http://www.dianzi6.com

此页提供在c/c++代码中嵌入汇编指令eda技术,eda技术实用教程, EDA/PLD参考。本站还有更多的EDA/PLD相关资料分享。
Copyright© www.dianzi6.com Inc. All rights reserved 。 1 2 3 4 5 6 7 8