システムコールの発行について
アセンブリにおけるシステムコール発行は、プログラミング言語における関数呼出しと同じで、
・関数呼出時の引数指定は、レジスタへの値セットに相当する。 ・使用するレジスタ(どのレジスタに何の値をセットするか)は固定。 ・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(正常終了コード) | - | - |