Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在LEGv8中将机器指令解码为汇编?_Assembly_Arm64_Instructions_Instruction Set_Machine Language - Fatal编程技术网

Assembly 如何在LEGv8中将机器指令解码为汇编?

Assembly 如何在LEGv8中将机器指令解码为汇编?,assembly,arm64,instructions,instruction-set,machine-language,Assembly,Arm64,Instructions,Instruction Set,Machine Language,我很难弄清楚LEGv8机器指令是如何解码的。假设以下二进制代码: 1000 1011 0000 1111 0000 0000 0001 0011 我有下面的图表可以帮助我解码: 前11位10001011000对应于十进制1112,根据图表,这是ADD指令。所以我知道如何确定指令的这一部分(除非有更好的方法,否则这可能不适用于不是11位的操作码?)。在这一点上,我对如何进行感到困惑 我知道ADD是指令格式R格式,因此位的布局如下: 操作码:11位 Rm:5位 shamt:6位 Rn:5位 Rd:

我很难弄清楚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 10110000 1111 0000 0000 0001 0011=10001011000
这是初始二进制机器指令的前11位

Rm=1000 10110000 11110000 0000 0001 0011=01111
这是操作码初始11位之后的下一个5位

shamt=1000 1011 0000 11110000 0000 0001 0011=000000
这是Rm的5位之后的第6位

Rn=1000 1011 0000 1111 0000 0000 00010011=00000
这是SHMT的6位之后的下一个5位

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

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

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

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


然而,本例的教科书答案是添加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
$echo.int 0B100010110000111100000000010111>测试.s
$as test.s&&objdump-d a.out
a、 输出:文件格式elf64-LITLEARCH64
第节的分解。正文:
0000000000000000 :
0:8b0f0013添加x19、x0、x15

已知书籍包含错误;)

我努力了很久,直到有人建议我把代码去掉<代码>$echo.word 0b10001011000011110000000000010011>test.s
$aarch64 linux gnu as test.s&&aarch64 linux gnu strip a.out&&aarch64 linux gnu objdump-d a.out
0:8b0f0013添加x19、x0、x15