Jas*_*Fel 4 assembly machine-language instruction-set instructions arm64
我无法弄清楚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 000 0 1111 0000 0000 0001 0011 = 10001011000
这是初始二进制机器指令的前11位.
Rm = 1000 1011 000 0 1111 0000 0000 0001 0011 = 01111
这是操作码的初始11位之后的下5位.
shamt = 1000 1011 0000 1111 0000 00 00 0001 0011 = 000000
这是Rm的5位之后的下6位.
Rn = 1000 1011 0000 1111 0000 00 00 000 1 0011 = 00000
这是shamt的6位之后的下5位.
Rd = 1000 1011 0000 1111 0000 0000 000 1 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
Run Code Online (Sandbox Code Playgroud)
已知书籍包含错误;)
| 归档时间: |
|
| 查看次数: |
4022 次 |
| 最近记录: |