这段时间在交叉编译arm上的一些程序,因为效率问题需要用到汇编内嵌,上网找了很多,基于arm的AT&T格式汇编资料感觉很少的样子,于是有了下文,希望对需要的人有些帮助。当然,如果对AT&T不了解的话,建议先找找相关资料。
首先,arm汇编格式和 x86格式参数比较相反,目的寄存器在前,源寄存器在后,在AT&T格式的汇编下,需要遵从以下翻译规则:
1、对于寄存器指令而言,参数顺序统统反转。
比如add指令的格式为
add dest , op1 , op2
那么在编写AT&T指令的时候格式就应该是
add op2 , op1 , dest
刚好再次和x86格式相反。
2、对于含有立即数的指令,参数顺序不变。
比如str指令,后面直接跟内存地址时,参数顺序不交换
3、对于mov指令后面需要添加移位操作时,前面的参数顺序反转,但是移位指令同样在最后面。
其次,在书写arm关键字时,在后面添加volatile命令是必须的。
总之是很奇怪的一件事情,arm指令如果不加上volatile防止优化,很容易就出现segment fault,因此强制禁止优化也是必须的。相关原因还在寻找中,不排除我的程序有问题。
最后,也是最让人迷糊的一点,必须声明损坏部。
这个也是不能归结于某种原因的无道理东西。如果在输入部添加"r“直接读入寄存器,而不申明损坏部,必然会segment fault,同样不排除我程序的问题,但是事实上为了防止这个问题我的输入部和输出部的类型均是"m"内存类型的,使用时需要str手动载入。当然寄存器也是直接指明了损坏部的东西。
上面是些很浅的经验了,希望对大家有些帮助吧。