《x86汇编语言:从实模式到保护模式》是站长原著图书,于2013年出版。当初写这本书的动机很简单,就是觉得市面上没有合适的汇编教材(虽然汇编语言已经不再热门),所以想用自己的方式讲述处理器的工作原理以及汇编语言是什么。但是出版后,大家一致认为它对学习和理解操作系统有非常大的帮助,这倒是我始料未及的,也算是无心插柳吧。

        以下是本书封面及其它相关内容的介绍。本书有配套视频,且视频的内容和本书不同(毕竟书的出版时间较早),强烈建议观看视频。

---图书封面---

x86asm


---内容简介---

        每一种处理器都有它自己的机器指令集,而汇编语言的发明则是为了方便这些机器指令的记忆和书写。尽管汇编语言已经较少用于大型软件程序的开发,但从学习者的角度来看,要想真正理解计算机的工作原理,掌握它内部的运行机制,学习汇编语言是必不可少的。

        这套图书分为两册,采用开源的NASM汇编语言编译器和VirtualBox虚拟机软件,以个人计算机广泛采用的Intel处理器为基础,详细讲解了Intel处理器的指令系统和工作模式,以大量的代码演示了16/32/64位软件的开发方法。上册集中介绍处理器的16位实模式和32位保护模式,以及基本的指令系统;下册侧重于介绍64位工作模式、多处理器管理、高速缓存控制、温度和电源管理、高级可编程中断控制器、多媒体支持等内容。

        这是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、WINDOWS、LINUX或者任何其他软件支持的情况下来显示字符、读取硬盘数据、控制其他硬件等。本书可作为大专院校相关专业学生和计算机编程爱好者的教程。

        未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。 版权所有,侵权必究。


---图书在版编目(CIP)数据---

x86汇编语言:从实模式到保护模式/李忠,王晓波,余洁著. —北京:电子工业出版社,2013.1
ISBN 978-7-121-18799-5
Ⅰ. ①x… Ⅱ. ①李… ②王… ③余… Ⅲ. ①汇编语言—程序设计 Ⅳ. ①TP313
中国版本图书馆CIP数据核字(2012)第253290号


---增值服务(视频)---

flmouse        本书的配套视频已经在网易云课堂发布。视频内容以纸质书的内容为主线,但并不完全一致,部分内容有所增强和细化。购买或者了解更多

  


---售后服务---

downfile        你可以下载配书文件包(约15MB),其中包括了每一章的源程序、工具软件、部分检测点和习题答案,以及相关资料。


---图书基本信息---

作 者:李忠,王晓波,余洁
出版时间:2013-01
字 数:620千字
版 次:01-01
页 数:360
开 本:16(185*260)
装 帧:平装
ISBN:9787121187995
纸质书定价:¥56.0


