インドリ「あれっ?ここは何処?何をしていたんだっけ・・・」
インドリはいきなり意識を断たれたので暫くの間今おかれている間状況が把握できなかった。
インドリ「うーんとえーと・・・はっそうだ!MOV命令の実装をしていたんだ。それで・・・」
インドリはドリィちゃんが傍に居ないか恐々回りを伺った・・・その結果、幸い居ないことが確認できた。
インドリ「よし鬼の居ぬ間に洗濯だ!」
インドリは何時もの様に
Intelマニュアル中のA-6・オペコードマップを見た。
そして、
行A・列3で目的のMOV命令を発見した。
インドリ「早速実装だ!まずはオペコードマップの実装だぁ〜」
注目するべき部分だけ抜粋
public static OpeCodeInfo SearchOpeCode( byte value ) {
case 10:
switch ( col ) {
case 3:
info.Name = CommandName.MOV;
info.NextType = NextInfoType.DestinationAddressAndRegiser;
info.DestinationAddressMode = AddressingMode.O;
info.DestinationOperand = OperandType.v;
info.SourceRegister = RegisterName.eAX;
break;
}
}
インドリ「次は命令解析部分だぁ〜、おりゃぁ〜」
注目するべき部分だけ抜粋
public void AnalyzeCommand( ) {
foreach ( byte data in datas ) {
OpeCodeInfo info = SearchOpeCode( data );
Command cmd = new Command( );
switch ( info.NextType ) {
case NextInfoType.DestinationAddressAndRegiser:
//しまった!まだ実装していない。
cmd.SourceRegister = GetRegister( info );
SearchModRM( ref cmd );
break;
}
cmds.Enqueue(cmd);
}
インドリ「GetRegisterとSearchModRMについては改めて解説するよ。次はついに命令の実行だー。犯人はお前ダー。」
br>
注目するべき部分だけ抜粋
public void ExecuteCommand( ) {
foreach ( Command cmd in cmds ) {
//途中省略
switch ( cmd.Name ) {
case CommandName.MOV:
Mov( cmd );
break;
}
}
}
注目するべき部分だけ抜粋
private void Mov( Command cmd ) {
switch ( cmd.NextType ) {
case NextInfoType.DestinationAddressAndRegiser:
//CPUを持つPCのメモリにデータを送信。
SendData(
cmd.DestinationAddress,
cmd.SourceValueLength,
cmd.SourceValue );
break;
}
}
インドリ「よし!今日は調子がいいぞ。きりが良いので今回の記事は終えて、
次の記事で、逆にレジスタにメモリ内のデータを受け取る場合を書くよ。今から書くからちょっとだけ待ってね。」