アセンブリ,システムコールを利用して、文字列を標準出力へ書き込む

スポンサーリンク

鍛錬 223

アセンブリ,システムコールを利用して、文字列を標準出力へ書き込む

アセンブリ言語で、Linux のシステムコールである write と exit を利用して文字列を標準出力に書き込む方法についてです。

PC環境

ディストリビューション
 Ubuntu 16.04.5 LTS

マシン(ハードウェア)タイプ
 x86_64

アセンブラ
 NASM version 2.11.08

システムコール(write) 利用時のレジスタ

システムコールの write を利用して標準出力に文字列を書き込む際は、レジスタを以下の通りに設定します。

rax rdi rsi rdx
システムコール番号,
write は 1
ディスクリプタ,
stdout は 1
書き込むデータの
先頭アドレス
書込みバイト数

システムコール(exit) 利用時のレジスタ

システムコールの exit を利用してプログラムを終了する際は、レジスタを以下の通りに設定します。

rax rdi rsi rdx
システムコール番号,
exit は 60
終了ステータス  -   - 

プログラム

以下は、システムコールの write と exit を利用して文字列を標準出力に書き込むプログラム hello_world.asm です。

section .data
print: db 'Hello, world', 10

section .txt
global _start

_start:
	mov rax, 1      ; システムコール番号(write)
	mov rdi, 1      ; ディスクリプタ(stdout)
	mov rsi, print  ; 表示する文字列のアドレス
	mov rdx, 13     ; 文字列のバイト数
	syscall         ; システムコール(write)
	
	mov rax, 60     ; システムコール番号(exit)
	xor rdi, rdi    ; 終了ステータス0
	syscall         ; システムコール(exit)

実行結果

以下は、上記のプログラム hello_world.asm を実行して、文字列を表示しています。

***@ubuntu:~/***/test/asm$ 
***@ubuntu:~/***/test/asm$ nasm -felf64 hello_world.asm -o hello_world.o
***@ubuntu:~/***/test/asm$ ld -o hello_world hello_world.o
***@ubuntu:~/***/test/asm$ ./hello_world
Hello, world
スポンサーリンク

シェアする

フォローする