![]() |
nask/guide000 のバックアップ(No.2) |
レジスタというのは、アセンブラにおける変数です。 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バイトの命令
コメント | お名前 | NameLink | |