Closed tomoyuki-nakabayashi closed 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はなんだ?
あれ、これ0x48 0xff 0xc0までがinc命令なのか?
オペランドをrbxにすると、0x48ffc3になった。ここまでが命令か。cがなんだ…。
やっぱModR/Mか。
7 0
+---+---+---+---+---+---+---+---+
| mod | reg | rm |
+---+---+---+---+---+---+---+---+
modはb11が普通らしい。
https://www.mztn.org/lxasm64/amd05.html
modが00なら[reg], 01なら[reg+disp8], 10なら[reg+disp32], 11ならreg。 やばいな、これは…。
後でwikiに参考ページをまとめておこう。
http://nantonaku-shiawase.hatenablog.com/entry/2016/10/25/231833
regとrmはどちらもレジスタを指すので、同じようなモノ
わかるか!こんなもん!
さて、実はここまで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をそれぞれ入れ替えなければいけない。
http://ref.x86asm.net/coder64.html
このページでオペランドが、r/m16とかってなっているのって、ModR/Mのどこをオペランドにするか、ってことなのか?
http://www.c-jump.com/CIS77/CPU/x86/X77_0060_mod_reg_r_m_byte.htm
なるほど。
- the second operand in a two-operand instruction, or
- the only operand in a single-operand instruction like NOT or NEG.
Copy traitの継承にはClone traitも必要、と。cloneは明示的に書く。
add rax, rcx
0x48 0x01 0xc8
プレフィックス0x48, オペコード0x01, mod: 0b11, reg: 0b001, r/m:0b000。 op1がr/m, op2がreg。
http://ref.x86asm.net/coder64.html https://wiki.osdev.org/X86-64_Instruction_Encoding http://ref.x86asm.net/