GAS_基本書式
GNU アセンブラのレジスタ書式
レジスタの指定
GAS(GNU assembler)ではレジスタ名に「%」記号を付けて、利用します。
%eax, %ax, %ebp ...
レジスタ内容の指定(アドレッシングモード)
レジスタを「()」記号で囲うと、レジスタが指しているメモリ番地の内容になります。
C言語におけるポインタ概念と同等であり、「%esp」はシンボルの値を示し、「(%esp)」シンボルの値の指す場所の値を示します。
movl ($1000), %eax # eaxレジスタにメモリの1000番地の値を代入する。
movl (%ebx), %eax # eaxレジスタにebxで示される番地の値を代入する。
オフセット指定
即値でオフセットを指定する場合は、レジスタアドレスの左に数値を記述します。
movl 8(%ebp), %eax # eaxレジスタにebp+8で示される番地の値を代入する。
セグメントベース(アドレスを指すために基準点)から指定する場合は、ベースレジスタとオフセットレジスタをカンマでつなぎます。
左(第一オペランド)がベースとなります。
movl (%ebx,%esi), %eax # eaxレジスタにebx+esiで示される番地の値を代入する。
GNU アセンブラのデータ書式
数値
即値には「$」を付けます。
数値は10進数、16進数(0x)、2進数(0b)で表現することができます。
movl $10, %eax # eaxレジスタに数値10を代入する。
movl $-10, %eax # eaxレジスタに数値-10を代入する。
movl $0x00FF, %eax # eaxレジスタに数値255(0xff00)を代入する。
movl $-0x00FF, %eax # eaxレジスタに数値-255(0xff00)を代入する。
movl $0b00001111, %eax # eaxレジスタに数値15(00001111)を代入する。
文字
一文字の表現は数値と同様に、「$」を付けます。
movel $'z', %eax # eaxレジスタに文字zを代入します。
文字列
文字列はディレクティブ(疑似命令:psuedo-ops)を用います。
文字列を配置するためのディレクティブは三種類あります。
STR1: .ascii "gnu assembler\0"
STR2: .asciz "gnu assembler"
STR3: .string "gnu assembler", "gas" # コンマ区切りにヌル文字が入ります。
.ascii | カンマで区切られたゼロ個以上の文字列を、\nや\t、\0などのエスケープ文字を展開しつつ配置します。ただし、ヌル文字の添加は行わないため、自分でヌル文字を終端につける必要がある。 |
.asciz | .asciiと同様に文字列の配置をします。ただし、各文字列の終わりごとに自動的にヌル文字を添加します。ascizの最後のzはzeroを意味します。 |
.string | .ascizと同等の機能です。 |
定数
数値の定数は以下ような数値を扱うディレクティブを用います。
.byte [1Byte数値]
.word [2Byte数値]
このほかに「.int .long .short .double .float」などのディレクティブがあります。
ラベル指定ではなく値の名前(エイリアス)を使用できるように定義する場合は以下のディレクティブを用います。
値を使用するときは、宣言した名前の前に$をつけます。
.equ [名前], [値]
.set [名前], [値]
空の領域
空の領域を確保する場合、skipディレクティブを使用しています。
これは、sizeバイト分の空白を空けます。valueは省略可能ですが、指定すれば空けた領域をすべてその値で埋めます。
.skip [size](, [value])
BSSセクションのデータを作成する場合には「.comm」(COMMon memory area)を用います。
.comm varname, 4
上記はvarnameという名前で4bytesのサイズを指す共通なシンボルを宣言します。
これは宣言であるため、他のファイルに同じシンボルの宣言や定義があれば、それらとマージされます。この変数が未定義セクション(BSS section)に割り当てられるのは、リンク時に他の場所に定義が存在しない場合のみとなります。
その他
アラインメントを設定する。
「.align」は、データを配置する位置をデータ境界に揃えます。
例えば、4Byte単位でデータを扱う環境においては、アライメントを適切に設定しなければ不正動作が発生します。
STR: .ascii "gas"
.align 4
NUM: .int 84
書換不可能な領域
.rodataセクションを用いることで、書換不可能な領域を設定します。
固定文字列などの保持に使われます。
関連ページ
- GAS_基本文法
- GAS_基本書式
- GAS_演算子
- GAS_制御構造
- GAS_関数
- GAS_システムコール
- GAS_標準ライブラリ関数
- GAS_Intel記法の利用
- GAS_インラインアセンブラ
- アセンブリ言語