はじめに
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関数を呼び出しました。
何か間違ったこと等あればコメントください。