在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)
上一篇:从汇编程序中访问C程序变量
上一篇:汇编语言的程序结构