コンテンツにスキップ

X86アセンブラ/FASM構文

出典: フリー教科書『ウィキブックス(Wikibooks)』

FASM は別名 Flat Assembler とも呼ばれ、x86 アーキテクチャ用の最適化アセンブラです。 FASM はアセンブリで書かれているため、自分自身をアセンブル/ブートストラップすることができます。DOS、Linux、Unix、Windowsなど、さまざまなOS上で動作します。 SIMD拡張のMMX、SSE、SSE4、AVXを含むx86およびx86-64命令セットをサポートしています。

16進数

[編集]

FASM は 16 進数を定義するためによく使われる構文をすべてサポートしています:

0xbadf00d ; C ライク構文
$badf00d  ; Pascal ライクな構文
0badf00dh ; h 構文、アセンブリ時に有効な先頭のゼロが必要

ラベル

[編集]

FASM はいくつかのユニークなラベル機能をサポートしています。

匿名ラベル

[編集]

FASMは識別子やラベル名を使わないラベルをサポートしています。

  • @@: は匿名ラベルを表します。匿名ラベルはいくつでも定義できます。
  • @b: ソースをさかのぼったときに最も近い@@を表します。@rと@bは等価である。
  • @f: ソースを前方から見たときに最も近い@@を指す。
@@:
    inc eax
    push eax
    jmp @b ; 遅かれ早かれスタックフォールトになる。
    jmp @f ; この命令がヒットすることはない。
@@:            ; もしjmp @fがヒットしたら、命令ポインタはこの匿名ラベルに設定される。
    invoke ExitProcess, 0 ; Winasmのみ

ローカルラベル

[編集]

ローカルラベルは.(ピリオド)で始まります。 ローカルラベルは、グローバルラベルの親のコンテキストで参照できます。

entry globallabel

globallabel
    .locallabelone
        jmp globallabel2.locallabelone
    .locallabeltwo
 
globallabel2
    .locallabelone: jmp
    .locallabeltwo
        jmp globallabel.locallabelone ; 無限ループ

演算子

[編集]

FASM はアセンブリコードを簡単にするために、いくつかのユニークな演算子をサポートしています。

演算子

[編集]

$ はアドレス空間の現在位置を表します。これはコードやデータのブロックのサイズを決定するのに使われます。 MASM の $ に相当するのは SIZEOF 演算子です。

 以下のようになります。
mystring db "これは私の文字列です", 0
mystring.length = $ - mystring


# 演算子

[編集]

#は記号連結演算子で、複数の記号を1つに結合するのに使います。これは、reptのようなマクロの本体内、またはカスタム/ユーザー定義マクロでのみ使用できます、 マクロの引数の名前をその値に置き換えるからです。

マクロで作られた値 {
    some#value db 22
}
; ...
contrived 2

;組み立てると
some2 db 22

TBC