x86シミュレータの本まとめ

1972年intel が8008 8bitCPUx86じゃない。

1974後継の8080 8bit

1978 8086 16bit pc9801

後継の80286,386とをあわせてx86という。

80386は1985年。32bit 286は1982年。

 

ndisasm -b 32 a.out でアセンブラ表示。

objdumpでオブジェクトから、アセンブラとソース

 

命令が面倒。

inc とdecを判断するのにフラグにしてたり、Mod/RMとか。いろいろ。

 

C言語register int i;でレジスターに残せれる。

struct List;

struct List list;//コンパイルエラー。サイズがわからずどれだけメモリーをわりあてたらいいか不明のため。

structList *list;

 

struct List;

struct List *new_list(void);

void delete_list(struct List *l);

void list_push_back(struct List *l, int v);

int list_pop_back(struct List *l);

っていうヘッダの実装ができる。

 

C言語のローカル変数に関して。ローカル変数を確保すると、その瞬間にすタックポインタが移動するのではなく、関数呼び出しをした時点で、引数とローカル分確保される。

それで、ebpからの引き算とかでスタック内にアクセスする。開放はスタックフレームごと一気に開放される。

 

ブートのはなし

基本1セクタ512バイト。

BIOSは各デバイスの先頭の1セクタを見に行く。1セクタの最後の2バイトが0x55,0xaaだったら起動可能と判断する。その後、先頭セクタをメモリの0x7c00からの位置にコピーしてその後の処理が開始される。

基本的に0x7c00に置枯れることを想定しているため、アセンブラから機械語に変換するときに先頭にorg 0x7c00とかかいてればジャンプ命令とかでアドレスが狂うことはない。

HDDとかはMBR,PBRあるが、USBメモリとかは1パーティションのみなのでPBRしかない。このPBRの先頭セクタに書いておけば。

書き込み方は

sudo dd if=./pbr.bin of=/dev/sdb bs=512 count=1

とかやれば良い。