当前位置: 首页 > news >正文

x64汇编:内存工作的基本原理

大家好,你们可以叫我凌,是个16岁网络安全学习者。

想不到吧,我也有学习研究x64汇编语言(察觉现在安全领域该人才较少)。可是我发现目前市面上对于x64汇编的资料少之又少,参考的文章也不多(对于我这个英语渣来说)。所以我准备在学习的时候也顺便写写文章来分享分享我的学习笔记,供大家一起学习分享。

本栏目永远坚持无偿分享,欢迎各路学者


内存的本质:一排带编号的开关

计算机内存其实就是一个巨大连续的开关阵列(微观角度,俗语叫做“晶体管”)。每个开关只能处于两种状态:

0 = 断开(没电)
1 = 闭合(有电)

这些开关被分成8个一组,每组称为一个字节(byte)
为什么要8个一组?因为8个开关能表示2**8 = 256种不同的0/1组合,足够表示英文字母、数字、小整数等。

每一组开关(每一个字节)都有一个唯一的编号,这个编号叫做地址
例如:
- 第0组开关的地址是0
- 第1组开关的地址是1
- 第2组开关的地址是2
- 略......

地址通常用十六进制书写(比如0x1000),相当于门牌号

下面是个微型内存(只有3个字节):

地址开关状态(8个开关)解释(可以当作什么)
001000001字母A的编码
101000010字母B的编码
201000011字母C的编码

内存里只存储这些0和1,至于它们代表字母还是数字,完全由程序决定。

如何找到一组开关(地址与标签)

在汇编语言里,我们可以直接使用数字地址(比如 [0]),但更常见的做法是给地址个名字(标签)。例如下面这个:

section .data
my_byte db 01000001b; 把地址 X 命名为 my_byte,并让那组开关变成 01000001

这里db表示“定义一个字节”01000001b后面的b表示二进制数。
之后,my_byte就代表那个地址,[my_byte]代表该地址里开关的状态

读写内存:用 mov 指令

CPU不能直接操作内存里的开关,它必须先把开关状态复制到自己内部的“记事本”(寄存器)里。
寄存器也有名字,比如al是一个8位的“记事本”(正好装下一组开关)。

- 读内存:把开关状态复制到寄存器

mov al, [my_byte]; 把 my_byte 那组开关的0/1状态复制到 al

- 写内存:把寄存器的值复制到开关组

mov [my_byte], al; 把 al 里的0/1状态复制到 my_byte 那组开关

注意:[my_byte]表示“开关组本身”,而my_byte表示“开关组的地址(编号)”
-mov al, [my_byte]→ 正确,读开关状态
-mov al, my_byte→ 错误,会把地址编号当成数据

一个完整的例子(可编译运行)

下面这个程序定义了三个字节变量,然后交换它们的值,最后以退出码形式输出其中一个变量的值(作为验证)。

; 文件名: swap_bytes.asm

; 功能: 交换两个字节变量的值,并退出

section .data

a db 00000001b ; 地址 a 里存 1

b db 00000010b ; 地址 b 里存 2

c db 00000000b ; 地址 c 里存 0

section .text

global _start

_start:

; 把 a 和 b 的值读到寄存器

mov al, [a] ; al = 1

mov bl, [b] ; bl = 2

; 交换

mov [a], bl ; a 变成 2

mov [b], al ; b 变成 1

; 把 a 的新值作为退出码

movzx rdi, byte [a] ; rdi = 2 (movzx 将8位扩展到64位)

mov rax, 60

syscall

编译和运行(在 Linux 终端中):

nasm -f elf64 swap_bytes.asm -o swap_bytes.o

ld swap_bytes.o -o swap_bytes

./swap_bytes

echo $?# 输出 2,证明交换成功

这个程序虽没有任何打印输出,但它通过退出码告诉了我们结果。你可以修改ab的初始值,重新编译运行,观察退出码的变化。


小结

-内存 = 无数个8个一组的开关,每个开关只能0或1。
-地址 = 开关组的编号,我们可以给编号起名字(标签)。
-读写内存:mov指令,配合中括号[]表示开关组本身。
-寄存器:CPU内部的“记事本”,用于临时存放数据。

拓展

以上只讲了内存最核心的模型:开关地址读写。但实际编程中还会遇到以下概念,它们将在本栏目的后续笔记中逐一深入:

- 空指针引用为什么崩溃
简单来说,地址0被操作系统保护,访问它会导致程序终止。

- 内存分配:谁来决定你能用哪些地址
操作系统给每个程序划了一块地址范围,程序只能在这块范围内读写。

- 堆和栈是什么
栈用于函数调用和局部变量,堆用于动态申请内存。

- 堆溢出、栈溢出、内存泄漏

以上拓展内容都会在之后进行讲解,现在不要求掌握(大概了解下也行)

http://www.jsqmd.com/news/583314/

相关文章:

  • AI-现金流指南-最大化利润的-ChatGPT-货币化
  • 运动AI市场2026预测:亚太领跑、传感器国产化与5G+边缘计算新机遇
  • 开篇:数据处理绕不开的合并与拼接
  • Autovisor:智能优化在线课程学习效率的自动化解决方案
  • 2025届最火的降AI率平台推荐
  • 基于PLC的6层3部电梯 12000+字,纯手写的,西门子S7-1200PLC,文章里面的图纸...
  • ChatGPT-AI-大师终极指南
  • 基于单片机的全自动咖啡机控制系统设计
  • UE5-MCP终极指南:用AI魔法让游戏开发变得像聊天一样简单
  • 2026届毕业生推荐的十大降AI率工具横评
  • 团队技术专家的技术设计模版,真心好用!
  • 从零开始掌握小红书数据采集:xhs库的5大实战应用场景
  • 单片机代码版本管理工具横向评测与应用
  • 如何0失败部署ChemCrow?从环境配置到功能落地的全景指南
  • 基于机器学习提升烟雾探测器预测精度:告别误报,守护安全
  • 2025最权威的十大降重复率神器实际效果
  • 山东境内企业拓客推荐:当下获客越来越难,这几家平台值得参考
  • 解决方案:OpenRPA如何破解企业流程自动化成本与效率的双重困境
  • openclaw钉钉机器人团队
  • BomGW v1.0软网关 PLC存储到数据库SQL配置方法说明书
  • 论文AI率过高怎么降?实测有效方法+免费工具推荐
  • ChatGPT-提示词-600-个学习新技能的随意提示
  • 2026 AI提效工具排行榜:ChatGPT、DeepSeek、Claude谁最强?AI办公全盘点
  • 《致20岁的你》书摘
  • 基于Matlab的子空间拟合估计方法(包括信号子空间拟合、噪音子空间拟合及最大似然算法拟合)
  • 【快速EI检索】2026数据科学与决策智能国际学术会议(DSID 2026)
  • 2026年必看:高端内存条品牌优选指南
  • 手滑删记录当场 “心梗”?别慌!黄金防覆盖指南 + 恢复神器对比,帮你秒救珍贵回忆
  • MinerU文档探索器:告别文档翻找噩梦,为OpenClaw装上火眼金睛
  • ISP中Lv和ISO系统并存的意义