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

関連ページ