---第1版前言---

        尽管汇编语言也是一种计算机语言,但却是与众不同的,与它的同类们格格不入。处理器的工作是执行指令并获得结果,而为了驾驭处理器,汇编语言为每一种指令提供了简单好记、易于书写的符号化表示形式。

        一直以来,人们对于汇编语言的认识和评价可以分为两种,一种是觉得它非常简单,另一种是觉得它学习起来非常困难。

        你认为我会赞同哪一种?说汇编语言难学,这没有道理。学习任何一门计算机语言,都需要一些数制和数制转换的知识,也需要大体上懂得计算机是怎么运作的。在这个前提下,汇编语言是最贴近硬件实体的,也是最自然和最朴素的。最朴素的东西反而最难掌握,这实在说不过去。因此,原因很可能出在我们的教科书上,那些一上来就搞一大堆寻址方式的书,往往以最快的速度打败了本来激情高昂的初学者。

        但是,说汇编语言好学,也同样有些荒谬。据我的观察,很多人掌握了若干计算机指令,会编写一个从键盘输入数据,然后进行加减乘除或者归类排序的程序后,就认为自己掌握了汇编语言。还有,直到现在,我还经常在网上看到学生们使用DOS中断编写程序,他们讨论的也大多是实模式,而非32位或者64位保护模式。他们知道如何编译源程序,也知道在命令行输入文件名,程序就能运行了;又或者使用一个中断,就能显示字符。至于这期间发生了什么,程序是如何加载到内存中的,又是怎么重定位的,似乎从来不关汇编语言的事。这样做的结果,就是让人以为汇编语言不过如此,而且非常枯燥。

        很难说我已经掌握了汇编语言的要义。但至少我知道,尽管汇编语言不适合用来编写大型程序,但它对于理解计算机原理很有帮助,特别是处理器的工作原理和运行机制。就算是为了这个目的,也应该让汇编语言回归它的本位,那就是访问和控制硬件(包括处理器),而不仅仅是编写程序,输入几个数字,找出正数有几个、负数有几个,大于30的有几个。

         事实上,汇编语言对学习和理解高级语言,比如C语言,也有极大的帮助。老教授琢磨了好几天,终于想到一个好的比喻来帮助学生理解什么是指针,实际上,这对于懂得汇编语言的学生来说,根本就不算个事儿,并因此能够使老教授省下时间来喝茶。

         在这本书之前,我也写过《穿越计算机的迷雾》一书。它们是一个系列,没有基础的读者可以先看那本书,打一点计算机原理的基础再来学习汇编语言。

         在计划写这本书的时候,我就给自己画了几条线。首先不能走老路,一上来就讲指令、寻址方式,而是采用任务驱动的方式来写,每一章都要做点事情,最好是比较有趣,有吸引力。在解决问题的过程中,不断地引入新指令,并进行讲解。一句话,我希望是润物细无声式的;其次,汇编语言和硬件并举,完全抛弃BIOS中断和DOS中断,直接访问硬件,发挥汇编语言的长处,因为这才是我们学习汇编语言的目的。也只有这样,读者才能深刻体会到汇编语言的妙处。

         王晓波和湖北经济学院的余洁共同参与了本书的创作。

        这套图书主要讲述INTEL x86处理器的16位实模式、32位保护模式和64位模式(INTEL64),至于虚拟8086模式,则是为了兼容传统的8086程序,现在看来已经完全过时,不再进行讲述。本书的特色之一是提供了大量典型的源代码,这些代码以及相配套的工具程序可以到我的个人网站下载。

        很多读者在读书的时候会遇到这种情况:一开始读得很快,一口气读了好几章。随着内容的深入,学习越来越吃力,不得不频繁回到前面重新学习已经讲过的内容,这就是因为前面的知识没有完全掌握。为此,本书每一章都设有检测点,读者应当在通过检测点之后再继续往后阅读。

        本书原来有18章,后来,考虑到实模式的内容过多,而去掉了一章。这一章的标题是《聆听数字的声音》,讲述如何通过直接访问和控制Sound Blaster 16声卡来播放声音,感兴趣的朋友可以从下载的配书文件包中找到这部分内容。

        好友王南洋、桑国伟、刘维钊、蒋胜友、邱海龙、万利、李文心等负责了本书的一部分校对工作;好友周卫平帮我验证配书代码是否能在他的机器上正常工作,在这里向他们表示感谢,同时也谢谢所有关心和支持本书的朋友们。


---第1版目录--

第1部分 预备知识
第1章 十六进制计数法 3
1.1 二进制计数法回顾 3
1.1.1 关于二进制计数法 3
1.1.2 二进制到十进制的转换 4
1.1.3 十进制到二进制的转换 4
1.2 十六进制计数法 5
1.2.1 十六进制计数法的原理 5
1.2.2 十六进制到十进制的转换 6
1.2.3 十进制到十六进制的转换 6
1.2.4 为什么需要十六进制 6
1.3 使用Windows计算器方便你的学习过程 8
本章习题 9


第2章 处理器、内存和指令 10
2.1 最早的处理器 10
2.2 寄存器和算术逻辑部件 10
2.3 内 存 储 器 12
2.4 指令和指令集 14
2.5 古老的Intel 8086处理器 16
2.5.1 8086的通用寄存器 16
2.5.2 程序的重定位难题 16
2.5.3 内存分段机制 19
2.5.4 8086的内存分段机制 21
本章习题 24


第3章 汇编语言和汇编软件 25
3.1 汇编语言简介 25
3.2 NASM编译器 27
3.2.1 NASM的下载和安装 27
3.2.2 代码的书写和编译过程 27
3.2.3 用HexView观察编译后的机器代码 30
本章习题 31

