.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]を使ってこれらのアドレスにアクセスできます
重要なルール:
| ルール | 説明 |
|---|---|
| データをまとめておく | section .dataを複数回開くこともできます(アセンブラが各部分を結合します)が、data.asm内のセクションを1つにすると読みやすくなります |
| ラベルは一意でなければならない | ageラベルを2つ作ることはできません |
| コードの実行前にデータが作成される | _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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Assemblyプレイグラウンド