nasmでprintf関数を使う


はじめに

nasmでというアセンブリでprintf関数を呼び出して、数値と文字を表示させることをしたのでここにメモをしておきます。

コード

ソースコード

; 初期設定
extern  printf                 ; 1. printf関数を持ってくる

; データセクション
section .data
    fmt:    db "x=%d", 10, 0   ; 2. printfで使うフォーマットを定義

; コードセクション
section .text
    global _start               ; _startを指名


; スタート
_start:
    ; printfに使うレジスタの値を指定のレジスタに移動
    mov    rdi, fmt             ; 3. printfのフォーマットをレジスタに置く
    mov    rsi, 1234567890      ; 4. 出力する数値の指定

    call   printf               ; 5. printfをコール

    ; 後処理
    mov    rax, 1               ; システムコール番号(sys_exit)
    mov    rbx, 0               ; 終了ステータスコード
    int    0x80                 ; システムコール

実行

$ nasm -f elf64 ファイル名
$ gcc 生成したオブジェクトファイル名 -nostartfiles -no-pie
$ ./a.out
x=1234567890

解説

1. printf関数を持ってくる

以下のコードで、printf関数を読み込みます。

extern  printf

2. printfで使うフォーマットを定義

以下のコードで、printfのフォーマットを定義します。

fmt:    db "x=%d", 10, 0

3. printfのフォーマットをレジスタに置く

以下のコードで、6行目で定義したフォーマット("x=%d", 10, 0)を、printfで使用するようにレジスタに置きます。

mov    rdi, fmt

4. 出力する数値の指定

以下のコードで表示する値、出力する数値(1234567890)を指定します。

mov    rsi, 1234567890

5. printfをコール

call   printf

さいごに

こんな感じで、printf関数を呼び出しました。
何か間違ったこと等あればコメントください。