汇编语言博客清单

本博客内容仅供学习交流。本人不对任何第三方基于本博客内容抓取的衍生工具(包括但不限于Skill、插件、智能体等)的输出结果作任何明示或暗示的担保。使用者需自行判断其准确性与合规性,因使用此类工具所引发的决策失误、数据泄露及其他直接或间接损失,均由使用者自行承担,与本人无关。

8086 实模式

该部分博客整理自王爽版《汇编语言》,这本书的优点在于逻辑线很清晰,行文通俗易懂,学习周期短(个人主观估计过一遍 + AI 辅助的话大概 2 周)。除了学习汇编语言的基础,更能帮助搭建计算机组成原理和操作系统相关知识的框架。同时,我使用了大模型对对应的现代系统的机制进行简单补充。

基础概念与工具

汇编语言:存储器和寄存器
汇编语言:DOSBox 与 Debug 的使用
汇编语言:数据段和栈段
汇编语言:编写汇编程序

内存访问与数据处理

汇编语言:内存间接寻址和循环
汇编语言:包含多个段的程序
汇编语言:基址变址内存访问
汇编语言:数据处理的位置与长度

流程控制与子程序

汇编语言:转移指令
汇编语言:子程序的实现
汇编语言:直接向显存写数据
汇编语言:标志寄存器
汇编语言:cmp 指令和条件转移

中断机制与例程安装

汇编语言:中断处理程序
汇编语言:中断例程的调用
汇编语言:数据标号和直接定址表

外设的处理和操作

汇编语言:端口 I/O
汇编语言:外中断
汇编语言:使用 BIOS 进行外设读写

希望在有生之年能更新 x86 保护模式汇编的内容呵呵……

为什么学习汇编

这个部分往后放是因为本篇博客主要还是整理我的博客清单,不喧宾夺主,在末尾简单聊聊这个话题。在我看来,学习汇编主要有两个理由:

有些技术方向需要汇编

第一,有些技术方向需要熟练掌握汇编语言。比如网络安全领域中的逆向工程、漏洞分析和 CTF pwn 等需要通过反汇编来对程序进行分析,从机器指令中还原逻辑、定位漏洞、构造利用链,汇编的掌握程度就非常重要。
搜狗高速浏览器截图20260828013130

本科的时候我也打过一些 CTF,但是大部分都是陪跑或者拿个优秀奖,一个很重要的原因就是我们都不太会打逆向和 pwn。所以经常就是打开 IDA pro 搜索一下 flag,搜不到就只能瞪着 IDA pro 的图表看,然后 IDA pro 也瞪着我看。
image

再比如嵌入式和驱动开发,资源受限的 MCU 上经常需要编写汇编程序来控制时序、配置中断向量表或直接操作寄存器。在操作系统和内核开发中,启动代码、上下文切换、系统调用入口、内存管理底层也需要编写汇编程序。因此对于以上方向,掌握汇编语言是刚需。

搭建计算机专业知识体系

第二,能帮助你搭建计算机专业知识体系,特别是计算机组成原理和操作系统方面的。计算机组成原理里讲的寄存器、ALU、指令周期,操作系统里讲的进程切换、中断处理、系统调用,这些概念如果只停留在课本上的文字描述,永远是模糊的。

这里我以计算机组成原理为例,我本科用的是白中英版《计算机组成原理》。对于基本寻址方式,课本中直接将各种寻址方式用你看不懂得中文全部喂给你。这个章节是“指令系统”,当你看完这一团东西,是搞不清楚那指令到底怎么写,指令和偏移等具体是如何工作的(至少我是看不懂的)。
116e42fa4115a1f6e367c7cbd7d192d0
但是其实这些不同的寻址方式,对应到汇编指令来说是非常清晰的,只需要写几条指令然后跑个程序或者 debug 一下就能了解。

寻址方式 示例 适用场景
直接寻址 [idata] 访问单个静态变量
寄存器间接 [bx] 访问一维数组(单指针)
寄存器相对 [bx+idata] 访问结构体成员或一维数组(带起始偏移)
基址变址 [bx+si] 访问二维数组(双指针)
相对基址变址 [bx+si+idata] 访问结构体数组或复杂嵌套数据

