X86アセンブラ/FASM構文
表示
< X86アセンブラ
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