.data セクション
CoddyのAssemblyジャーニー「基礎」セクションの一部 — レッスン 23/45。
第2章では、メモリから値をロードし、メモリに値をストアしました。しかし、そのメモリはどこから来たのでしょうか?誰が num1、num2、そして result を作成したのでしょうか?
答えは.dataセクションです。これは、メモリ内に独自のデータを作成する場所です。
.dataセクションとは何ですか?
.dataセクションは、プログラムが実行される前にメモリに格納されるデータを定義する、アセンブリプログラムの一部です。
構文:
section .data
; ここにデータの定義を記述します必要な理由:
| .dataセクションがない場合 | .dataセクションがある場合 |
|---|---|
| 操作するデータがありません | 数値、文字列、変数を定義できます |
| メモリアドレスが不明です | myNumberやmessageのようなラベルを使用できます |
| コードのテストができません | 作成したデータをロードしたりストアしたりできます |
簡単な例:
section .data
age db 25 ; 値25を持つ"age"という名前のバイトを作成します
price dw 1000 ; 値1000を持つ"price"という名前のワードを作成します
name db 'Bob' ; 文字B, o, bを持つ"name"という名前の文字列を作成しますファイル内での配置場所:
第0章の2ファイルパターンを思い出してください:
| ファイル | 内容 |
|---|---|
data.asm | section .data とデータ定義 |
main.asm | %include "data.asm" に続いて section .text とコード |
プログラムが実行されるときに何が起こるか:
- オペレーティングシステムがプログラムをメモリにロードします
.dataセクションを読み取り、データを特定のメモリアドレスに配置します
- あなたのラベル (
age,price,name) はアドレスになります - あなたのコードは、
[age],[price],[name]を使用してこれらのアドレスにアクセスできるようになります
重要なルール:
| ルール | 説明 |
|---|---|
プログラムごとに1つの .data セクション | すべてのデータを1か所にまとめます |
| ラベルは一意である必要があります | 2つの age ラベルを持つことはできません |
| データはコードが実行される前に作成されます | _start が始まるときに使用できる状態になっています |
次のレッスンでは、db、dw、dd、および dq を使用して、さまざまな種類のデータを定義する方法を学びます。
チャレンジ
data.asm ファイルに以下のコードを記述してください:
.dataセクションを作成する- 値が 5 の
countという名前のバイトを作成する
自分で試してみよう
%include "data.asm"
section .text
global _start
_start:
; countから値をalにロードする
mov al, [count]
; 印刷用に保存する
mov r12, rax
; ASCIIに変換して印刷する (0-9のみ)
add al, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; 終了
mov rax, 60
mov rdi, 0
syscall
section .bss
digit resb 1このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。