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バイトの命令
  • CALL命令
    C言語でいうところの関数呼び出しです。
    例:CALL label
      ASKAによる表記:label();
    5バイトの命令です。
    label部分に32bitレジスタや、4バイトのメモリを指定することもできます。
    例:CALL EAX
      ASKAによる表記:CALL(EAX);
    これはC言語でいうところの、関数へのポインタ、を扱うときに使います。
    この例ですと、2バイトの命令になります。
    いずれの場合もCPU内部では、「 PUSH(次の命令のEIP); EIP=指定したアドレス; 」 を実行しています。
  • DB/DW/DD命令
    この命令は特に翻訳などはしないで、指定された数値をそのままおくだけです。
    DDの場合、指定された数値を32bitずつおきます。DBは8bit、DWは16bitです。
    主にデータを記述するのに使います。たまに、アセンブラがサポートしていない命令の記述にも使います。
  • RESB命令
    指定された個数の DB 0 命令を並べます。 RESB 100 とすると、100バイトの0x00が並びます。
  • ALIGNB命令
    指定したアラインまでを DB 0 で埋めます。
  • ALIGN命令
    指定したアラインまでを NOP で埋めます。

こめんと欄


コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2006-02-16 (木) 18:00:52 (5974d)