.data 段
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 23 课,共 45 课。
在第 2 章中,你从内存中加载了值,并将值存储到内存中。但这些内存是从哪里来的?是谁创建了 num1、num2 和 result?
答案是 .data 段。你可以在这里创建自己的内存数据。
.data 段是什么?
.data 段是汇编程序的一部分,你可以在这里定义数据,这些数据会在程序运行前存储到内存中。
语法:
section .data
; 在这里定义你的数据你为什么需要它:
| 没有 .data 段 | 有 .data 段 |
|---|---|
| 你没有可用的数据 | 你可以创建数字、字符串和变量 |
| 内存地址未知 | 你可以使用 myNumber 或 message 这样的标签 |
| 你无法测试代码 | 你可以加载和存储自己创建的数据 |
一个简单的示例:
section .data
age db 25 ; 创建一个名为 "age"、值为 25 的字节
price dw 1000 ; 创建一个名为 "price"、值为 1000 的字
name db 'Bob' ; 创建一个名为 "name"、由字母 B、o、b 组成的字符串它在文件中的位置:
还记得第 0 章中的双文件模式吗?
| 文件 | 内容 |
|---|---|
data.asm | section .data,其中包含你的数据定义 |
main.asm | 先写 %include "data.asm",然后写包含代码的 section .text |
程序运行时会发生什么:
- 操作系统会将你的程序加载到内存中
- 它会读取
.data部分,并将你的数据放置在特定的内存地址
- 你的标签(
age、price、name)会变成地址 - 现在,你的代码可以使用
[age]、[price]、[name]来访问这些地址
重要规则:
| 规则 | 说明 |
|---|---|
| 将数据放在一起 | 你可以多次打开 section .data(汇编器会将这些部分合并),但在 data.asm 中使用一个单独的单元会更容易阅读 |
| 标签必须唯一 | 不能有两个 age 标签 |
| 数据会在代码运行前创建 | _start 开始时,数据就可以使用了 |
在接下来的课程中,你将学习如何使用 db、dw、dd 和 dq 定义不同类型的数据。
挑战
在 data.asm 文件中编写代码,以完成以下操作:
- 创建
.data段 - 创建一个名为
count、值为 5 的字节
亲手试试
%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 在线编辑器