改行の重要性
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 41/45。
文字列の末尾に 0x0a (newline) を追加してきましたが、もしこれを忘れてしまうとどうなるでしょうか?
改行なし:
テキストは表示されますが、カーソルは同じ行に留まります。今後の出力は、そのすぐ隣に表示されます。
改行なしの例:
section .data
first db 'Hello'
firstLen equ $ - first
second db 'World'
secondLen equ $ - second
section .text
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出力:
HelloWorld
スペースも改行もありません。すべてが連結されています。
改行あり:
section .data
first db 'Hello', 0x0a
firstLen equ $ - first
second db 'World', 0x0a
secondLen equ $ - second出力:
Hello
World
各文字列がそれぞれの行に出力されます。
newline の役割:
| 文字 | ASCII | 効果 |
|---|---|---|
0x0a | 10 | カーソルを次の行の先頭に移動します |
改行に関するよくある間違い:
| 間違い | 結果 |
|---|---|
| 改行が全くない | テキストが1行に繋がってしまう |
| 最後の文字列の末尾にのみ改行がある | 前の文字列が繋がり、最後の文字列だけが次の行に送られる |
| 文字列の途中に改行がある | 意図しない場所で改行される |
安全なルール:
単独の行に表示したいすべての文字列の末尾には、必ず 0x0a を追加してください。
チャレンジ
改行を含まない3つの文字列が与えられます。それらを3行に分けて出力するのがあなたのタスクです。
文字列は以下の通りです:
| 文字列 | 値 |
|---|---|
word1 | 'Apple' |
word2 | 'Banana' |
word3 | 'Cherry' |
要件:
- 末尾に改行(
0x0a)を付けて各文字列を定義すること - 各文字列の長さを自動的に計算すること
- write システムコール(
syscall)を使用して3つの文字列をすべて出力すること - コード 0 で正常終了すること
自分で試してみよう
section .data
; TODO: word1 を指示に記載された1番目のテキストと改行で定義する
; TODO: word2 を指示に記載された2番目のテキストと改行で定義する
; TODO: word3 を指示に記載された3番目のテキストと改行で定義する
; TODO: 各文字列の長さを計算する
section .text
global _start
_start:
; TODO: word1 を出力する
; TODO: word2 を出力する
; TODO: word3 を出力する
; TODO: クリーンに終了するsection .data
word1 db 'Apple', 0x0a
word1Len equ $ - word1
word2 db 'Banana', 0x0a
word2Len equ $ - word2
word3 db 'Cherry', 0x0a
word3Len equ $ - word3
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, word1
mov rdx, word1Len
syscall
mov rax, 1
mov rdi, 1
mov rsi, word2
mov rdx, word2Len
syscall
mov rax, 1
mov rdi, 1
mov rsi, word3
mov rdx, word3Len
syscall
mov rax, 60
mov rdi, 0
syscallこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。