5

LEGv8 マシン命令がどのようにデコードされるかがわかりません。次のバイナリを想定します。

1000 1011 0000 1111 0000 0000 0001 0011

デコードに役立つはずの次のチャートがあります。

LEGv8 命令のエンコード/デコード表

最初の 11 ビット10001011000は 10 進数の1112に対応し、チャートによるとこれはADD命令です。だから私は命令のこの部分を決定する方法を知っています (より良いアプローチがない限り、これは 11 ビットではないオペコードでは機能しないのでしょうか?)。この時点で、私はどのように進めるべきかについて混乱しています。

ADD は命令形式R形式であることを知っているため、ビットは次のように配置されます。

opcode: 11 ビット
Rm: 5 ビット
shamt: 6 ビット
Rn: 5 ビット
Rd: 5 ビット

これらのフィールドサイズを知っている最初のバイナリマシン命令をレイアウトしようとしています...

opcode = 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
これは、シャムの 6 ビットの次の 5 ビットです。

Rd = 1000 1011 0000 1111 0000 0000 000 1 0011 = 10011
これはバイナリ マシン命令の最後の 5 ビット (Rn の 5 ビットの後の 5 ビット) です。

Rm、Rn、Rd を 2 進数から 10 進数に変換すると、次のようになります。

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

したがって、最初のバイナリ マシン命令をアセンブリ ステートメントにデコードするための私の最終的な答えは、ADD X19, X0, X15 になります。

ただし、この例の教科書の回答はADD X16, X15, X5です。どこで私は間違えましたか?

4

1 に答える 1

6

あなたのソリューションは正しいようで、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

本にはエラーが含まれていることが知られています ;)

于 2016-10-13T15:40:56.163 に答える