【问题标题】:How do I decode a machine instruction to assembly in LEGv8?如何在 LEGv8 中将机器指令解码为汇编?
【发布时间】:2016-10-13 15:24:36
【问题描述】:

我无法弄清楚 LEGv8 机器指令是如何解码的。假设以下二进制:

1000 1011 0000 1111 0000 0000 0001 0011

我有以下图表可以帮助我解码:

前 11 位 10001011000 对应十进制 1112,根据图表,这是 ADD 指令。所以我知道如何确定这部分指令(除非有更好的方法,也许这不适用于不是 11 位的操作码?)。在这一点上,我对如何继续感到困惑。

我知道 ADD 是指令格式 R-format 所以位的布局如下:

操作码:11 位
Rm: 5 位
沙姆特:6 位
Rn:5 位
Rd:5位

我尝试在知道这些字段大小的情况下布置初始二进制机器指令...

操作码 = 1000 1011 0000 1111 0000 0000 0001 0011 = 10001011000
这是初始二进制机器指令的前 11 位。

Rm = 1000 1011 0000 1111 0000 0000 0001 0011 = 01111
这是操作码的初始 11 位之后的下 5 位。

shamt = 1000 1011 0000 1111 0000 0000 0001 0011 = 000000
这是 Rm 的 5 位之后的下 6 位。

Rn = 1000 1011 0000 1111 0000 0000 0001 0011 = 00000
这是 shamt 的 6 位之后的下 5 位。

Rd = 1000 1011 0000 1111 0000 0000 0001 0011 = 10011
这是二进制机器指令中的最后 5 位(Rn 的 5 位之后的 5 位)。

将我得到的 Rm、Rn 和 Rd 的二进制转换为十进制:

Rm = 15 = X15
Rn = 0 = X0
Rd = 19 = X19

因此,我将初始二进制机器指令解码为汇编语句的最终答案是 ADD X19, X0, X15

然而,这个例子的教科书答案是 ADD X16, X15, X5。我哪里做错了?

【问题讨论】:

    标签: assembly arm64 instructions instruction-set machine-language


    【解决方案1】:

    您的解决方案似乎是正确的,并且与 gnu binutils 产生的输出相匹配:

    $ echo .int 0b10001011000011110000000000010011 > test.s
    $ as test.s && objdump -d a.out
    
    a.out:     file format elf64-littleaarch64
    Disassembly of section .text:
    
    0000000000000000 <.text>:
       0:   8b0f0013    add x19, x0, x15
    

    已知书籍包含错误;)

    【讨论】:

    • 我努力了很多,直到有人建议strip 代码。 $ echo .word 0b10001011000011110000000000010011 &gt; test.s$ aarch64-linux-gnu-as test.s &amp;&amp; aarch64-linux-gnu-strip a.out &amp;&amp; aarch64-linux-gnu-objdump -d a.out0: 8b0f0013 add x19, x0, x15
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多