tomoyuki-nakabayashi / Rustemu86

Apache License 2.0
5 stars 0 forks source link

Implement add instruction #6

Closed tomoyuki-nakabayashi closed 6 years ago

tomoyuki-nakabayashi commented 6 years ago

http://ref.x86asm.net/coder64.html https://wiki.osdev.org/X86-64_Instruction_Encoding http://ref.x86asm.net/

tomoyuki-nakabayashi commented 6 years ago
bits 64
  inc rax
$ hexdump add
0000000 ff48 00c0
prefix: 48
Mode of operation: E 
mnemonic: REX.W
description: 64 Bit Operand Size

0x48 0xff 0x00まではわかった。prefix, opcode, register。c0はなんだ?

tomoyuki-nakabayashi commented 6 years ago

あれ、これ0x48 0xff 0xc0までがinc命令なのか?

tomoyuki-nakabayashi commented 6 years ago

オペランドをrbxにすると、0x48ffc3になった。ここまでが命令か。cがなんだ…。

tomoyuki-nakabayashi commented 6 years ago

やっぱModR/Mか。

  7                           0
+---+---+---+---+---+---+---+---+
|  mod  |    reg    |     rm    |
+---+---+---+---+---+---+---+---+

modはb11が普通らしい。

tomoyuki-nakabayashi commented 6 years ago

https://www.mztn.org/lxasm64/amd05.html

modが00なら[reg], 01なら[reg+disp8], 10なら[reg+disp32], 11ならreg。 やばいな、これは…。

tomoyuki-nakabayashi commented 6 years ago

後でwikiに参考ページをまとめておこう。

tomoyuki-nakabayashi commented 6 years ago

http://nantonaku-shiawase.hatenablog.com/entry/2016/10/25/231833

regとrmはどちらもレジスタを指すので、同じようなモノ

tomoyuki-nakabayashi commented 6 years ago

わかるか!こんなもん!

さて、実はここまでregとr/mのどちらがどちらのレジスタを指定しているのか気になった人がいるかもしれない。その指摘はめっちゃ正しい。

Encoding x86 Instruction Operands, MOD-REG-R/M Byte
ここのサイトに答えが書いてある。

The d bit in the opcode determines which operand is the source, and which is the destination:

d=0: MOD R/M <- REG, REG is the source
d=1: REG <- MOD R/M, REG is the destination

"d"bitというのは、1byte(8bit)のデータを先頭から数えて4番目のbitである。*1
つまり、"d"bitが0か1かによってmodとr/mの3bitをそれぞれ入れ替えなければいけない。
tomoyuki-nakabayashi commented 6 years ago

http://ref.x86asm.net/coder64.html

このページでオペランドが、r/m16とかってなっているのって、ModR/Mのどこをオペランドにするか、ってことなのか?

tomoyuki-nakabayashi commented 6 years ago

http://www.c-jump.com/CIS77/CPU/x86/X77_0060_mod_reg_r_m_byte.htm

なるほど。

  1. the second operand in a two-operand instruction, or
  2. the only operand in a single-operand instruction like NOT or NEG.
tomoyuki-nakabayashi commented 6 years ago

Copy traitの継承にはClone traitも必要、と。cloneは明示的に書く。

tomoyuki-nakabayashi commented 6 years ago
  add rax, rcx
0x48 0x01 0xc8

プレフィックス0x48, オペコード0x01, mod: 0b11, reg: 0b001, r/m:0b000。 op1がr/m, op2がreg。