assembly - 如何将机器指令解码为 LEGv8 中的汇编语言?

标签 assembly arm64 instructions instruction-set machine-code

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

1000 1011 0000 1111 0000 0000 0001 0011

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

LEGv8 instruction encoding/decoding chart

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

我知道ADD是指令格式R格式,因此位的布局如下:

操作码:11位
Rm:5位
shamt: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
路 = 19 = X19

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

但是,此示例的教科书答案是ADD X16、X15、X5。我哪里出错了?

最佳答案

您的解决方案似乎是正确的,并且也与 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

已知书籍包含错误;)

关于assembly - 如何将机器指令解码为 LEGv8 中的汇编语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40025077/

相关文章:

ios - stdargs [va_start()、va_arg() 等] 在 arm64 上损坏了吗?

assembly - ret 指令是否将 4 添加到 esp 寄存器?

assembly - [ebp*2] 是否引用 DS 或 SS 段?

c - 如何在 GCC 内联汇编中使用标签?

assembly - 对汇编中的指针和值感到困惑

c++ - 浮点比较 < 和 >= 生成的汇编中的严重差异

ios - 如何修复 clang 错误 : symbol(s) not found for architecture arm64

c - 内存加载何时会导致 x86-64 linux 上的总线错误?

ios - XCode:无法使用 -arch arm64 指定 -Q

assembly - 我如何找出英特尔处理器的 “processor family”是什么?