第4章 虚拟机的安装和使用 32
4.1 计算机的启动过程 32
4.1.1 如何将编译好的程序提交给处理器 32
4.1.2 计算机的加电和复位 33
4.1.3 基本输入输出系统 33
4.1.4 硬盘及其工作原理 34
4.1.5 一切从主引导扇区开始 36
4.2 创建和使用虚拟机 37
4.2.1 别害怕,虚拟机是软件 37
4.2.2 下载和安装Oracle VM VirtualBox 37
4.2.3 虚拟硬盘简介 39
4.2.4 练习使用FixVhdWr工具向虚拟硬盘写数据 40


第2部分 16位处理器下的实模式
第5章 编写主引导扇区代码 45
5.1 本章代码清单 45
5.2 欢迎来到主引导扇区 45
5.3 注 释 46
5.4 在屏幕上显示文字 46
5.4.1 显卡和显存 46
5.4.2 初始化段寄存器 49
5.4.3 显存的访问和ASCII代码 49
5.4.4 显示字符 51
5.4.5 MOV指令的格式 52
5.5 显示标号的汇编地址 54
5.5.1 标号 54
5.5.2 如何显示十进制数字 58
5.5.3 在程序中声明并初始化数据 58
5.5.4 分解数的各个数位 59
5.5.5 显示分解出来的各个数位 63
5.6 使程序进入无限循环状态 64
5.7 完成并编译主引导扇区代码 66
5.7.1 主引导扇区有效标志 66
5.7.2 代码的保存和编译 67
5.8 加载和运行主引导扇区代码 67
5.8.1 把编译后的指令写入主引导扇区 67
5.8.2 启动虚拟机观察运行结果 68
5.9 程序的调试技术 68
5.9.1 开源的BOCHS虚拟机软件 68
5.9.2 BOCHS下的程序调试入门 69
本章习题 75


第6章 相同的功能,不同的代码 76
6.1 代码清单6-1 76
6.2 跳过非指令的数据区 76
6.3 在数据声明中使用字面值 77
6.4 段地址的初始化 77
6.5 段之间的批量数据传送 78
6.6 使用循环分解数位 80
6.7 计算机中的负数 81
6.7.1 无符号数和有符号数 81
6.7.2 处理器视角中的数据类型 85
6.8 数位的显示 87
6.9 其他标志位和条件转移指令 88
6.9.1 奇偶标志位PF 88
6.9.2 进位标志CF 89
6.9.3 溢出标志OF 89
6.9.4 现有指令对标志位的影响 90
6.9.5 条件转移指令 90
6.10 NASM编译器的$和$$标记 92
6.11 观察运行结果 93
6.12 本章程序的调试 93
6.12.1 调试命令“n”的使用 93
6.12.2 调试命令“u”的使用 94
6.12.3 用调试命令“info”察看标志位 96
本章习题 97


第7章 比高斯更快的计算 98
7.1 从1加到100的故事 98
7.2 代码清单7-1 98
7.3 显示字符串 98
7.4 计算1到100的累加和 99
7.5 累加和各个数位的分解与显示 99
7.5.1 栈和栈段的初始化 99
7.5.2 分解各个数位并压栈 101
7.5.3 出栈并显示各个数位 103
7.5.4 进一步认识栈 104
7.6 程序的编译和运行 105
7.6.1 观察程序的运行结果 105
7.6.2 在调试过程中察看栈中内容 106
7.7 8086处理器的寻址方式 107
7.7.1 寄存器寻址 107
7.7.2 立即寻址 107
7.7.3 内存寻址 108
本章习题 112


第8章 硬盘和显卡的访问与控制 113
8.1 本章代码清单 114
8.2 用户程序的结构 114
8.2.1 分段、段的汇编地址和段内汇编地址 114
8.2.2 用户程序头部 117
8.3 加载程序(器)的工作流程 120
8.3.1 初始化和决定加载位置 120
8.3.2 准备加载用户程序 121
8.3.3 外围设备及其接口 122
8.3.4 I/O端口和端口访问 123
8.3.5 通过硬盘控制器端口读扇区数据 125
8.3.6 过程调用 127
8.3.7 加载用户程序 133
8.3.8 用户程序重定位 134
8.3.9 将控制权交给用户程序 137
8.3.10 8086处理器的无条件转移指令 138
8.4 用户程序的工作流程 140
8.4.1 初始化段寄存器和栈切换 140
8.4.2 调用字符串显示例程 141
8.4.3 过程的嵌套 142
8.4.4 屏幕光标控制 142
8.4.5 取当前光标位置 143
8.4.6 处理回车和换行字符 144
8.4.7 显示可打印字符 145
8.4.8 滚动屏幕内容 145
8.4.9 重置光标 146
8.4.10 切换到另一个代码段中执行 146
8.4.11 访问另一个数据段 147
8.5 编译和运行程序并观察结果 147
本章习题 148


