代码之家  ›  专栏  ›  技术社区  ›  fonkap

使用arm汇编程序的wierd-gcc行为。andseq指令

  •  3
  • fonkap  · 技术社区  · 7 年前

    如果我尝试汇编此程序:

    .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 我明白了:

    Disassembly of section .text:
    
    00000000 <main>:
       0:   00131682        andseq  r1, r3, r2, lsl #13
    

    注意如何将指令解码为 和序列 ……

    我遗漏了什么吗?这是虫子吗?

    我的系统是raspbian gnu/linux 8,我的gcc是:gcc(raspbian 4.9.2-10)4.9.2。我也用gcc-8.1.0(edit,不是真正的edit)进行了测试,得到了相同的结果。

    编辑:

    事实上,看起来我在gcc8中使用了相同的binutils,所以我只测试了这个 GNU assembler (GNU Binutils for Raspbian) 2.25 是的。我会试试更新的汇编程序。

    2 回复  |  直到 7 年前
        1
  •  3
  •   fuz    7 年前

    为了与旧程序集文件兼容,gnu默认为 分裂语法 用于臂组件。在分裂的语法中, andeqs 是你想要的正确的助记符。你可以发行 .syntax unified 用于选择统一语法的指令,其中 andseq 是正确的助记符。

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

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

        2
  •  0
  •   Ciro Santilli    7 年前

    ARMv8 附录K6“AARCH32指令集的传统指令语法”

    该表的条目之一是:

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

    在哪里? eq 是可能的条件代码之一 <c> 是的。