【发布时间】:2018-07-05 06:48:30
【问题描述】:
如果我尝试组装这个程序:
.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。我会尝试更新的汇编程序。
【问题讨论】:
-
如果汇编器和反汇编器对谓词与 set-flags 选项的顺序不一致,这听起来很糟糕。
-
我同意,但我很难相信
-
是的,你认为现在有人会注意到,除非它只在特定版本的反汇编程序中被破坏?您是否尝试过其他版本的
objdump或llvm-objdump?另外,您的 gcc-8.1 安装是否包含更新的 binutils?因为 gcc 本身根本不包含汇编程序,所以它依赖于 binutils 中的as。 (即使你编译 C,gcc 实际上会生成一个.s并在其上运行as,或者将其通过管道传输到as。)因此,不同的 gcc 前端可能根本不是一个有用的测试。跨度> -
这可能是统一语法和拆分语法之间的区别吗?
-
@fonkap 尝试使用
.syntax unified或.syntax divided来选择汇编器的语法(如手册中所示)。我看不出如何设置objdump的语法;也许其中一个默认为统一语法(objdump?),而另一个默认为划分语法(as?)?