第9章 中断和动态时钟显示 149
9.1 外部硬件中断 149
9.1.1 非屏蔽中断 150
9.1.2 可屏蔽中断 150
9.1.3 实模式下的中断向量表 152
9.1.4 实时时钟、CMOS RAM和BCD编码 154
9.1.5 代码清单9-1 157
9.1.6 初始化8259、RTC和中断向量表 157
9.1.7 使处理器进入低功耗状态 159
9.1.8 实时时钟中断的处理过程 160
9.1.9 代码清单9-1的编译和运行 162
9.2 内 部 中 断 163
9.3 软 中 断 163
9.3.1 BIOS中断 163
9.3.2 代码清单9-2 165
9.3.3 从键盘读字符并显示 165
9.3.4 代码清单9-2的编译和运行 165
本章习题 166


第3部分 32位保护模式
第10章 32位x86处理器编程架构 169
10.1.2 基本的工作模式 172
10.1.3 线性地址 173
10.2 现代处理器的结构和特点 174
10.2.1 流水线 174
10.2.2 高速缓存 175
10.2.3 乱序执行 175
10.2.4 寄存器重命名 176
10.2.5 分支目标预测 177
10.3 32位模式的指令系统 178
10.3.1 32位处理器的寻址方式 178
10.3.2 操作数大小的指令前缀 179
10.3.3 一般指令的扩展 181
本章习题 184


第11章 进入保护模式 185
11.1 代码清单11-1 185
11.2 全局描述符表 186
11.3 存储器的段描述符 187
11.4 安装存储器的段描述符并加载GDTR 191
11.5 关于第21条地址线A20的问题 193
11.6 保护模式下的内存访问 195
11.7 清空流水线并串行化处理器 199
11.8 保护模式下的栈 200
11.8.1 关于栈段描述符中的界限值 200
11.8.2 检验32位下的栈操作 201
11.9 程序的运行和调试 202
11.9.1 运行程序并观察结果 202
11.9.2 处理器刚加电时的段寄存器状态 203
11.9.3 设置PE位后的段寄存器状态 205
11.9.4 JMP指令执行后的段寄存器状态 205
11.9.5 察看全局描述符表GDT 206
11.9.6 察看控制寄存器的内容 207
本章习题 207


第12章 存储器的保护 208
12.1 代码清单12-1 208
12.2 进入32位保护模式 208
12.2.1 话说mov ds,ax和mov ds,eax 208
12.2.2 创建GDT并安装段描述符 209
12.3 修改段寄存器时的保护 211
12.4 地址变换时的保护 213
12.4.1 代码段执行时的保护 213
12.4.2 栈操作时的保护 214
12.4.3 数据访问时的保护 216
12.5 使用别名访问代码段对字符排序 217
12.6 程序的编译和运行 219
本章习题 220


第13章 程序的动态加载和执行 221
13.1 本章代码清单 222
13.2 内核的结构、功能和加载 222
13.2.1 内核的结构 222
13.2.2 内核的加载 223
13.2.3 安装内核的段描述符 225
13.3 在内核中执行 229
13.4 用户程序的加载和重定位 230
13.4.1 用户程序的结构 231
13.4.2 计算用户程序占用的扇区数 232
13.4.3 简单的动态内存分配 233
13.4.4 段的重定位和描述符的创建 234
13.4.5 重定位用户程序内的符号地址 238
13.5 执行用户程序 242
13.6 代码的编译、运行和调试 243
本章习题 244


第14章 任务和特权级保护 245
14.1 任务的隔离和特权级保护 246
14.1.1 任务、任务的LDT和TSS 246
14.1.2 全局空间和局部空间 248
14.1.3 特权级保护概述 250
14.2 代码清单14-1 257
14.3 内核程序的初始化 257
14.3.1 调用门 258
14.3.2 调用门的安装和测试 261
14.4 加载用户程序并创建任务 264
14.4.1 任务控制块和TCB链 264
14.4.2 使用栈传递过程参数 266
14.4.3 加载用户程序 268
14.4.4 创建局部描述符表 269
14.4.5 重定位U-SALT表 270
14.4.6 创建0、1和2特权级的栈 271
14.4.7 安装LDT描述符到GDT中 271
14.4.8 任务状态段TSS的格式 272
14.4.9 创建任务状态段TSS 276
14.4.10 安装TSS描述符到GDT中 276
14.4.11 带参数的过程返回指令 277
14.5 用户程序的执行 278
14.5.1 通过调用门转移控制的完整过程 278
14.5.2 进入3特权级的用户程序的执行 281
14.5.3 检查调用者的请求特权级RPL 284
14.5.4 在Bochs中调试程序的新方法 286
本章习题 286


第15章 任务切换 287
15.1 本章代码清单 287
15.2 任务切换前的设置 287
15.3 任务切换的方法 289
15.4 用CALL/JMP/IRET指令发起任务切换的实例 292
15.5 处理器在实施任务切换时的操作 296
15.6 程序的编译和运行 298
本章习题 299


第16章 分页机制和动态页面分配 300
16.1 分页机制概述 301
16.1.1 简单的分页模型 301
16.1.2 页目录、页表和页 305
16.1.3 地址变换的具体过程 307
16.2 本章代码清单 308
16.3 使内核在分页机制下工作 309
16.3.1 创建内核的页目录表和页表 309
16.3.2 任务全局空间和局部空间的页面映射 314
16.4 创建内核任务 319
16.4.1 内核的虚拟内存分配 319
16.4.2 页面位映射串和空闲页的查找 320
16.4.3 创建页表并登记分配的页 323
16.4.4 创建内核任务的TSS 324
16.5 用户任务的创建和切换 325
16.5.1 多段模型和段页式内存管理 325
16.5.2 平坦模型和用户程序的结构 327
16.5.3 用户任务的虚拟地址空间分配 328
16.5.4 用户程序的加载 329
16.5.5 段描述符的创建(平坦模型) 332
16.5.6 重定位U-SALT并复制页目录表 333
16.5.7 切换到用户任务执行 334
16.6 程序的编译、执行和调试 336
16.6.1 本章程序的编译和运行方法 336
16.6.2 察看CR3寄存器的内容 337
16.6.3 察看线性地址对应的物理页信息 337
16.6.4 察看当前任务的页表信息 338
16.6.5 使用线性(虚拟)地址调试程序 339
本章习题 339


第17章 中断和异常的处理与抢占式多任务 340
17.1 中断和异常 340
17.1.1 中断和异常概述 340
17.1.2 中断描述符表、中断门和陷阱门 343
17.1.3 中断和异常处理程序的保护 345
17.1.4 中断任务 347
17.1.5 错误代码 348
17.2 本章代码清单 349
17.3 内核的加载和初始化 349
17.3.1 彻底终结多段模型 349
17.3.2 创建中断描述符表 352
17.3.3 用定时中断实施任务切换 354
17.3.4 8259A芯片的初始化 359
17.3.5 平坦模型下的字符串显示例程 362
17.4 内核任务的创建 362
17.4.1 创建内核任务的TCB 362
17.4.2 宏汇编技术 364
17.5 用户任务的创建 366
17.5.1 准备加载用户程序 366
17.5.2 转换后援缓冲器的刷新 367
17.5.3 用户任务的创建和初始化 368
17.6 程序的编译和执行 370
本章习题 371

details ends.

标签: none

已有 78 条评论

  1. Cs Cs

    老师你好,请问一下检测点5.3的答案是什么,看您发的文档里面没有检测点5.3的答案

  2. Go Go

    网易云视频第六章习题解析的第三题,loop应该是循环65535次吧,第一次cx从0变成ffff,cx从ffff变成1(因为cx=1的时候cx-1=0,此时循环不再执行)需要65534次,所以应该是总共需要65535次。

    1. LOOP是先判断再减。

      1. Les1ie02 Les1ie02

        错了. cx=1循环体执行1次, 那么显然cx=0时执行65536次

      2. Les1ie02 Les1ie02

        从实模式到保护模式一书 第一版和第二版我都买了,
        然而第一版遗留的一些 错误/纰漏 在第二版中并没有得到纠正,
        很明显老师并没有重视再版这件事情;

        老师未来写的x64相关书籍我仍会购买,
        不可否认老师的功底与对计算机领域教育的热情,
        但是, 想要成就真正的好书, 还需要克服上述问题.
        以老师的能力, 相信这不成问题.

        1. 第二版正在准备中。感谢你的支持!平时太忙,所以有些事情做得不到位。

      3. Les1ie02 Les1ie02

        我说的不详细, 补充一下:

        没有循环体执行0次这个选项, 因为在遇到"loop 标号"之前循环体必定至少执行1次;
        且不难看出cx的值与循环次数之间是单值映射的关系, 那么值域/循环次数一定是1-65536;
        如果说cx=1时循环体执行1次/值域的最左端, 那么cx=0显然会跳到值域的最右端/执行65536次.

      4. Les1ie02 Les1ie02

        十分抱歉, 错怪老师了.
        翻开我所谓的第二版的书的版权页, 才看到上面写有"2013/1第1版" "2021/12第19次印刷"的字样.

        第二次买的书是我在电子工业出版社开在京东的同名店"电子工业出版社"购入的;

        商品详情页显示这本书的出版日期为2021/9, 售价89元, 除此以外没有任何信息暗示/明示它其实是2013年的第一版;

        当然, 除了明示, 存在暗示它是第二版的信息: 在该店搜索"x86汇编语言", 会出现两本书, 一本是标价49元的"x86汇编语言: 从实模式到保护模式", 另一本是标价89元的"x86汇编语言: 从实模式到保护模式", 并且前一本显示"无货".

        ......

        服了...对于电子工业出版社的行为, 很震惊, 很无奈.

        1. 这种情况应该是出版社也不知情。此书没有第二版,还没有出版,正在准备。如果是第二版,在书的封面会显著标出的。

          1. 第二版&视频&和qq群 第二版&视频&和qq群

            我是《从x86汇编语言:实模式到保护模式》第一版的读者。请问李老师:
            1、第二版什么时候出版?
            2、《从x86汇编语言:实模式到保护模式》, 《x64架构汇编语言和操作系统基础》两个视频一起购买能否优惠?
            3、您解散了原来的用户群,是否还有建群的打算?从用户角度群内沟通会很方便。

      5. blendfunc blendfunc

        CPU执行Loop指令时,要进行两步操作:
        (cx)=(cx)-1
        判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
        李老师,是这样吧

    2. 阿杜 阿杜

      设置完cx后,到执行到loop指令前,循环体无条件执行了一次。然后0-1=ffff,所以Loop指令实现转移,转移就意味着又执行了一次。也就是说cx=0执行了一次,然后依次类推,cx=ffff执行一次,cx=fffe执行一次,直到cx=2. 当cx=2时,cx-1=1 ,转移执行,然后cx=1 ,不再转移执行。也就是说,执行了:[无条件的一次] + [cx=0的一次] + [cx=ffff -> cx=2 65534次] =66636次

  3. longhore longhore

    我是在哔哩哔哩网上听了一段,想买纸质的书,有些疑惑李老师在视频里面说了,想问问除了京东,还有那些途径可购买这本书,另外,该书有没有配送网页上提供的小程序?因为网页上提供的压缩文档,下载解压提示数据已经被损坏。

  4. yongge yongge

    你好,有完整的勘误吗,网上找的都是一部分

    1. 网上的是完整的。第二版会纠正这些问题。

  5. 卖女孩的小火柴 卖女孩的小火柴

    我看保护模式的时候有好多知识点都看不懂啊。怎么办

  6. 慢慢来,大家的经验是反复多看几遍,多思考。

  7. 忠实的读者 忠实的读者

    老师,你好!我问个问题,这本书所说的全局空间是不是对应 linux 的内核态,局部空间对应 linux 的用户态?

    1. 态和空间不是一回事。每个任务都有自己的cr3,指向分页结构的第一张表(页目录表或者4级头表)。对于每个任务,这张表的高一半都相同,指向相同的空间,这就是全局空间。

  8. 愤怒的苹果ext 愤怒的苹果ext

    尊敬的李忠老师您好:
    请问可以给出《x86汇编语言:从实模式到保护模式》一书中检测点及练习题的完整标准答案吗?

  9. gavin gavin

    太期待 x86汇编 第二版了, 李老师能透露一下大致的初版日期吗? 从去年就在等了. 好想入手学习.

  10. leedy leedy

    为什么我从硬盘 0x1f7 口读取的状态永远是 0xc0,难以理解

    1. leedy leedy

      linux 下自己编译的 bochs 2.6.11,是新版本中的硬盘状态发生表更了么?试着直接读 0x1f0 的数据也都是 0,懵了 T.T

    2. leedy leedy

      也许只是 bochsrc 配置的不对,不知道方不方便提供一份最终的 bochsrc 文件? linux 下无法按书上的操作界面来形成 :P

    3. leedy leedy

      我的 vhd 配置,不知道是不是这里的问题:
      ata0: ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
      ata0-master: type=disk, path="/home/leedy/Dev/asos/main.vhd", mode=vpc, cylinders=1003, heads=12, spt=17

    4. leedy leedy

      解决了,原来 .wait 那里本身就要循环很多次(硬盘在忙,但不知道忙啥),直接在循环后面打断点 c 过去,可以顺利加载,居然折磨了两三天...哭笑不得

  11. 愤怒的苹果ext 愤怒的苹果ext

    各位大佬,请问有完整答案吗?

  12. 张

    老师你好,c09_1.asm 用第八章加载器,编译运行后,显示的秒第一时刻是对的,再后面秒就变得非常快。我就使用的你的源文件,没有做任何更改也是这样。

    1. 张

      我把 cpu暂停那一段代码换成 jmp $之后就可以正常显示钟表了,不知道是什么问题

  13. zzz123 zzz123

    期待~

  14. 龙宝小圆润 龙宝小圆润

    李老师您好,我买了您的x86汇编在学习的时候遇到一个问题,安装了现在最新版本的oracle VM virtualBox,然后挂载进去您的那个虚拟硬盘,前面章节的代码都能正常运行,到了第8章的硬盘部分,端口0x1f7的BSY位永远都是1,不论循环多少次都这样。我去bochsdbg.exe调试的话,大概也就循环个一两次,BSY位就会正常置0.我不明白这是为什么

    1. 龙宝小圆润 龙宝小圆润

      浏览了一下,原来别人也遇到了这个问题,按照一片天网友的设置改了一下的确没有问题了啊。
      我另外还有一个疑惑,汇编地址,偏移地址,为什么有的时候写16位的有的时候又是写了32位的。这两个地址,在源码里面其实指的是同一个东西吧

    2. 龙宝小圆润 龙宝小圆润

      _(:з」∠)_希望学完了这本书以后能有您的x64纸质书籍出版了,然后买下来继续看,《超越计算机的迷雾》我也很喜欢,写书风格很轻快幽默,平时都当做小说一样可以抱着愉快的心情来阅读

  15. 龙宝小圆润 龙宝小圆润

    14章的好像有问题啊,虽然模拟调用门返回的时候虽然压栈了ss esp cs eip,但是一执行retf就会凉凉了。一开始我自己写的时候我怀疑我写错了东西。但是后来我直接运行配套程序里面的也不行,哪怕是在用户程序的入口点打上hlt都不行。

    1. 请通过电子邮件联系我:leechung@126.com,将具体的问题描述一下,包括使用的文件名(主引导程序,内核程序,程序文件)和vbox版本,如果有截图更好。谢谢。

  16. xfan xfan

    第二版在哪里买

    1. 已经出版上市了,搜一下。或者上电子社网站看一下。

  17. 仙道001 仙道001

    李老师您好,我想请教个问题,原文描述如下:
    -----------------
    当INIT_NOW 从0 过渡到1 时,ALT_A20_GATE 将被置“1”。这就是
    说,计算机启动时,第21 根地址线是自动启用的。A20M#信号仅用于单
    处理器系统,多核处理器一般不用。特别是考虑到传统的键盘控制器正
    逐渐被USB 键盘代替,这些老式设备也许很快就会消失。
    接着来看代码清单11-1。
    端口0x92 是可读写的,第40~42 行,先从该端口读出原数据,接
    着,将第2 位(位1)置“1”,然后再写入该端口,这样就打开了A20。
    -----------------

    我的问题:
    (1)既然计算机启动时,第21 根地址线是自动启用的,那为什么程序还需要再设置一遍?也就是为啥还要重复把0x92寄存器的第2位置1,因为从Bochs里面观察,代码:in al,0x92 读取的结果是0x02。也就是第2位已经是1了。在把1设置回去好像意义不是很大?

    1. 至少在程序中礼貌性地兼容一下奔腾之前的处理器。

  18. Leo Leo

    李老师 第二版大概什么时候可以出版面市啊 非常期待

    1. 已经出版上市了,搜一下。或者上电子社网站看一下。

  19. 李

    老师你好,第二版配套的软件在哪里下载啊

添加新评论