HoRain云--汇编语言变量操作

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
|
专栏名称 |
专栏介绍 |
|
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录

在汇编语言中,“变量”本质上是给内存单元起的符号名,用于代表一块可读写的数据存储区域。不同于高级语言的类型系统,汇编中的变量更关注大小(字节数)、地址和存储位置。
以下是关于汇编语言变量的核心知识点(以 x86 (IA-32) 架构、NASM 语法(Linux/跨平台常用)为主进行说明):
1. 变量的本质
-
内存地址的别名:
var1对应某个内存地址。 -
大小固定:定义时需明确占用多少字节(byte/word/dword 等)。
-
无类型检查:CPU 不关心数据含义,只按指令操作二进制数据。
2. 变量的定义(数据声明)
变量通常定义在数据段中。
|
伪指令 |
含义 |
大小 |
|---|---|---|
|
|
Define Byte |
1 字节 |
|
|
Define Word |
2 字节 |
|
|
Define Doubleword |
4 字节 |
|
|
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. 常用寻址方式(与变量结合)
这是汇编中最灵活的部分:
|
寻址方式 |
示例 |
说明 |
|---|---|---|
|
直接寻址 |
|
直接使用变量地址 |
|
寄存器间接 |
|
通过寄存器存地址访问 |
|
基址变址 |
|
常用于数组遍历 |
|
带偏移 |
|
访问数组第3个元素 |
6. NASM vs MASM 语法区别(重要)
初学者常混淆这一点:
|
场景 |
NASM (Intel) |
MASM/TASM |
|---|---|---|
|
取地址 |
|
|
|
取内容 |
|
|
|
大小指定 |
|
|
建议:初学务必选定一种语法,避免混用。
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. 易错点总结
-
忘记加
[]:导致把地址当数据用了。 -
大小不匹配:
mov al, [var]如果 var 是 dd,会截断数据。 -
段错误 (Segmentation Fault):试图写入
.text段(代码段通常是只读的)。 -
混淆地址与值:这是汇编入门最大的门槛。
如果你正在学习特定的汇编器(如 MASM、ARM 汇编、RISC-V)或针对特定操作系统(Windows/Linux/MacOS),可以告诉我,我可以针对性地讲解对应的变量定义方式和调用约定。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)