位置:51电子网 » 技术资料 » EDA/PLD

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

发布时间:2008/12/23 0:00:00 访问次数:1734

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

  欢迎转载,信息来自维库电子市场网(www.dzsc.com)



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

  欢迎转载,信息来自维库电子市场网(www.dzsc.com)



相关IC型号

热门点击

 

推荐技术资料

声道前级设计特点
    与通常的Hi-Fi前级不同,EP9307-CRZ这台分... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!