システムコールの発行について

アセンブリにおけるシステムコール発行は、プログラミング言語における関数呼出しと同じで、

・関数呼出時の引数指定は、レジスタへの値セットに相当する。
・使用するレジスタ(どのレジスタに何の値をセットするか)は固定。
・EAXレジスタにセットする値によって、命令の種類を指定する。
・システムコール発行(INT命令)のオペランドは、0x80(x86 Linuxの場合。Windowsだと0x21)固定。

…という点がポイントです。

例えば、指定文字列を画面に出力する場合、以下のように、各レジスタに必要な値を設定したうえで、INT命令を発行します(変数$msgと$lenは、事前に定義しておきます)。

movl $0x04, %eax <==== write命令(0x04)を指定
movl $0x01, %ebx <==== 1(標準出力)を指定
movl $msg, %ecx  <==== 出力する文字列の先頭アドレスを指定
movl $len, %edx  <==== 出力する文字列のバイト長を指定
int $0x80        <==== システムコールを発行

プログラムを正常終了するシステムコールは、以下のように実装します。

movl $1, %eax     <==== exit命令(0x01)を指定
xorl %ebx, %ebx   <==== 0(正常終了)を指定
int $0x80         <==== システムコールを発行

xorlは排他的論理和命令であり、異なるビットについて1、それ以外のビットを0にした値をレジスタにセットします。「%ebx, %ebx」と、オペランドに同じレジスタを指定しているので、当然%ebxは0になります。

[まとめ]

システムコール EAX EBX ECX EDX
write(2) 0x04 0x01(標準出力) [文字列の先頭アドレス] [文字列のバイト長]
exit(2) 0x01 0x00(正常終了コード) - -