kentsu.dat

何かその時の興味でいろいろする人。最近はScala使ってる。アルゴリズムと自然言語処理、深層学習が大好き。

さくっとアセンブリ入門 hello,world編

さくっとアセンブリ入門

なんとなくアセンブリをはじめてみる
レジスタがーとかメモリがーっていうお話は割愛

とりあえず「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文字を付与する