![]() |
nask/guide000 のバックアップ(No.3) |
レジスタというのは、アセンブラにおける変数です。 32bitのレジスタが8個あります。 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI (これは変な順番だと思うかもしれませんが、CPUにおけるレジスタ番号順にならべると、こうなるのです。) 32bitレジスタの一部だけを使って、16bitレジスタとして使用できます。 AX, CX, DX, BX, SP, BP, SI, DI AXはEAXの下位16bitを流用しているために、EAXに値を代入するとAXの値が変化しますし、AXに代入するとEAXが変化します。他のレジスタについても同様です。 例:EAX=123456789のとき、AXは52501になる(16進数で言うと、 0x75BCD15 と 0xCD15 )。 16ビットレジスタの一部だけを使って、8bitレジスタとして使用できます。 AL, CL, DL, BL, AH, CH, DH, BH AL〜BLは、AX〜BXの下位8bitです。AH〜BHはAX〜BXの上位8bitです。
代入命令です。 例:MOV EAX,1234 -- EAXレジスタに1234を代入(定数代入)。 ASKAによる表記:EAX = 1234; 32bitレジスタへの定数代入は、5バイトの命令なります。 16bitレジスタへの定数代入は、4バイトの命令になります。 8bitレジスタへの定数代入は、2バイトの命令になります。 定数だけではなく、レジスタの内容を代入することもできます。 例:MOV EAX,ECX -- EAXレジスタにECXの値を代入。 ASKAによる表記:EAX = ECX; MOV命令は、同じビット数のレジスタ同士を代入できます。異なるビット数のレジスタ間でMOVすることはできません。 32bitレジスタ間の代入は、2バイトの命令になります。 16bitレジスタ間の代入は、3バイトの命令になります。 8bitレジスタ間の代入は、2バイトの命令になります。 さらに、レジスタの内容をメモリに書いたり、もしくはメモリから読み出すこともできます。 例:MOV EAX,DWORD [1234] -- メモリアドレス1234の値をEAXに代入。 ASKAによる表記:EAX = (int) [1234]; EAXは32bitなので、メモリはDWORDでなければいけません。AXならWORD、ALならBYTEです。 逆にいうと、メモリからレジスタへの代入、もしくはレジスタからメモリへの書き込みは、 レジスタ名からメモリのアクセスサイズが推測可能なので、省略することもできます。 例:MOV EAX,[1234] ASKAによる表記:EAX = [1234]; メモリアドレスの指定をレジスタで行うと、短い命令になります。 MOV EAX,[EBX] -- 2バイトの命令 MOV EAX,[EBX+12] -- 3バイトの命令 MOV EAX,[1234] -- 5バイトの命令
C言語でいうところの関数呼び出しです。 例:CALL label ASKAによる表記:label(); 5バイトの命令です。 label部分に32bitレジスタや、4バイトのメモリを指定することもできます。 例:CALL EAX ASKAによる表記:CALL(EAX); これはC言語でいうところの、関数へのポインタ、を扱うときに使います。 この例ですと、2バイトの命令になります。 いずれの場合もCPU内部では、「 PUSH(次の命令のEIP); EIP=指定したアドレス; 」 を実行しています。
この命令は特に翻訳などはしないで、指定された数値をそのままおくだけです。 DDの場合、指定された数値を32bitずつおきます。DBは8bit、DWは16bitです。 主にデータを記述するのに使います。たまに、アセンブラがサポートしていない命令の記述にも使います。
指定された個数の DB 0 命令を並べます。 RESB 100 とすると、100バイトの0x00が並びます。
指定したアラインまでを DB 0 で埋めます。
指定したアラインまでを NOP で埋めます。
コメント | お名前 | NameLink | |