🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

1. 变量的本质

2. 变量的定义(数据声明)

示例:

3. 变量的初始化与访问

初始化

访问变量(寻址)

4. 变量的内存布局

5. 常用寻址方式(与变量结合)

6. NASM vs MASM 语法区别(重要)

7. 实战示例:简单变量操作

8. 易错点总结


img

在汇编语言中,“变量”本质上是给内存单元起的符号名,用于代表一块可读写的数据存储区域。不同于高级语言的类型系统,汇编中的变量更关注大小(字节数)、地址和存储位置

以下是关于汇编语言变量的核心知识点(以 x86 (IA-32)​ 架构、NASM 语法(Linux/跨平台常用)为主进行说明):


1. 变量的本质

  • 内存地址的别名var1对应某个内存地址。

  • 大小固定:定义时需明确占用多少字节(byte/word/dword 等)。

  • 无类型检查:CPU 不关心数据含义,只按指令操作二进制数据。


2. 变量的定义(数据声明)

变量通常定义在数据段中。

伪指令

含义

大小

DB

Define Byte

1 字节

DW

Define Word

2 字节

DD

Define Doubleword

4 字节

DQ

Define Quadword

8 字节

示例:

section .data           ; 已初始化的数据段
    msg     db  'Hello', 0   ; 字符串(以0结尾)
    age     dd  25          ; 32位整数
    pi      dq  3.14159     ; 64位浮点数

section .bss            ; 未初始化的数据段(节省空间)
    buffer  resb 128     ; 预留 128 字节
    count   resd 1       ; 预留 1 个双字 (4字节)

3. 变量的初始化与访问

初始化

  • 数值var dd 100

  • 字符char db 'A'

  • 数组arr dw 1, 2, 3, 4

  • 重复定义zeros times 10 db 0(定义10个0)

访问变量(寻址)

需要通过方括号 []​ 来访问内存内容(NASM语法):

mov eax, var     ; ❌ 错误:将 var 的地址存入 eax
mov eax, [var]   ; ✅ 正确:将 var 地址处的 4 字节数据存入 eax

mov byte [var], 5 ; ✅ 修改该内存处的值为 5

4. 变量的内存布局

假设有以下定义:

section .data
    b1 db 0x11
    w1 dw 0x2233
    d1 dd 0x44556677

内存排列(小端序 x86):

地址:   00  01  02  03  04  05  06  07
内容:   11  33  22  77  66  55  44  ...
        ↑b1  ↑w1低 ↑w1高 ↑d1低 → 高

5. 常用寻址方式(与变量结合)

这是汇编中最灵活的部分:

寻址方式

示例

说明

直接寻址

mov eax, [var]

直接使用变量地址

寄存器间接

mov ebx, var
mov eax, [ebx]

通过寄存器存地址访问

基址变址

mov eax, [ebx + ecx*4]

常用于数组遍历

带偏移

mov eax, [arr + 8]

访问数组第3个元素


6. NASM vs MASM 语法区别(重要)

初学者常混淆这一点:

场景

NASM (Intel)

MASM/TASM

取地址

mov eax, var

mov eax, OFFSET var

取内容

mov eax, [var]

mov eax, var

大小指定

mov word [var], 1

mov var, 1(自动推断)

建议:初学务必选定一种语法,避免混用。


7. 实战示例:简单变量操作

section .data
    num1    dd  10
    num2    dd  20
    result  dd  0

section .text
    global _start

_start:
    mov eax, [num1]    ; eax = 10
    add eax, [num2]    ; eax = 30
    mov [result], eax  ; 保存结果

    ; 退出程序 (Linux syscall)
    mov eax, 60
    xor edi, edi
    syscall

8. 易错点总结

  1. 忘记加 []:导致把地址当数据用了。

  2. 大小不匹配mov al, [var]如果 var 是 dd,会截断数据。

  3. 段错误 (Segmentation Fault):试图写入 .text段(代码段通常是只读的)。

  4. 混淆地址与值:这是汇编入门最大的门槛。


如果你正在学习特定的汇编器(如 MASM、ARM 汇编、RISC-V)或针对特定操作系统(Windows/Linux/MacOS),可以告诉我,我可以针对性地讲解对应的变量定义方式和调用约定。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