db による文字列
CoddyのAssemblyジャーニー「基礎」セクションの一部。レッスン 28/45。
dbが1バイトを定義することはすでに知っています。しかし、dbは文字列、つまり連続した複数のバイトも定義できます。
構文:
label db 'text here'例:
section .data
message db 'Hello'これはメモリ内に5つのbytesを作成します: '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 |
改行の追加:
string を出力して次の行に移動するには、0x0a(newline character)を追加します:
section .data
message db 'Hello', 0x0a現在、string は 6 bytes です: 'H','e','l','l','o', newline
複数の文字列:
section .data
hello db 'Hello', 0x0a
goodbye db 'Goodbye', 0x0aこれが重要な理由:
string は、アセンブリで使用する最も一般的な data です。write syscall(第5章で学びます)は、指定した長さに達するまでメモリから bytes を読み取ることで string を出力します。
重要な注意:
文字列は単なる bytes です。CPU は「H」が文字であることを知りませんし、気にも留めません。それは単に数値 72 です。write syscall は、出力時にそれらの数値を文字として解釈します。
チャレンジ
簡単Create greeting という string を、値 'Hi' に newline (0x0a) を followed したものとして、.data セクションに作成します。
自分で試してみよう
%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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド