OS Project Wiki の保存版 ヒデさん・アリスさんほか、OS部のみなさんが書いたものです。
2019年にサイトが消滅しました。当時あった211ページのうち、本文が残っていたのは86ページです。すべては復旧できていません。Common Crawl と Internet Archive に 残っていたものを組み直しています(最終取得 2019-05-24)。
編集・検索・添付などの機能は動きません。表示のみです。

検索

まずは、検索!

Index

人気の20件
最新の20件
2018-12-022018-01-092017-05-072017-04-252016-05-012015-02-242014-01-032013-06-252012-12-302012-12-292012-07-272012-07-162012-02-052012-01-292011-10-012011-09-18

GNU アセンブラ(GAS)

目次

コメントの種類

GASは、3種類のコメントをサポートしている。
CやC++でおなじみのコメントと、アセンブリ言語で一般的に使用するコメントが使える。
たまに、//が使えないこともある。

  • /* ~ */
  • //
  • #

構文

基本構文

GASは、NASMなどのIntel構文と違い、AT&T構文なので、オペランドのソースとディスティネーションが逆。

NASM
	movd	Dest,	Src
GAS
	movl	Src,	Dest

レジスタ

GASはレジスタを記述するときに%記号をつける。

NASM
	movd	eax,	ebx
GAS
	movl	%ebx,	%eax

即値

GASは即値(定数数値)を記述するときに$記号をつける。

NASM
	movd	eax,	0x20
GAS
	movl	$0x20,	%eax

メモリ参照

メモリ参照の基本構文は以下の通り。

displacement(base, index, scale)

この基本構文から一部省略して記述可能。

指定種別説明省略時
displacement即値静的なアドレスオフセット0
base32bitレジスタ配列のベースアドレス0
index32bitレジスタ(esp除く)配列のインデックス0
scale即値(1,2,4,8)配列の1要素の大きさ1

なお、計算式は以下の通り。

displacement + base + index * scale

※セグメントレジスタを以下のように指定することも可能。

segment:displacement(base, index, scale)

セグメントレジスタ省略時は、baseの種類により異なる。

  • baseがesp, ebpの場合:ss
  • 上記以外の場合:ds

以下、書き方一覧

displacement
(base)
displacement(base)
displacement(index, scale)
displacement(base, index)
displacement(base, index, scale)

displacement

最も単純な構文。

例:

	movw	$0x1234,	label

	label:	.word		0x0000

ラベル(アドレス)を$記号なしで指定するだけ。

(base)

レジスタを使用する場合の構文。

例:

	movw	$0x1234,	(%eax)

displacement(base)

C言語において、関数の引数やローカル変数を参照する場合に有効な構文。

例:

	movw	$0x1234,	-4(%ebp)		< ローカル変数を参照

displacement(index, scale)

1次元配列を参照する場合に有効な構文。

例:

	movw	$0x1234,	0x1000(%esi, 4)

1次元配列で有効に参照する場合のイメージ

	displacement[index]		< 1要素のサイズ:scale

displacement(base, index)

2次元配列、構造体配列を参照する場合に有効な構文

例:

	movw	$0x1234,	+4(%ebx, %edx)

構造体配列で有効に参照する場合のイメージ

	base[index].displacement
	index += sizeof base[0]
	base[index].displacement

displacement(base, index, scale)

2次元配列を参照する場合に有効な構文。

例:

	movw	$0x1234,	0x1000(%ebx, %esi, 4)

2次元配列で有効に参照する場合のイメージ

	displacement[base][index]		< 1要素のサイズ:scale

ディレクティブ

GASでディレクティブを記述するときは、"."を用いる。
この"."は特別な意味がある。

ディレクティブの種類

ディレクティブ意味
.byte1バイトのデータを配置する
.word2バイトのデータを配置する
.short
.long4バイトのデータを配置する
.int
.asciiアスキーコードの文字列を配置する

参考・関連


Since 2008 July. OS Project Wiki
保存 2019-03-19 ・ ページ一覧