全体を組み合わせる
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 39/45。
writeシステムコールの4つの構成要素をすべて学習しました:
| レジスタ | 保持する内容 | 画面出力用の値 |
|---|---|---|
rax | システムコール番号 | 1 (write) |
rdi | ファイル記述子 | 1 (stdout) |
rsi | バッファアドレス | 文字列のアドレス |
rdx | バイト数 | 文字列の長さ |
それでは、これらをすべて組み合わせてみましょう。
write システムコールの完全なパターン:
mov rax, 1 ; writeのシステムコール番号
mov rdi, 1 ; ファイルディスクリプタ (stdout)
mov rsi, msg ; 文字列のアドレス
mov rdx, msgLen ; 出力するバイト数
syscall ; OSに出力を依頼する完全に動作するプログラム:
section .data
msg db 'Hello, World!', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallこのプログラムの動作:
| ステップ | 内容 |
|---|---|
| 1 | 画面に "Hello, World!" を表示します |
| 2 | 新しい行に移動します |
| 3 | コード 0 で正常に終了します |
順序が重要です:
syscallを実行する前に、レジスタを設定する必要があります。syscallの前に4つすべてが設定されている限り、mov命令の順序は重要ではありません。
チャレンジ
"Assembly is fun" というメッセージの後に改行を出力し、正常に終了する完全なプログラムを作成してください。
文字列とその長さはすでに定義されています。_start: の中にコードを記述するだけです。
自分で試してみよう
section .data
msg db 'Assembly is fun', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO: writeシステムコールをセットアップして呼び出す
; rax=1, rdi=1, rsi=msg, rdx=msgLenを使用する
; TODO: 終了コード0で正常に終了するこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。