【问题标题】:ARM v7-M Instruction Set Decoding FunctionARMv7-M指令集编码功能
【发布时间】:2015-02-13 19:49:57
【问题描述】:

是否有针对 ARM v7-M 指令集的指令解码器,我可以给它一个操作码作为参数并返回相应的指令类型?

例如:MOV Rd, <op2>

根据<op2> 有四个不同的版本。

  1. 一个简单的寄存器说明符,例如Rm。
  2. 立即移位寄存器,例如 Rm, LSL #4。
  3. 寄存器移位寄存器,例如 Rm, LSL Rs。
  4. 立即数,例如#0xE000E000。

我想知道指令的opcode是哪个版本的?


编者注:opcode 表示实际的“十六进制”指令或机器编码。问题是关于汇编程序mnemonic。在许多 CPU 上,前导 助记符 可能会根据参数映射到不同的操作码(或机器指令)。

【问题讨论】:

    标签: compiler-construction arm instruction-set objdump


    【解决方案1】:

    是的,它被称为反汇编程序。将操作码放入汇编文件中,编译,然后反汇编。

    $ cat in.s
        .syntax unified
        .align  2
        .code   16
        .globl  _foo
        .thumb_func _foo
    _foo:
        .short  0x4615
        .long   0x43e0e92d
    
    $ clang -arch armv7m -c in.s
    $ otool -arch armv7m -tv in.o
    in.o:
    (__TEXT,__text) section
    _foo:
    00000000        4615    mov r5, r2
    00000002    e92d43e0    push.w  {r5, r6, r7, r8, r9, lr}
    

    【讨论】:

    • 感谢您的回答,但这不是我想要的。例如:MOV Rd,根据有四个不同的版本。 a) 一个简单的寄存器说明符,例如 Rm。 b) 立即移位寄存器,例如 Rm, LSL #4。 c) 一个寄存器移位寄存器,例如 Rm, LSL Rs。 d) 立即数,例如#0xE000E000。我想知道它是哪个版本,而无需对文件进行分解并对其进行解析以找出答案。如果没有工具,我想我需要解析它并弄清楚
    • @kkk 这个建议仍然适用。不要使用.short 和.long,而是编写您的实际代码并使用objdump 来查看汇编程序选择的操作码。另一种方法是生成列表文件。对于您的 mov 示例,选择的操作码将是显而易见的。例如,汇编器不会选择lsl #0 选项(如果存在)。取证可以使用这个选择来确定什么编译器/汇编器用于某事。有些指令不明确或有多种编码。 助记符甚至可以是一个伪指令并映射到多个操作码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2020-10-31
    相关资源
    最近更新 更多