【问题标题】:Wierd GCC behaviour with ARM assembler. ANDSEQ instructionARM 汇编程序的奇怪 GCC 行为。 AND SEQ 指令
【发布时间】: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?)?

标签: gcc assembly arm


【解决方案1】:

为了与旧的程序集文件兼容,GNU 默认为 ARM 程序集的分割语法。在分割语法中,andeqs 是您想要的指令的正确助记符。您可以发出.syntax unified 指令来选择统一语法,其中andseq 是正确的助记符。

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

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

【讨论】:

    【解决方案2】:

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

    该表的条目之一是:

    Pre-UAL syntax    UAL equivalent
    AND<c>S           ANDS<c>
    

    其中eq 是可能的条件代码之一&lt;c&gt;。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      • 2022-08-11
      • 1970-01-01
      • 2011-02-18
      相关资源
      最近更新 更多