バイナリをつつく19-愛のメモリー5依存する愛はいらない
インドリィちゃん「惚けるつもり?貴方がそのつもりなら・・・」
ドリィちゃんはおもむろにインドリからキーボードを取り上げるとアクセス修飾子を変更し始めた。
注目するべき部分だけ抜粋
protected uint EAX {
get { return this.eax.ValueU32; }
set { this.eax.ValueU32 = value; }
}
protected ushort AX {
get { return this.eax.ValueU16; }
set { this.eax.ValueU16 = value; }
}
protected byte AH {
get { return this.eax.ValueHighByte; }
set { this.eax.ValueHighByte = value; }
}
protected byte AL {
get { return this.eax.ValueLowByte; }
set { this.eax.ValueLowByte = value; }
}
インドリ「なっ何を、これじゃレジスタがマシンオブジェクトから見えないじゃないか。」
さらにドリィちゃんは、インドリが実装したイベント関係のコードを全て消した。
インドリィちゃん「見えなくしているのよ。見えるから依存するのよ。」
インドリ「ドリィちゃん何のことを言っているの?」
インドリィちゃん「CPUオブジェクトのレジスタプロパティに直接触れるということは、 マシンオブジェクトがCPUオブジェクトのプロパティに依存しちゃう。それじゃあ駄目。」
インドリ「何がいけないのさ。互いに協力し合えばいいじゃないか?」
インドリィちゃん「CPUはIntel製だけじゃないの。他にもARM、PowerPCとか色々あるのよ。 それにオブジェクトが依存しすぎると再利用しにくいのよ。依存しすぎるとろくでも無しに人生壊されるわ。」
インドリ「・・・今さらりと凄いこと言ったような・・・おっほん。でもさぁ、現実にマザーボードによってのせられるCPUが限定されているからいいじゃない?」
インドリィちゃん「マザーボードオブジェクト作る気ならば・・・」
インドリ「ちょっ、今のはなし。わかったよ。」
インドリィちゃん「始めからそういえばいいのよ。それに直接レジスタが操作できるんだったらMOV命令の意味がないじゃない。」
インドリ「うっそれもそうだ。でもじゃあどうやってレジスタに値を設定するの。」
インドリィちゃん「まったく、もぉ。だからMOV命令とイベントがあるんでしょ。」
インドリ「あっそうか!新しいイベントを作ればいいんだね。」
インドリィちゃん「ちょっと待ちなさい。既にマシンオブジェクトにイベント定義しているわよね。 何故それを使わなかったの?」
インドリ「ドリィちゃんが作れって言ったけど面倒だからね。」
インドリィちゃん「やっぱり裏切ったのねぇぇぇぇ。」
インドリ「ごめんごめん。ちゃんと作るから許して。」
インドリは身の危険を感じあわててマシンオブジェクトのイベントを変えた。
その定義をみんなも見てみよう。
//データをメモリへ送信するイベントのデータ
public abstract class SendDataEventArgs
{
private byte[ ] datas;
public byte[ ] SendDatas {
get { return datas; }
}
public SendDataEventArgs( byte[ ] datas ) {
this.datas = datas;
}
}
//IntelCPU用データ送信イベントの情報
public class SendDataToIntelEventArgs : SendDataEventArgs
{
private RegisterName target;
public RegisterName Target {
get { return target; }
}
public SendDataToInterlEventArgs( byte[ ] datas, RegisterName target )
: base( datas )
{
this.target = target;
}
}
インドリ「インドリちゃんこれでいい?」インドリィちゃん「貴方にしてはいいほうね。っと言いたいところだけど前のイベント定義間違っていたわよ。」
インドリ「ピィ~」
//メモリデータが必要なことを通知するイベントの情報
public class RequestMemoryDataEventArgs : EventArgs
{
private uint start;
public uint StartAddress {
get { return start; }
set { start = value; }
}
private byte length;
public byte DataLength {
get { return length; }
set { length = value; }
}
public RequestMemoryDataEventArgs( uint startAddress, byte dataLength ) {
this.start = startAddress;
this.length = dataLength;
}
}
public class RequestMemoryDataToIntelEventArgs : RequestMemoryDataEventArgs
{
private RegisterName register;
public RegisterName Target {
get { return register; }
set { register = value; }
}
public RequestMemoryDataToIntelEventArgs( uint startAddress,
byte dataLength,
RegisterName register ) : base(startAddress, dataLength)
{
this.register = register;
}
}
インドリ「あれ?でもドリィちゃん。
このイベントを定義しても結局Machineオブジェクトに実装してしまうとCPUオブジェクトに依存してしまうピッヨ。」インドリィちゃん「それはねぇ、・・・・・秘密よ。」
インドリ「ちょっ。」
インドリィちゃん「冗談はさておき次回へ続く。」
インドリ「えぇ~そりゃないよ~」
説明が長くなるので次回へ続く。