tomoyuki-nakabayashi / Rustemu86

Apache License 2.0
5 stars 0 forks source link

ロードストア命令を作る #10

Closed tomoyuki-nakabayashi closed 6 years ago

tomoyuki-nakabayashi commented 6 years ago

とりあえず最初の一歩!

tomoyuki-nakabayashi commented 6 years ago
mov [rax], rbx
mov rcx, [rax]
0x488918
0x488b08
tomoyuki-nakabayashi commented 6 years ago

REXプレフィックス(0x48) + primary opcode (0x89/0x8b) + modrm (0x18/0x08)

tomoyuki-nakabayashi commented 6 years ago

modrm

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

mov [rax], rbx

0b00 -> displacementなしのレジスタ間接
0b011 -> Rbx
0b000 -> Rax

mov rcx, [rax]

0b00 -> displacementなしのレジスタ間接
0b010 -> Rcx
0b000 -> Rax
tomoyuki-nakabayashi commented 6 years ago

今の実装ではデコード時にメモリアクセスしないといけない。やはりデコーダがやることを減らして、実行ステージに持っていく必要がある。

tomoyuki-nakabayashi commented 6 years ago

traitの中に関連型(associated type)を書くとテンプレートで返り値を定義できる。 が、単純にtrait objectが作れない?

関連型を持ったtraitをtrait objectしたい。

tomoyuki-nakabayashi commented 6 years ago

https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/associated-types.html

ふむ。単純には多相できないな。

tomoyuki-nakabayashi commented 6 years ago

あきらめた。

tomoyuki-nakabayashi commented 6 years ago

デコードをディレクトリ掘ったモジュールにしたい気持ちがあるが、今は不都合ないので良いか。

ex_stageはディレクトリを掘りたい。

tomoyuki-nakabayashi commented 6 years ago

が、まあ一旦Load命令を作るか。

tomoyuki-nakabayashi commented 6 years ago

u64からbytearrayに直すには、nightlyの機能が必要。仕方ないnightlyにしよう!

tomoyuki-nakabayashi commented 6 years ago

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;
    }
  }