对于寄存器,课本中会直接把所有常用的计算器类型罗列给你,看完之后我们还是搞不懂这些寄存器到底为什么要有、有什么用、如何协同工作。而汇编指令很多都是直接对寄存器进行操作的,通过编写并 debug 一些汇编程序,就会很直观地知道这些寄存器的值是怎么变化的,起什么作用,就能反过来理解为什么要有这个寄存器。
43058223d2d35f09df15d9f22b9c5d2f

对于某条指令的指令周期,课本会用大量文字对着空气比划半天,然后再配上一张可读性极差的图。前面指令系统和寄存器的内容我们已经看不懂了,这里的内容同样也看不懂(我当时就没看懂)。然而写汇编程序时本身就能用这些指令进行操作,还能用 debug 观察寄存器的变化,就能很直观地知道一条指令都干了什么。
b23a684f33f5a374080afd065c6ae7c5

对于中断处理,课本同样会在你没有真正见过中断机制是怎么运作的情况下,用长篇大论的文字让你在脑海中想象出这些东西。然而,通过调用或编写一些中断例程,你就能知道中断在计算机中具体是如何工作的,再通过 debug 就能搞清楚工作流程如何。
92d5712c969153f49e83d6a2294905b4

类似的例子还能举出很多,当然啰嗦这么多我只是为了说明人是不能想象自己没见过的事物的,这部分知识如果没有结合编程和实验都会非常抽象、晦涩难懂。所以大部分同学在上大部分的《计算机组成原理》课程时,都是对着看不懂或者听不懂的中文(也有可能是英文或者其他)罚坐一节课,然后把 PPT 里的所谓的“重点”搬运到课本上或笔记本上(这还算好的了)。复习的时候通过各种方式逼迫自己把这一团东西转录到脑子的易失性存储器里,考试时非常生硬把它们地打印到试卷上。然后考试结束过了,这门课从此再见。

我觉得更不好的地方在于,这样的学习过程像是《水浒传》中的杀威棒。入学时你对计算机充满了兴趣和好奇,但每次学这些东西你就会感到困难、害怕,会觉得这玩意是不是设计出来就是为了让我们学不会的,就越来越讨厌、排斥这些知识(包括我在内的很多身边同学都有过类似的感受)。我觉得学习的过程不应该这样,而事实上我们也可以选择不这样做。

虽然学习汇编语言大概率也不会让你对计算机感兴趣,但当你写过几段汇编指令,通过 debug 看到一条指令怎么操作寄存器、子程序调用怎么在栈上压入返回地址、中断怎么保存上下文,这些抽象概念就会变得清楚、直观。从 CPU 硬件到指令集,到汇编,到以 C 语言为代表的高级语言,再到操作系统和应用层,这些零散的知识点可能就能形成体系。这也是我为什么读研了后还会穿插用休假的时间看看这个我本科时没有学过的知识的原因,我认为理解我们手上的工具是如何运行、工作的,这本身就很让人心动。

不过,如果你已经高年级(例如大二下以后)且你选择专精的方向不需要学习汇编,那我也不建议学习汇编语言,现在更应该学习的是你的方向的技术栈而不是这个。不同的事情适合在不同的阶段完成,汇编语言能帮助你更好地理解课上的很多“基础知识”是什么,但大概率不能解决刚需问题。所以这件事越早做越好,但是错过了也不可惜。

同时现在可以用 AI 进行辅助学习,我自己在学习和写博客的时候也是这么做的,包括不限于:解释概念、补全程序、debug、给代码加注释、补充了解现代 CPU 的机制等。特别是对于这样的基础知识,使用 AI 可以将学习和解决问题的速度提升到原来的数倍。至于 AI 时代中学习的必要性问题,我建议你读一读这篇文章:《给 AI 时代的“一生一芯”初学者的一封信》。

参考资料

《汇编语言(第四版)》,王爽 编著,清华大学出版社

posted @ 2026-08-28 02:47  乌漆WhiteMoon  阅读(53)  评论(0)    收藏  举报