Closed tomoyuki-nakabayashi closed 6 years ago
mov [rax], rbx
mov rcx, [rax]
0x488918
0x488b08
REXプレフィックス(0x48) + primary opcode (0x89/0x8b) + modrm (0x18/0x08)
modrm
7 0
+---+---+---+---+---+---+---+---+
| mod | reg | rm |
+---+---+---+---+---+---+---+---+
mov [rax], rbx
0b00 -> displacementなしのレジスタ間接
0b011 -> Rbx
0b000 -> Rax
mov rcx, [rax]
0b00 -> displacementなしのレジスタ間接
0b010 -> Rcx
0b000 -> Rax
今の実装ではデコード時にメモリアクセスしないといけない。やはりデコーダがやることを減らして、実行ステージに持っていく必要がある。
traitの中に関連型(associated type)を書くとテンプレートで返り値を定義できる。 が、単純にtrait objectが作れない?
関連型を持ったtraitをtrait objectしたい。
あきらめた。
デコードをディレクトリ掘ったモジュールにしたい気持ちがあるが、今は不都合ないので良いか。
ex_stageはディレクトリを掘りたい。
が、まあ一旦Load命令を作るか。
u64からbytearrayに直すには、nightlyの機能が必要。仕方ないnightlyにしよう!
nightlyからstableに戻した。unsafe使わない方法を考えても良いが、このくらいなら、という気持ちもある。
pub fn write64(&mut self, addr: usize, data: u64) {
let bytes: [u8; mem::size_of::<u64>()] = unsafe{ mem::transmute(data) };
for (pos, byte) in bytes.iter().enumerate() {
self.ram[addr + pos] = *byte;
}
}
とりあえず最初の一歩!