如何将机器指令解码为 LEGv8 中的汇编?
How do I decode a machine instruction to assembly in LEGv8?
我无法弄清楚 LEGv8 机器指令是如何解码的。假设以下二进制文件:
1000 1011 0000 1111 0000 0000 0001 0011
我有下面的图表可以帮助我解码:
前 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
Rd = 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
已知书籍包含错误 ;)
我无法弄清楚 LEGv8 机器指令是如何解码的。假设以下二进制文件:
1000 1011 0000 1111 0000 0000 0001 0011
我有下面的图表可以帮助我解码:
前 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
Rd = 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
已知书籍包含错误 ;)