* [[text0006]]の補足説明#1 -(by [[K]], 2019.03.01) ** (0) -これは[[「川合のプログラミング言語自作のためのテキスト#0006」>text0006]]に対する補足説明のページです。 ** (1) x86の32ビットモード用の簡易コード表 -32ビットレジスタについて: --レジスタは8本ある。このうち、EAXとECXとEDXは値を壊したままRETしても平気。EBXとESPとEBPとESIとEDIは使ってもよいがRET前には値を復元する必要がある。 --ESPは、関数に入ったらすぐに、8バイトアラインしなければいけない関係で、(8の倍数+4)を引き算し、RET前に(8の倍数+4)を足し算するとよいです。 |レジスタ名|EAX|ECX|EDX|EBX|ESP|EBP|ESI|EDI| |レジスタ番号|0|1|2|3|4|5|6|7| -リトルエンディアン --x86はリトルエンディアンを採用しているので、EAXに0x12345678を代入したいと思ったら、 B8 78 56 34 12 と書く必要があります。32ビット定数が逆順になって並ぶことに注意してください。 -簡易コード表 |機械語|アセンブラ表記(参考)|動作説明| |B8 xx xx xx xx|MOV EAX,xxxxxxxx|EAXレジスタに定数xxxxxxxxを代入する| |B9 xx xx xx xx|MOV ECX,xxxxxxxx|ECXレジスタに定数xxxxxxxxを代入する(以下この調子で続き、BFがEDIへの定数代入になります)| |8B 05 xx xx xx xx|MOV EAX,[xxxxxxxx]|メモリの値を4バイト読み込んでEAXレジスタに代入(xxxxxxxxはメモリの番地)| |8B 0D xx xx xx xx|MOV ECX,[xxxxxxxx]|メモリの値を4バイト読み込んでECXレジスタに代入(以下この調子で15, 1D, 25, 2D, 35, 3Dで、EDX~EDIを指定できます)| |89 05 xx xx xx xx|MOV [xxxxxxxx],EAX|EAXの値を4バイトのメモリに書き込む| |89 0D xx xx xx xx|MOV [xxxxxxxx],ECX|ECXの値を4バイトのメモリに書き込む(以下この調子で15, 1D, 25, 2D, 35, 3Dで、EDX~EDIを指定できます)| |A1 xx xx xx xx|MOV EAX,[xxxxxxxx]|8B 05 xx xx xx xxの簡略表記| |A3 xx xx xx xx|MOV EAX,[xxxxxxxx]|89 05 xx xx xx xxの簡略表記| |89 C0|MOV EAX,EAX|こんなの意味ない命令だけど、一応紹介| |89 C1|MOV ECX,EAX|ECX = EAX;| |89 C2|MOV EDX,EAX|EDX = EAX; 一般にC2の部分のビット0~ビット2が代入先(reg1)を表し、ビット3~ビット5が代入元(reg0)を表す(0xc2 = reg1 + reg0 * 8 + 0xc0)| |01 C2|ADD EDX,EAX|EDX += EAX; ここのC2を変えれば他のレジスタの組み合わせもできる| |29 C2|SUB EDX,EAX|EDX -= EAX; ここのC2を変えれば他のレジスタの組み合わせもできる| |21 C2|AND EDX,EAX|EDX &= EAX; ここのC2を変えれば他のレジスタの組み合わせもできる| |09 C2|OR EDX,EAX|EDX |= EAX; ここのC2を変えれば他のレジスタの組み合わせもできる| |31 C2|XOR EDX,EAX|EDX ^= EAX; ここのC2を変えれば他のレジスタの組み合わせもできる| |39 C2|CMP EDX,EAX|if (EDX ?? EAX) 比較用の命令で??の部分は後続の0f 8x命令群で指定する| |0F 8D xx xx xx xx|JGE xxxxxxxx|if ( >= ) goto ... [符号付き整数比較](xxxxxxxxの部分はEIPへの加算量(相対アドレス)で記述する)| |0F AF C2|IMUL EAX,EDX|EAX *= EDX; c2の部分の意味が加算などとは逆になっていることに注意| |83 C0 xx|ADD EAX,xx|EAX += xx; 127以下の小さな整数の定数の加算(C0のところをC1~C7にすることでECX~EDIを指定可能)| |83 E8 xx|SUB EAX,xx|EAX -= xx; 127以下の小さな整数の定数の減算(E8のところをE9~EFにすることでECX~EDIを指定可能)| |C3|RET|return; 関数の終了(呼び出し元へ戻る)| -現状で認識している問題点 --0F 8x命令群の紹介が少ない --メモリ番地の指定にレジスタを混ぜる方法の説明が足りない --メモリ番地の指定にレジスタを混ぜる方法の説明がごっそり抜けている * こめんと欄 #comment