Capture The Frog

かえるぴょこぴょこw

MENU

アセンブリ言語入門 その3

頭の片隅に置いておくと理解がすすむもの

・バイト→ビット ×8
・ビット→バイト /8
アセンブリとは、マシンコードをアセンブリコードに変換すること

x86 CPUには、8つの汎用レジスタがある。
 EAX・EBX・ECX・EDX・ESP・EBP・ESI・EDI
 これらは全て32ビット(4バイト)のサイズ
 プログラムは、これらのレジスタに32(4バイト),16(2バイト),8(1バイト)ビットの値と         

 してレジスタにアクセスすることができる。


・各レジスタの下位16ビット(2バイト)には
 AX・BX・CX・DX・SP・BP・SI・DI
 これらは、全て16ビットだから16,8ビットの値として、プログラムはレジスタにアク 

 セスできる。
 後で、アセンブリ命令の格納先として出てくるので理解しとく。

 

・ちなみにc言語だと
 1バイト   char
 2バイト   short int
 4バイト   int
         long int

         float
   float(浮動小数点は、EAXなどの汎用レジスタではなく)浮動小数レジスタ(sd・snが

   使用される。 
   8バイト         double
                         long double

  となっている。


・リトルエンディエン方式とは、

 下位バイトは下位アドレスに格納され、後続のバイトはメモリ内の連続した上位アド 

 レスに格納される。
 「リトルエンディエン方式とは、データをバイト単位で並べる際のやりかたの一つ

 で、「最後」のバイトから順番にデータを並べる方式のこと」

  https://wa3.i-3-i.info/word11428.htmlより引用

 

・実行する操作を指定する部分を"オペコード"という
 そして、操作される対象を"オペランド"と呼ぶ

 オペランド デスティネーション, ソース
 命令    格納先,  格納元

 みたいな感じ。
 今回は、デスティネーション(格納先)を先に書くやり方で書いていく。

 この書式をIntel Syntaxと呼ぶ。MASM・NASMで採用されている。


・;の後は、コメント文

 

 

 

今回は、加減乗除に引き続きビット演算とシフト演算についてやっていきます。  

ビット演算

ビットを操作する方法について書いていきます。

ビットは、右端から順に番号が振られています。

右端のビットは最下位ビットと呼ばれ、左に行くほどビット位置は増加します。

同じ論理がword,dwordにも適用されます。

 

NOT命令

1つのオペランドだけを取り、全てのビットを反転します。

EAXに、11111111 11111111 00000000 00000000が格納されている場合

 

not eax      ;EAXを反転した00000000 00000000 11111111 11111111が

           EAXに格納されます。

 

論理演算 

AND命令・OR命令・XOR命令

ビット単位でのAND・OR・XOR演算を実行し、その結果をディスティネーションに格納します。

これらの操作は、CやPythonでの実行結果と似ています。

 

and bl, cl     ;bl=bl&clと同じ

or eax, ebx    ;eax=eax | ebxと同じ

xor eax, ebx     ;eax=eax^ebxと同じ

 

 

SHR命令・SHL命令

SHR命令は右論理シフト、SHL命令は左論理シフトをします。

両命令とも、ディスティネーション(dstのビットをcountで指定されたビット数だけ左右に論理シフトします。

ちなみに、1論理右シフトしたら値は2倍になり、1左論理シフトしたら値は1/2倍されます。

 

shl dst, count        ;countで指定されたビット数左論理シフトする。

shr dst, count        ;countで指定されたビット数右論理シフトする。

 

ROL命令・ROR命令

SHIFT命令に似ていますが、シフト命令と違いずれたビットを削除するのではなく

反対側に回転する。

 

rol al, 2          ;ALに0100 0100が格納されていた場合、実行後のALには0001 0001                                           が格納されます。

 

 

今回は、ビット演算と論理演算についてやってきました。

次回は、条件分岐をやっていきたいと思います!

qwertytan.hatenablog.jp