使用ARM汇编器的GCC行为异常。 ANDSEQ指令

时间:2018-07-05 06:48:31

标签: gcc assembly arm

如果我尝试汇编此程序:

.text
main:
 andseq r1,r3,r2,lsl #13

使用命令gcc -c test.s,出现以下错误:

Error: bad instruction `andseq r1,r3,r2,lsl#13'

经过几次尝试,我将andseq替换为andeqs,现在可以正常编译了。

但是如果我用objdump -d test.o转储生成的obj文件,我会得到:

Disassembly of section .text:

00000000 <main>:
   0:   00131682        andseq  r1, r3, r2, lsl #13

请注意如何将指令解码为andseq...。

我想念什么吗?这是错误吗?

我的系统是Raspbian GNU / Linux 8,我的gcc是:gcc(Raspbian 4.9.2-10)4.9.2。我也用gcc-8.1.0(编辑,不是真的看到编辑)进行了测试,结果相同。

编辑:

实际上,我似乎在gcc8中使用了相同的binutils,因此我实际上只测试了此GNU assembler (GNU Binutils for Raspbian) 2.25。我将尝试使用较新的汇编器。

2 个答案:

答案 0 :(得分:3)

为了与旧的汇编文件兼容,GNU缺省为ARM汇编的分开语法。在分开的语法中,andeqs是您所需指令的正确助记符。您可以发出.syntax unified指令来选择统一语法,其中andseq是正确的助记符。

另一方面,GNU objdump只知道统一的语法,这说明了明显的不一致。

对于新的发展,我建议您尽可能使用统一语法。

答案 1 :(得分:0)

ARMv8附录K6“ AArch32指令集的传统指令语法”上有一个不错的UAL与UAL助记符表

该表的条目之一是:

array([ True, False,  True,  True,  True])

其中Pre-UAL syntax UAL equivalent AND<c>S ANDS<c> 是可能的条件代码eq之一。