naskの文法を適当にメモしてみる試み
- レジスタ
レジスタというのは、アセンブラにおける変数です。
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命令
代入命令です。
例: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バイトの命令
- ALIGNB命令
指定したアラインまでを DB 0 で埋めます。
- ALIGN命令
指定したアラインまでを NOP で埋めます。
こめんと欄
|