python内嵌c和汇编_LinuxC嵌⼊汇编(内联)注意事项-修改
⼀般来讲,在C中内联汇编语句要⽐纯粹的汇编语⾔代码复杂的多,需要解决如何分配寄存器、如何与C代码中的变量相结合的问题。
在Linux下的arm汇编语法格式不同于ADS下⾯的汇编语法格式,但是arm的指令都遵从于ARM的规范。在Linux下的C程序⾥⾯内联汇编代码,特别需要注意格式的问题。
从⼤的⽅⾯来讲,内联的汇编代码在C源⽂件中的区域标识不同。最基本的格式是:
__asm__(“asm statements”);
如果是多条汇编指令的话,需要⽤”\n\t”将它们隔开。如下所⽰:
__asm__(
“asm statements\n\t”
“asm statements\n\t”
“asm statements”);
完整的内联汇编代码格式如下:
__asm__(“asm
statements” : outputs : inputs : registers-modified);
内联的汇编代码语句被”:”分割为4部分;其中,第⼀部分为汇编代码本⾝,通常成为指令部,格式与纯汇编代码是相同的。指令部是必须的,其他部分如果没有必要,可以省略。
在C中内联汇编,需要处理的⼀个问题就是如何与C语句中的变量相结合、传⼊汇编代码、从汇编代码中传出改变的值。在内联汇编代码的指令部中,使⽤占位符来表⽰需要使⽤寄存器的操作数,有⼏个占位符就表⽰有⼏个变量需要和寄存器相结合,汇编器在编译和连接的时候就会相应的根据后⾯的约束条件进⾏处理。
输出约束和输⼊约束的格式相同,是这样⼀种结构:
“constraint”(variable)
指令部后⾯紧接著就是输出部,它⽤来规定输出变量如何与占位符来结合。每⼀个条件可以成为⼀个约束,必要的时候可以使⽤多个约束,相互之间使⽤逗号隔开。⼀般情况下,每个输出约束都是以输出修饰符=开始,然后紧跟⼀个约束代码,最后是相结合的变量名称。如果变量既需要输⼊⼜需要输出,那么必须使⽤修饰符+。
紧接着就是输⼊部,它⽤来规定仅仅作为输⼊的变量如何与占位符相结合。它与输⼊部相似,由于只是输⼊,所以⼀般是不⽤输出修饰符(⽐如上⾯提到的=和+)的。
有时进⾏某些操作的时候,可能还会需要多个寄存器来保存中间的结果,这样就难免会破坏原有寄存器的内容。在gcc内联汇编的格式中的最后⼀部分可以对将产⽣副作⽤的寄存器进⾏说明,以便gcc能够采⽤相应的措施。
常见的输⼊输出修饰符和约束代码介绍
约束代码意义
r使⽤任何可⽤的通⽤寄存器
m使⽤变量的内存位置
g使⽤任何可⽤的寄存器和内存位置
i使⽤⽴即数的值
输⼊输出修饰符意义
=只能写⼊操作数
+可读可写操作数
&在内联函数完成之前,可以删除或者重新使⽤操作数⼀个内联汇编的实例
#include
int main(){
int a = 10, b =
0, c = 0;汇编指令有多少个
__asm__
__volatile__(
“movr0,
%2\n\t”
“addr0,
r0, #5\n\t”
“mov%1,
r0\n\t”
“mov%0,
r0”
: “=r”(b),
“=r”(c)
: “r”(a));
printf(“b =
%d\nc= %d\n”, b, c);
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。