改行の重要性
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 41/45。
文字列の末尾に0x0a(改行)を追加してきました。でも、追加し忘れるとどうなるでしょうか?
改行なし:
テキストは出力されますが、カーソルは同じ行にとどまります。以降の出力はそのすぐ隣に表示されます。
改行なしの例:
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各文字列はそれぞれ独立した行に出力されます。
改行の動作:
| 文字 | ASCII | 効果 |
|---|---|---|
0x0a | 10 | カーソルを次の行の先頭に移動する |
よくある改行の間違い:
| 間違い | 結果 |
|---|---|
| 改行がまったくない | テキストが1行につながって表示される |
| 最後の文字列の末尾にだけ改行がある | すべての文字列が1行につながって表示され、その後カーソルが次の行に移動する |
| 文字列の途中に改行がある | 予期しない場所で改行される |
安全なルール:
独立した行に表示したい各文字列の末尾には、必ず 0x0a を追加します。
チャレンジ
改行を含まない3つの文字列が与えられます。これらを別々の3行に表示するのが課題です。
文字列は次のとおりです。
| 文字列 | 値 |
|---|---|
word1 | 'Apple' |
word2 | 'Banana' |
word3 | 'Cherry' |
要件:
- 各文字列の末尾に改行(
0x0a)を付けて定義する - 各文字列の長さを自動的に計算する
- writeシステムコールを使って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: 正常に終了する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド