豆瓣读书:https://book.douban.com/subject/20492528/
之前在大学时学过一些 “CS-51 系列” 单片机相关的课程(单片机原理、接口技术),
现在回想一下,算是最早的一次 汇编语言 的学习经历了。
一恍已经过了好多年了,有很多书籍都会用到汇编相关的知识,例如,
《程序员的自我修养》《深入浅出 WebAssembly》,跟 编译 和 并发 相关的书籍,有时也会提到 汇编指令。
所以,上学时学的那些 “单片机汇编” 已经远远不够用了,有必要再补充一些较为 “近代” 的汇编内容。
《x86 汇编语言》我之前早就听说是一本书好书,只是苦于一直排不上日程来阅读,
这几天刚好有整块的时间来阅读一下。
本书并没有沿袭其他 “汇编语言教程” 的套路,没有把写作重心用来介绍汇编指令的用法。
而是通过介绍以下几方面的内容,让读者对汇编语言产生兴趣:
- 一些准备知识:计算机组成原理(指令/寄存器/内存地址),硬盘和显卡(主引导扇区/显存)
- 汇编语言工程化:汇编代码的编译、调试、在虚拟机中运行
- 从零开始写一个操作系统内核:主引导程序、操作系统内核、用户程序、任务调度
我觉得以上这样的行文方式是极好的,让我理解了 “近代” 汇编语言在整个软件系统中的位置和作用。
在读这本书之前,我甚至都不知道什么是 “实模式” 什么是 “保护模式”,
整个读下来,才发现我原来什么都不懂。
大多数汇编语言教程会介绍一些工具,将我们自己编写的汇编代码,编译成特定操作系统上可执行的文件,
这是因为操作系统对 用户程序的格式 是有要求的,除了包含用户编写的代码之外,还有很多额外的信息。
本书另辟蹊径,采用了让计算机直接加载用户代码的思路来书写。
计算机加电启动后,BIOS 会读取硬盘主引导扇区的内容,并将它加载到内存地址 0x0000:0x7c00 处,
然后跳转到这个位置开始执行,一切都从这里开始。
于是作者分三步走:
(1)编写一段程序,把它编译之后写入硬盘的主引导扇区,然后让处理器执行
(2)通过对代码进行分段,将主引导程序分成两个部分:加载器、用户程序(包含头部信息)。然后让 “加载器” 调用(事先写好的)的 “用户程序” 来执行
(3)为了能加载(任意的)的 “用户程序”,将整个调用过程分为三个部分:主引导程序、内核、用户程序。主引导程序负责加载内核,并转交控制权;然后,内核负责加载用户程序,并提供各种例程(API)给用户程序调用。
在这整个过程中,作者穿插讲解了以下内容:
- 主引导扇区(加载方式和结束标志),在显存中写入字符,
mov
指令用法汇总 - 循环指令,各种标志位,条件转移指令
- 栈和栈段,8086 处理器的寻址方式汇总
- 分段(vstart,align),外设和接口(读扇区数据),用户程序重定位,跳转指令汇总
- 中断(中断向量表),内部中断,软中断
- IA-32 处理器架构
- 全局描述符表,段描述符,启用保护模式
- 内核的结构,用户程序的加载和重定位
- 任务,特权级,任务切换,分页机制
- 异常处理,抢占式多任务
通读下来收获非常大,感觉从硬件到软件这条脉络被打通了。
再看一些汇编相关的书籍,应该不会太难读懂了。
好书,值得推荐。