とりあえず「Hello,World」
まずはお決まりの「Hello,World」から
.globl main main: movl $4,%eax movl $1,%ebx movl $msg,%ecx movl $13,%edx int $0x80 movl $1,%eax movl $0,%ebx int $0x80 .data msg: .asciz "Hello,World\n"
今まで色々なプログラミング言語に触れてきたけど、これほど初見で難解なhello,worldを見たことがない
わからないながら解説
まず一行目の「.globl」のように.から始まる命令をディレクティブといいアセンブラに対する命令を表している
その中でも「.globl」はエントリーポイントを指定するものである。またGASを使用するのでmainを指定しておく
二行目の「:」これがつくとC言語と同様にラベルになる
またラベルはプログラム実行中のメモリアドレスの代わりとして定数のように使用可能(最終行で使用)
三行目から六行目までは代入処理で「mov命令」と呼ばれるもの
この命令は以下の形式を取る
mov [代入元],[代入先]
詳しくは後述
$から始まるものは数値で%から始まるものはレジスタ
そしてこのmov命令を今回のコードの中では「mov」ではなく「movl」となっている
これは「long word」のlである。
アセンブリはただ数値としてすべてを扱うので何ビットずつ数値を扱っているかということを示す必要がある
これをオペレーションサフィックスといい以下のようなものが使える
サフィックス | サイズ |
---|---|
b | バイト、8ビット |
s | ショートで16ビット整数かシングルの32ビット浮動小数点 |
w | ワード、16ビット |
l | ロングで32ビット整数か64ビット浮動小数点 |
q | クワッド、64ビット |
t | 10バイト、80ビット浮動小数点 |
これらから、Byte値を代入するなら「movb」となりWord値を代入するなら「movw」となる
今回はLongWordなので「movl」となる
七行目の謎の処理は「割り込み命令」といい、CPUが処理をしている時に現行作業を復帰可能な状態にして割り込みする処理を実行するといったもの
またここでは16進数で0x80を指定しているが、これは割り込み番号0x80番でシステムコールを実行してくださいということ
11行目でのdataディレクティブでは実行用のコードがおいてあるのではなく、初期化済みのデータを置くと宣言している
最後はascizディレクティブは文字列を置くと宣言するもので最後にnull文字を付与する