db による文字列
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 28/45。
すでにご存知の通り、db は単一のバイトを定義します。しかし、db は文字列、つまり連続した複数のバイトを定義することもできます。
構文:
label db 'text here'例:
section .data
message db 'Hello'これにより、メモリ内に5バイトが作成されます: 'H', 'e', 'l', 'l', 'o'
メモリ内で何が起きているか:
| アドレス | バイト | ASCII値 |
|---|---|---|
| message | 'H' | 72 |
| message+1 | 'e' | 101 |
| message+2 | 'l' | 108 |
| message+3 | 'l' | 108 |
| message+4 | 'o' | 111 |
改行の追加:
文字列を出力して次の行に移動するには、0x0a(改行文字)を追加します:
section .data
message db 'Hello', 0x0a現在、文字列は6バイトです:'H','e','l','l','o', 改行
複数の文字列:
section .data
hello db 'Hello', 0x0a
goodbye db 'Goodbye', 0x0aなぜこれが重要なのか:
文字列は、アセンブリで使用する最も一般的なデータです。write システムコール(第5章で学びます)は、指定された長さに達するまでメモリからバイトを読み取ることによって文字列を出力します。
重要な注意点:
文字列は単なるバイト列です。CPUは 'H' が文字であることを認識していませんし、気にすることもありません。それは単なる数値の72です。write システムコールは、出力時にこれらの数値を文字として解釈します。
チャレンジ
簡単.data セクション内に、値 'Hi' に続けて改行 (0x0a) を持つ、greeting という名前の文字列を作成してください。
自分で試してみよう
%include "data.asm"
section .text
global _start
_start:
; writeシステムコールを使用して文字列を出力する
mov rax, 1
mov rdi, 1
mov rsi, greeting
mov rdx, 3 ; 'H', 'i', 改行 = 3バイト
syscall
; 終了
mov rax, 60
mov rdi, 0
syscallこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。