2つの文字列の出力
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 40/45。
文字列を1つ出力する方法はすでに知っています。では、2つの別々の文字列を出力したい場合はどうでしょうか?たとえば、「Hello 」の後に「World!」を出力する場合です。
write システムコールを、それぞれの文字列に対して1回ずつ、2回呼び出すだけです。
仕組み:
; 1回目の出力
mov rax, 1
mov rdi, 1
mov rsi, firstMsg
mov rdx, firstLen
syscall
; 2回目の出力
mov rax, 1
mov rdi, 1
mov rsi, secondMsg
mov rdx, secondLen
syscall例:
section .data
first db 'Hello ', 0x0a
firstLen equ $-first
second db 'World!', 0x0a
secondLen equ $-second
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, first
mov rdx, firstLen
syscall
mov rax, 1
mov rdi, 1
mov rsi, second
mov rdx, secondLen
syscall
mov rax, 60
mov rdi, 0
syscall出力:
Hello
World!
各文字列は 0x0a(改行)で終わるため、2つの文字列は別々の行に出力されます。
なぜ文字列を1つではなく2つ出力するのでしょうか?
| 理由 | 例 |
|---|---|
| 再利用性 | 名前を変えて同じ挨拶を出力する |
| 柔軟性 | 条件に基づいて異なるメッセージを出力する |
| 整理 | 異なるメッセージをメモリ内で分けて保持する |
好きなだけ多くの文字列を出力できます。
文字列ごとに write システムコールを繰り返すだけです。
チャレンジ
2 つの文字列が与えられています。partOne の値は 'Good'、partTwo の値は 'bye' です。どちらも末尾に改行がすでに付いています。
出力が次のようになるように、partOne、続いて partTwo を表示するコードを書いてください。
Good
bye
データセクションと終了 syscall はすでに用意されています。2 つの write syscall だけを書く必要があります。
自分で試してみよう
section .data
partOne db 'Good', 0x0a
partOneLen equ $-partOne
partTwo db 'bye', 0x0a
partTwoLen equ $-partTwo
section .text
global _start
_start:
; TODO: write syscallを使用してpartOneを出力する
; TODO: write syscallを使用してpartTwoを出力する
mov rax, 60
mov rdi, 0
syscall
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド