AT&T格式的arm汇编

这段时间在交叉编译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手动载入。当然寄存器也是直接指明了损坏部的东西。

上面是些很浅的经验了,希望对大家有些帮助吧。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值