GAS_システムコール
GAS(GNU アセンブラ)のシステムコール利用
アセンブラはOSやCPUに依存したプログラムとなります。
同じGASプログラムであっても、LinuxとFreeBSD(MAC OS)でもシステムコールの利用方が異なるため、アセンブルできないことがあります。
ここではLinux環境のシステムコールについて記載しています。
int命令について
int命令は割り込み命令といいます。
(ソフトウェアからの割り込みをソフトウェア割り込みといいます。)
割り込み番号「0x80番」を利用してint命令を実行することで、OSに対して「システムコールを実行してください」という要求を発行します。
システムコールの実行
システムコールを呼ぶには、eaxにシステムコール番号、ebx、ecx、edxにそれぞれ第一引数、第二引数、第三引数を代入して、割り込み80番で割り込み(int $0x80)を行います。
eax = システムコール番号
ebx = 第一引数
ecx = 第二引数
edx = 第三引数
int $0x80
システムコール番号について
システムコールはOSに定義されています。
Linuxであれば、以下のファイルを参照します。
/usr/include/asm/unistd.h
/usr/include/asm/unistd_32.h
/usr/include/asm/unistd_64.h
GASシステムコールサンプル
exitする
引数0(正常終了)のexitシステムコールを実行します。
exit:
movl $1, %eax # exit system-call = 1
xorl %ebx, %ebx # 0をセットする
int $0x80
ファイルをopenする
openシステムコールを実行して、ファイルディスクリプタをesiに格納します。
file_open:
/* openシステムコール */
movl $5, %eax # open system-call = 5
movl 4(%esp), %ebx # ファイル名(コマンドライン引数)
movl $0, %ecx # mode : O_RDONLY = 0
int $0x80
/* 戻り値(ファイルディスクリプタ) */
movl %eax, %esi # esiに戻り値を入れる
cmpl $-1, %esi
jne open_end
/* エラー処理 */
# pushl $ERRMSG_OPEN
# call print # エラーメッセージを表示する。
popl %esi
open_end:
ret
ファイルをcloseする
closeシステムコールを実行します。なお、ファイルディスクリプタはesiに格納しています。
file_close:
movl $6, %eax # close system-call = 6
movl %esi, %ebx # descriptor
int $0x80
ret
関連ページ
- GAS_基本文法
- GAS_基本書式
- GAS_演算子
- GAS_制御構造
- GAS_関数
- GAS_システムコール
- GAS_標準ライブラリ関数
- GAS_Intel記法の利用
- GAS_インラインアセンブラ
- アセンブリ言語