Menu
CoddyTech

.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.asmsection .data,其中包含你的数据定义
main.asm先写 %include "data.asm",然后写包含代码的 section .text

程序运行时会发生什么:

  1. 操作系统会将你的程序加载到内存中
  2. 它会读取 .data 部分,并将你的数据放置在特定的内存地址
  1. 你的标签(age、price、name)会变成地址
  2. 现在,你的代码可以使用 [age]、[price]、[name] 来访问这些地址

重要规则:

规则说明
将数据放在一起你可以多次打开 section .data(汇编器会将这些部分合并),但在 data.asm 中使用一个单独的单元会更容易阅读
标签必须唯一不能有两个 age 标签
数据会在代码运行前创建_start 开始时,数据就可以使用了

在接下来的课程中,你将学习如何使用 db、dw、dd 和 dq 定义不同类型的数据。

challenge icon

挑战

在 data.asm 文件中编写代码,以完成以下操作:

  1. 创建 .data 段
  2. 创建一个名为 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Assembly 在线编辑器