第一章 十六进制计数法 13
1.1 二进制计数法回顾 13
1.1.1 关于二进制计数法 13
1.1.2 二进制到十进制的转换 13
1.1.3 十进制到二进制的转换 14
1.2 十六进制计数法 14
1.2.1 十六进制计数法的原理 14
1.2.2 十六进制到十进制的转换 15
1.2.3 十进制到十六进制的转换 15
1.3 为什么需要十六进制 16
本章习题 2
第二章 处理器、内存和指令 3
2.1 最早的处理器 3
2.2 寄存器和算术逻辑部件 3
2.3 内存储器 5
2.4 指令和指令集 6
2.5 古老的INTEL 8086处理器 8
2.5.1 8086的通用寄存器 8
2.5.2 程序的重定位难题 9
2.5.3 内存分段机制 13
2.5.4 8086的内存分段机制 15
本章习题 17
第三章 汇编语言和汇编软件 18
3.1 汇编语言简介 18
3.2 NASM编译器 20
3.2.1 从网上下载NASM安装程序 20
3.2.2 安装NASM编译器 22
3.2.3 下载配书源码和工具 23
3.2.4 用nasmide体验代码的书写和编译过程 25
3.2.5 用HexView观察编译后的机器代码 27
本章习题 29
第四章 虚拟机的安装和使用 30
4.1 计算机的启动过程 30
4.1.1 如何将编译好的程序提交给处理器 30
4.1.2 计算机的加电和复位 30
4.1.3 基本输入输出系统BIOS 31
4.1.4 硬盘及其工作原理 32
4.1.5 一切从主引导扇区开始 34
4.2 创建和使用虚拟机 35
4.2.1 别害怕,虚拟机是软件 35
4.2.2 下载Oracle VM VirtualBox 35
4.2.3 安装Oracle VM VirtualBox 36
4.2.4 创建一台虚拟PC(个人计算机) 37
4.2.5 虚拟硬盘(VHD)简介 45
4.2.6 练习使用FixVhdWr工具向虚拟硬盘写数据 46
第2部分 16位处理器下的实模式 51
第五章 编写主引导扇区代码 52
5.1 欢迎来到主引导扇区 52
5.1.1 本章意图 52
5.1.2 代码清单5-1(主引导程序) 52
5.2 注释 55
5.3 在屏幕上显示文字 55
5.3.1 显卡和显存 55
5.3.2 初始化段寄存器 57
5.3.3 显存的访问和ASCII代码 58
5.3.4 在屏幕上显示字符 60
5.4 显示标号的汇编地址 61
5.4.1 标号 61
5.4.2 如何显示十进制数字 64
5.4.3 在程序中声明并初始化数据(伪指令db/dw/dd/dq) 65
5.4.4 分解数的各个数位(div/and/xor) 66
5.4.5 显示分解出来的各个数位(add) 70
5.5 使程序进入无限循环状态 70
5.6 完成并编译主引导扇区代码 71
5.6.1 主引导扇区有效标志(伪指令times) 71
5.6.2 代码的保存和编译 72
5.7 加载和运行主引导扇区代码 72
5.7.1 把编译后的指令写入主引导扇区 72
5.7.2 启动虚拟机观察运行结果 74
5.7.3 程序的调试 76
本章习题 76
第六章 相同的功能,不同的代码 78
6.1 代码清单6-1 78
6.2 跳过非指令的数据区 80
6.3 在数据声明中使用字面值 80
6.4 段地址的初始化 80
6.5 段之间的批量数据传送(cld/std/movsb/movsw) 81
6.6 使用循环分解数位(inc /loop) 82
6.7 计算机中的负数 84
6.7.1 无符号数和有符号数(neg/cbw/cwd) 84
6.7.2 处理器视角中的数据类型(sub/ idiv) 87
6.8 数位的显示(dec/jns) 89
6.9 其它标志位和条件转移指令 90
6.9.1 奇偶标志位PF(Parity Flag) 91
6.9.2 进位标志CF(Carry Flag)。 91
6.9.3 溢出标志OF(overflow flag) 91
6.9.4 现有指令对标志位的影响 92
6.9.5 条件转移指令(cmp/jcc) 92
6.10 NASM编译器的$和$$标记 94
6.11 观察运行结果 95
本章习题 95
第七章 比高斯更快的计算 96
7.1 从1加到100的故事 96
7.2 代码清单7-1 96
7.3 显示字符串 98
7.4 计算1到100的累加和 98
7.5 累加和各个数位的分解和显示 98
7.5.1 堆栈和堆栈段的初始化 98
7.5.2 分解各个数位并压栈(or/push) 100
7.5.3 出栈并显示各个数位(pop) 102
7.5.4 进一步认识堆栈 103
7.6 程序的编译和运行 103
7.7 8086处理器的寻址方式 104
7.7.1 寄存器寻址 104
7.7.2 立即寻址 105
7.7.3 内存寻址 105
本章习题 109
第八章 直接硬盘读和带光标跟随的字符显示 110
8.1 本章代码清单 110
8.1.1 本章意图 110
8.1.2 代码清单8-1(主引导程序/加载器) 110
8.1.3 代码清单8-2(用户程序) 115
8.2 用户程序的结构 120
8.2.1 分段、段的汇编地址和段内汇编地址 120
8.2.2 用户程序头部 123
8.3 加载程序(器)的工作流程 126
8.3.1 初始化和决定加载位置(伪指令equ) 126
8.3.2 准备加载用户程序 127
8.3.3 外围设备及其接口 128
8.3.4 I/O端口和端口访问(in/out) 130
8.3.5 通过硬盘控制器端口读扇区数据 131
8.3.6 过程调用(call/call far/ret/retf) 134
8.3.7 加载用户程序 138
8.3.8 用户程序重定位(adc/shr/shl/ror/rol) 140
8.3.9 将控制权交给用户程序(jmp far) 144
8.3.10 8086处理器的无条件转移指令 145
8.4 用户程序的工作流程 147
8.4.1 初始化段寄存器和堆栈切换 147
8.4.2 调用字符串显示例程 147
8.4.3 过程的嵌套 148
8.4.4 屏幕光标控制 148
8.4.5 取当前光标位置 149
8.4.6 处理回车和换行字符(mul) 151
8.4.7 显示可打印字符 152
8.4.8 滚动屏幕内容 152
8.4.9 重置光标 152
8.4.10 切换到另一个代码段中执行 153
8.4.11 访问另一个数据段 153
8.5 编译和运行程序并观察结果 153
本章习题 154
第九章 中断和动态时钟显示 155
9.1 外部硬件中断 155
9.1.1 非屏蔽中断 156
9.1.2 可屏蔽中断(cli/sti) 156
9.1.3 实模式下的中断向量表(iret) 158
9.1.4 实时时钟、CMOS RAM和BCD编码 159
9.1.5 代码清单9-1(用户程序) 163
9.1.6 初始化8259、RTC和中断向量表 171
9.1.6 使处理器进入低功耗状态(hlt/not) 172
9.1.7 实时时钟中断的处理过程(test) 173
9.1.8 代码清单9-1的编译和运行 175
9.2 内部中断 175
9.3 软中断(int3/int/into) 176
9.3.1 常用的BIOS中断 176
9.3.2 代码清单9-2(BIOS中断演示程序) 180
9.3.3 从键盘读字符并显示 182
9.3.4 代码清单9-2的编译和运行 182
本章习题 183
第3部分 32位保护模式 185
第十章 32位INTEL微处理器编程架构 186
10.1 IA-32架构的基本执行环境 186
10.1.1 寄存器的扩展 186
10.1.2 基本的工作模式 189
10.1.3 线性地址 189
10.2 现代处理器的结构和特点 190
10.2.1 流水线 190
10.2.2 高速缓存 191
10.2.3 乱序执行 192
10.2.4 寄存器重命名 193
10.2.5 分支目标预测 193
10.3 32位模式的指令系统 194
10.3.1 32位处理器的寻址方式 194
10.3.2 操作数大小的指令前缀 196
10.3.3 一般指令的扩展 197
第十一章 进入保护模式 201
11.1 代码清单11-1 201
11.2 全局描述符表GDT 204
11.3 存储器的段描述符 205
11.4 安装存储器的段描述符并加载GDTR(lgdt) 209
11.5 关于第21条地址线A20的问题 211
11.6 保护模式下的内存访问 213
11.7 清空流水线并串行化处理器 217
11.8 保护模式下的堆栈 218
11.8.1 关于堆栈段描述符中的界限值 218
11.8.2 检验32位下的堆栈操作 219
11.9 程序的编译和运行 220
本章习题 220
第十二章 存储器的保护 221
12.1 代码清单12-1 221
12.2 进入32位保护模式 224
12.2.1 话说mov ds,ax和mov ds,eax 224
12.2.2 创建GDT并安装段描述符 225
12.3 修改段寄存器时的保护 227
12.4 地址变换时的保护 229
12.4.1 代码段执行时的保护 229
12.4.2 堆栈操作时的保护 230
12.4.3 数据访问时的保护 232
12.5 使用别名访问代码段对字符排序(xchg) 233
12.6 程序的编译和运行 235
本章习题 236
第十三章 程序的动态加载和执行 237
13.1 本章代码清单 237
13.1.1 代码清单13-1(主引导程序) 237
13.1.2 代码清单13-2(微型内核) 243
13.1.3 代码清单13-3(用户程序) 257
13.2 内核的结构、功能和加载 259
13.2.1 内核的结构 259
13.2.2 内核的加载 260
13.2.3 安装内核的段描述符(bswap) 263
13.3 在内核中执行(cpuid) 267
13.4 用户程序的加载和重定位 268
13.4.1 用户程序的结构 269
13.4.2 计算用户程序占用的扇区数(cmovcc) 270
13.4.3 简单的动态内存分配 271
13.4.4 段的重定位和描述符的创建(sgdt/movzx/movsx) 272
13.4.5 重定位用户程序内的符号地址(cmpsb/cmpsw/cmpsd) 275
13.5 执行用户程序 279
13.6 代码的编译、运行和调试(xlat) 280
本章习题 282
第十四章 任务和特权级保护 283
14.1 任务的隔离和特权级保护 283
14.1.1 任务、任务的LDT和TSS 283
14.1.2 全局空间和局部空间 286
14.1.3 特权级保护概述 287
15.2 代码清单14-1 294
14.3 内核程序的初始化 308
14.3.1 调用门(CALL-GATE) 308
14.3.2 调用门的安装和测试 311
14.4 加载用户程序并创建任务 314
14.4.1 任务控制块TCB和TCB链 314
14.4.2 使用堆栈传递过程参数 317
14.4.3 加载用户程序 318
14.4.4 创建局部描述符表LDT 319
14.4.5 重定位U-SALT表 320
14.4.6 创建0、1和2特权级的堆栈 320
14.4.7 安装LDT描述符到GDT中 321
14.4.8 任务状态段TSS的格式(pushf/pushfd/popf/popfd) 322
14.4.9 创建任务状态段TSS 325
14.4.10 安装TSS描述符到GDT中 326
14.4.11 带参数的过程返回指令(ret n/retf n) 326
14.5 用户程序的执行 328
14.5.1 通过调用门转移控制的完整过程 328
14.5.2 进入3特权级的用户程序执行(ltr/lldt) 331
14.5.3 检查调用者的请求特权级RPL(arpl) 333
本章习题 334
第十五章 任务切换 335
15.1 本章代码清单 335
15.1.1 代码清单15-1(系统内核) 335
15.1.2 代码清单15-2(用户程序) 349
15.2 任务切换前的设置 351
15.3 任务切换的方法 352
15.4 用CALL/JMP/IRET指令发起任务切换的实例 355
15.5 处理器在实施任务切换时的操作 358
15.6 程序的编译和运行 360
本章习题 360
第十六章 分页机制和动态页面分配 362
16.1 分页机制概述 362
16.1.1 简单的分页模型 362
16.1.2 页目录、页表和页 366
16.1.3 地址变换的具体过程 368
16.2 本章代码清单 369
16.2.1 代码清单16-1(系统内核) 369
16.2.2 代码清单16-2(用户程序) 387
16.3 使内核在分页机制下工作 389
16.3.1 创建内核的页目录和页表 389
16.3.2 任务全局空间和局部空间的页面映射 394
16.4 创建内核任务 400
16.4.1 内核的虚拟内存分配 400
16.4.2 页面位映射串和空闲页的查找(bts/btr/btc/bt) 401
16.4.3 创建页表并登记分配的页 404
16.4.4 创建内核任务的TSS 405
16.5 用户任务的创建和切换 405
16.5.1 多段模型和段页式内存管理 405
16.5.2 平坦模型和用户程序的结构 407
16.5.3 用户任务的虚拟地址空间分配 407
16.5.4 用户程序的加载 408
16.5.5 段描述符的创建(平坦模型) 411
16.5.6 重定位U-SALT并复制页目录表 412
16.5.7 转换到用户任务执行 414
16.6 程序的编译和执行 416
本章习题 416
第十七章 中断和异常的处理 417
17.1 中断和异常 417
17.1.1 中断和异常概述 417
17.1.2 中断描述符表、中断门和陷阱门 419
17.1.3 中断和异常处理程序的保护 421
17.1.4 中断任务 423
17.1.5 错误代码 425
17.2 本章代码清单 425
17.2.1 代码清单17-1(主引导程序) 425
17.2.2 代码清单17-2(系统内核) 431
17.2.3 代码清单17-3(用户任务一) 455
17.2.4 代码清单17-4(用户任务二) 457
17.3 内核的加载和初始化 458
17.3.1 彻底终结多段模型 458
17.3.2 创建中断描述符表IDT 461
17.3.3 用定时中断实施任务切换 462
17.3.4 8259A芯片的初始化(lidt) 468
17.3.5 平坦模型下的字符串显示例程 470
17.4 内核任务的创建 471
17.4.1 创建内核任务的TCB 471
17.4.2 宏汇编技术 472
17.5 用户任务的创建 474
17.5.1 准备加载用户程序 474
17.5.2 转换后援缓冲器TLB的刷新 475
17.5.3 用户任务的创建和初始化(invlpg) 476
17.6 程序的编译和执行 480
本章习题 480
=======================================================================================
出版日期:2012年9月
出版社:电子工业出版社
作者:李忠
31 个解决方案
#1
前 言 3 对于那些讲究语言逻辑的人来说,看到这本书的名字会使他们产生一个疑问:这本书讲的是汇编语言呢,还是处理器的工作方式?
答案是这两者很难分清,任何把它们割裂的行为,都好比是避开衣食住行来谈论一个人的生活。尽管汇编语言也是一种计算机语言,但却是与众不同的,与它的同类们格格不入。一方面,处理器的工作是执行指令,你用它所做的一切都是执行指令的结果;另一方面,汇编语言则为每一种指令提供了简单好记、易于书写的符号化表示形式。
因此,这本书讲的既是汇编语言,又是处理器的指令和工作方式。事实上,要控制处理器的工作方式,也必须通过指令进行,而这一切,使用汇编语言来做是最好不过了。
一直以来,人们对于汇编语言的认识和评价可以分为两种,一种是觉得它非常简单,另一种是觉得它学习起来非常困难。
你认为我会赞同哪一种?说汇编语言难学,这没有道理。学习任何一门计算机语言,都需要一些数制和数制转换的知识,也需要大体上懂得计算机是怎么运作的。在这个前提下,汇编语言是最贴近硬件实体的,也是最自然和最朴素的。最朴素的东西反而最难掌握,这实在说不过去。因此,原因很可能出在我们的教科书上,那些一上来就搞一大堆寻址方式的书,往往以最快的速度打败了本来是激情高昂的初学者。
但是,说汇编语言好学,也同样有些荒谬。据我的观察,很多人掌握了若干计算机指令,会编写一个从键盘输入数据,然后进行加减乘除或者归类排序的程序后,就认为自己掌握了汇编语言。还有,直到现在,我还经常在网上看到学生们使用DOS中断编写程序,他们讨论的也大多是实模式,而非32位或者64位保护模式。他们知道如何编译源程序,也知道在命令行输入文件名,程序就能运行了,使用一个中断,就能显示字符。至于这期间发生了什么,程序是如何加载到内存中的,又是怎么重定位的,似乎从来不关汇编语言的事。这样做的结果,就是让人以为汇编语言不过如此,没有大用,而且非常枯燥。
很难说我已经掌握了汇编语言的要义。但至少我知道,尽管汇编语言不适合用来编写大型程序,但它对于理解计算机原理很有帮助,特别是处理器的工作原理和运行机制。就算是为了这个目的,也应该让汇编语言回归它的本位,那就是访问和控制硬件(包括处理器),而不仅仅是编写程序,输入几个数字,找出正数有几个、负数有几个,大于30的有几个。
事实上,汇编语言对学习和理解高级语言,比如c,也有极大的帮助。老教授琢磨了好几天,终于想到一个好的比喻来帮助学生理解什么是指针,实际上,这对于懂得汇编语言的学生来说,根本就不算个事儿,并因此能够使老教授省下时间来喝茶。
对于一个国家来说,不能没有人来研究基础学科,尽管它们不能直接产生效益;而对于一个人来说,也不能没有常识。尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。相应地,汇编语言就是计算机语言里的常识和基础。
这是继《穿越计算机的迷雾》之后,我写的第二本书。这本书与上本书有两点不同,第一,上一本花了4年才完成,而这本只用了一年,速度之快,令我自己咂舌;第二,上本书属于科普性质,漫谈计算机原理,这本呢,就相对专业了。那些还想把我的书当小说看的人,这回要失望了。
很多人可能会问我,为什么要写这样一本书。我只能说,我第一次学汇编的经历实在是太深刻了。我第一次学汇编语言是在1993年,手中的书教材不能说不好,但看起来学习起来实在很吃力。要知道,在那个年代,没有网络,要买到好书,还得到大武汉。就这样,我抱着两本书,反反复复地看,直到半年之后才懂得汇编语言是个什么东西。后来,虽然有心写一本汇编语言的书,一本不一样的汇编语言书,但始终没有时间和精力。
时间过得真快,转眼20年过去了。猛回头,我发现同学们依然在走我的老路,他们所用的教材,都还是我那个年代的,至少区别不大,都还在讲8086处理器的实模式。保护模式是从哪个处理器开始引入的?当然是80286。它是哪个年代的产品?1982年!可是,直到现在,市面上也找不到太多能够把保护模式讲得比较清楚的图书。
也许我应该做点什么。不,事实上,我已经做了,那就是你手中的这本图书。
在计划写这本书的时候,我就给自己划了几条线。首先不能走老路,一上来就讲指令、寻址方式啥的,采用任务驱动方式来写,每一章都要做点事情,最好是比较有趣,足够引起读者的兴趣。在解决问题的过程中,引入一个个的指令,并进行讲解。一句话,我希望是润物细无声式的。
其次,汇编语言和硬件并举,完全抛弃BIOS中断和DOS中断,直接访问硬件,发挥汇编语言的长处。 这样,读者才会深刻体会到汇编的妙处。
这套图书主要讲述16位实模式、32位保护模式和INTEL-64架构。引入虚拟8086模式的引入是为了兼容传统的8086程序,现在看来已经完全过时,不再进行讲述。至于增强的32位模式IA-32e,读者可以在读完这本书之后自学,也予以省略。
在前言的最后,要特别感谢长春电视台的王志强台长,上本书《穿越计算机的迷雾》出版后,得到了他的奖励,希望大家同样能从这本书中读到他对我的关怀和鼓励;同时也要感谢我的母亲、我家娘子和我的女儿,她们是我的精神支柱。
好友王南洋负责了本书的一部分校对工作;好友周卫平帮我验证配书代码是否能够在他的机器上正常工作,在这里一并表示感谢。
在阅读本书的过程中,如果有任何问题,可以按以下电子邮件地址给我写信:leechung@126.com;或者进入我的博客参与讨论。博客地址是
http://blog.163.com/leechung@126
http://blog.csdn.net/sholber
答案是这两者很难分清,任何把它们割裂的行为,都好比是避开衣食住行来谈论一个人的生活。尽管汇编语言也是一种计算机语言,但却是与众不同的,与它的同类们格格不入。一方面,处理器的工作是执行指令,你用它所做的一切都是执行指令的结果;另一方面,汇编语言则为每一种指令提供了简单好记、易于书写的符号化表示形式。
因此,这本书讲的既是汇编语言,又是处理器的指令和工作方式。事实上,要控制处理器的工作方式,也必须通过指令进行,而这一切,使用汇编语言来做是最好不过了。
一直以来,人们对于汇编语言的认识和评价可以分为两种,一种是觉得它非常简单,另一种是觉得它学习起来非常困难。
你认为我会赞同哪一种?说汇编语言难学,这没有道理。学习任何一门计算机语言,都需要一些数制和数制转换的知识,也需要大体上懂得计算机是怎么运作的。在这个前提下,汇编语言是最贴近硬件实体的,也是最自然和最朴素的。最朴素的东西反而最难掌握,这实在说不过去。因此,原因很可能出在我们的教科书上,那些一上来就搞一大堆寻址方式的书,往往以最快的速度打败了本来是激情高昂的初学者。
但是,说汇编语言好学,也同样有些荒谬。据我的观察,很多人掌握了若干计算机指令,会编写一个从键盘输入数据,然后进行加减乘除或者归类排序的程序后,就认为自己掌握了汇编语言。还有,直到现在,我还经常在网上看到学生们使用DOS中断编写程序,他们讨论的也大多是实模式,而非32位或者64位保护模式。他们知道如何编译源程序,也知道在命令行输入文件名,程序就能运行了,使用一个中断,就能显示字符。至于这期间发生了什么,程序是如何加载到内存中的,又是怎么重定位的,似乎从来不关汇编语言的事。这样做的结果,就是让人以为汇编语言不过如此,没有大用,而且非常枯燥。
很难说我已经掌握了汇编语言的要义。但至少我知道,尽管汇编语言不适合用来编写大型程序,但它对于理解计算机原理很有帮助,特别是处理器的工作原理和运行机制。就算是为了这个目的,也应该让汇编语言回归它的本位,那就是访问和控制硬件(包括处理器),而不仅仅是编写程序,输入几个数字,找出正数有几个、负数有几个,大于30的有几个。
事实上,汇编语言对学习和理解高级语言,比如c,也有极大的帮助。老教授琢磨了好几天,终于想到一个好的比喻来帮助学生理解什么是指针,实际上,这对于懂得汇编语言的学生来说,根本就不算个事儿,并因此能够使老教授省下时间来喝茶。
对于一个国家来说,不能没有人来研究基础学科,尽管它们不能直接产生效益;而对于一个人来说,也不能没有常识。尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。相应地,汇编语言就是计算机语言里的常识和基础。
这是继《穿越计算机的迷雾》之后,我写的第二本书。这本书与上本书有两点不同,第一,上一本花了4年才完成,而这本只用了一年,速度之快,令我自己咂舌;第二,上本书属于科普性质,漫谈计算机原理,这本呢,就相对专业了。那些还想把我的书当小说看的人,这回要失望了。
很多人可能会问我,为什么要写这样一本书。我只能说,我第一次学汇编的经历实在是太深刻了。我第一次学汇编语言是在1993年,手中的书教材不能说不好,但看起来学习起来实在很吃力。要知道,在那个年代,没有网络,要买到好书,还得到大武汉。就这样,我抱着两本书,反反复复地看,直到半年之后才懂得汇编语言是个什么东西。后来,虽然有心写一本汇编语言的书,一本不一样的汇编语言书,但始终没有时间和精力。
时间过得真快,转眼20年过去了。猛回头,我发现同学们依然在走我的老路,他们所用的教材,都还是我那个年代的,至少区别不大,都还在讲8086处理器的实模式。保护模式是从哪个处理器开始引入的?当然是80286。它是哪个年代的产品?1982年!可是,直到现在,市面上也找不到太多能够把保护模式讲得比较清楚的图书。
也许我应该做点什么。不,事实上,我已经做了,那就是你手中的这本图书。
在计划写这本书的时候,我就给自己划了几条线。首先不能走老路,一上来就讲指令、寻址方式啥的,采用任务驱动方式来写,每一章都要做点事情,最好是比较有趣,足够引起读者的兴趣。在解决问题的过程中,引入一个个的指令,并进行讲解。一句话,我希望是润物细无声式的。
其次,汇编语言和硬件并举,完全抛弃BIOS中断和DOS中断,直接访问硬件,发挥汇编语言的长处。 这样,读者才会深刻体会到汇编的妙处。
这套图书主要讲述16位实模式、32位保护模式和INTEL-64架构。引入虚拟8086模式的引入是为了兼容传统的8086程序,现在看来已经完全过时,不再进行讲述。至于增强的32位模式IA-32e,读者可以在读完这本书之后自学,也予以省略。
在前言的最后,要特别感谢长春电视台的王志强台长,上本书《穿越计算机的迷雾》出版后,得到了他的奖励,希望大家同样能从这本书中读到他对我的关怀和鼓励;同时也要感谢我的母亲、我家娘子和我的女儿,她们是我的精神支柱。
好友王南洋负责了本书的一部分校对工作;好友周卫平帮我验证配书代码是否能够在他的机器上正常工作,在这里一并表示感谢。
在阅读本书的过程中,如果有任何问题,可以按以下电子邮件地址给我写信:leechung@126.com;或者进入我的博客参与讨论。博客地址是
http://blog.163.com/leechung@126
http://blog.csdn.net/sholber
#2
期待ing..
每次都想把汇编扎实的看看,最后总是无疾而终。
这次是第三次了。
每次都想把汇编扎实的看看,最后总是无疾而终。
这次是第三次了。
#3
#4
貌似不错...
#5
不知道为什么看目录有一种几本书的合体的赶脚。
#6
有参考书目么?
#7
貌似不错...
#8
还需要什么参考书目?你当这是抄书涅?用自己的语言的思路写书不是很好么,干绳麻要粘贴复制。
#9
每次看到一些东拼西凑的书就发闷,期待楼主的书能够让人酣畅淋漓
#10
有参考书目就是抄了的意思?我以为只是要借鉴了思想就要放在参考书目里。我去查查参考书目是什么东西。
#11
没找到,不管了。
#12
还是我来说吧。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
#13
还是我来说吧。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
要是借鉴了思想就要列出参考书目,那就多了去了。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
要是借鉴了思想就要列出参考书目,那就多了去了。
#14
还是我来说吧。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
要是借鉴了思想就要列出参考书目,那就多了去了。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
要是借鉴了思想就要列出参考书目,那就多了去了。
#15
参考书目就是intel指令手册以及各种硬件规范
#16
不错呀,感谢楼主介绍
#17
以后看看
#18
果然是好书
#19
哪里能下到后半本书?
#20
学汇编的人貌似不多了啊。
#21
在哪里可以下到整本书呢
#22
等着这个月底出版吧。
#23
我也想看,这本书,哈哈
#24
可以上传吗 楼主 我想看看
#25
网上有1-13章的pdf
另外,你可以加群92033881,群共享里也有。
另外,你可以加群92033881,群共享里也有。
#26
#27
此书已更名为《x86汇编语言:从实模式到保护模式》。
#28
老师请问这本书哪里有卖?
#29
感谢你喜欢这本书。这本书已经改名为《x86汇编语言:从实模式到保护模式》,由电子工业出版社出版发行。
已经出版印刷,但还没有上架,所以网上还不能搜到。预计本月20号之前就可以买到了。
已经出版印刷,但还没有上架,所以网上还不能搜到。预计本月20号之前就可以买到了。
#30
有没有14-17章电子版有发给我邮箱下1002351966@qq.com
谢谢
谢谢
#31
正需要NASM以及保护模式相关汇编语言设计的资料 谢谢LZ
#1
前 言 3 对于那些讲究语言逻辑的人来说,看到这本书的名字会使他们产生一个疑问:这本书讲的是汇编语言呢,还是处理器的工作方式?
答案是这两者很难分清,任何把它们割裂的行为,都好比是避开衣食住行来谈论一个人的生活。尽管汇编语言也是一种计算机语言,但却是与众不同的,与它的同类们格格不入。一方面,处理器的工作是执行指令,你用它所做的一切都是执行指令的结果;另一方面,汇编语言则为每一种指令提供了简单好记、易于书写的符号化表示形式。
因此,这本书讲的既是汇编语言,又是处理器的指令和工作方式。事实上,要控制处理器的工作方式,也必须通过指令进行,而这一切,使用汇编语言来做是最好不过了。
一直以来,人们对于汇编语言的认识和评价可以分为两种,一种是觉得它非常简单,另一种是觉得它学习起来非常困难。
你认为我会赞同哪一种?说汇编语言难学,这没有道理。学习任何一门计算机语言,都需要一些数制和数制转换的知识,也需要大体上懂得计算机是怎么运作的。在这个前提下,汇编语言是最贴近硬件实体的,也是最自然和最朴素的。最朴素的东西反而最难掌握,这实在说不过去。因此,原因很可能出在我们的教科书上,那些一上来就搞一大堆寻址方式的书,往往以最快的速度打败了本来是激情高昂的初学者。
但是,说汇编语言好学,也同样有些荒谬。据我的观察,很多人掌握了若干计算机指令,会编写一个从键盘输入数据,然后进行加减乘除或者归类排序的程序后,就认为自己掌握了汇编语言。还有,直到现在,我还经常在网上看到学生们使用DOS中断编写程序,他们讨论的也大多是实模式,而非32位或者64位保护模式。他们知道如何编译源程序,也知道在命令行输入文件名,程序就能运行了,使用一个中断,就能显示字符。至于这期间发生了什么,程序是如何加载到内存中的,又是怎么重定位的,似乎从来不关汇编语言的事。这样做的结果,就是让人以为汇编语言不过如此,没有大用,而且非常枯燥。
很难说我已经掌握了汇编语言的要义。但至少我知道,尽管汇编语言不适合用来编写大型程序,但它对于理解计算机原理很有帮助,特别是处理器的工作原理和运行机制。就算是为了这个目的,也应该让汇编语言回归它的本位,那就是访问和控制硬件(包括处理器),而不仅仅是编写程序,输入几个数字,找出正数有几个、负数有几个,大于30的有几个。
事实上,汇编语言对学习和理解高级语言,比如c,也有极大的帮助。老教授琢磨了好几天,终于想到一个好的比喻来帮助学生理解什么是指针,实际上,这对于懂得汇编语言的学生来说,根本就不算个事儿,并因此能够使老教授省下时间来喝茶。
对于一个国家来说,不能没有人来研究基础学科,尽管它们不能直接产生效益;而对于一个人来说,也不能没有常识。尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。相应地,汇编语言就是计算机语言里的常识和基础。
这是继《穿越计算机的迷雾》之后,我写的第二本书。这本书与上本书有两点不同,第一,上一本花了4年才完成,而这本只用了一年,速度之快,令我自己咂舌;第二,上本书属于科普性质,漫谈计算机原理,这本呢,就相对专业了。那些还想把我的书当小说看的人,这回要失望了。
很多人可能会问我,为什么要写这样一本书。我只能说,我第一次学汇编的经历实在是太深刻了。我第一次学汇编语言是在1993年,手中的书教材不能说不好,但看起来学习起来实在很吃力。要知道,在那个年代,没有网络,要买到好书,还得到大武汉。就这样,我抱着两本书,反反复复地看,直到半年之后才懂得汇编语言是个什么东西。后来,虽然有心写一本汇编语言的书,一本不一样的汇编语言书,但始终没有时间和精力。
时间过得真快,转眼20年过去了。猛回头,我发现同学们依然在走我的老路,他们所用的教材,都还是我那个年代的,至少区别不大,都还在讲8086处理器的实模式。保护模式是从哪个处理器开始引入的?当然是80286。它是哪个年代的产品?1982年!可是,直到现在,市面上也找不到太多能够把保护模式讲得比较清楚的图书。
也许我应该做点什么。不,事实上,我已经做了,那就是你手中的这本图书。
在计划写这本书的时候,我就给自己划了几条线。首先不能走老路,一上来就讲指令、寻址方式啥的,采用任务驱动方式来写,每一章都要做点事情,最好是比较有趣,足够引起读者的兴趣。在解决问题的过程中,引入一个个的指令,并进行讲解。一句话,我希望是润物细无声式的。
其次,汇编语言和硬件并举,完全抛弃BIOS中断和DOS中断,直接访问硬件,发挥汇编语言的长处。 这样,读者才会深刻体会到汇编的妙处。
这套图书主要讲述16位实模式、32位保护模式和INTEL-64架构。引入虚拟8086模式的引入是为了兼容传统的8086程序,现在看来已经完全过时,不再进行讲述。至于增强的32位模式IA-32e,读者可以在读完这本书之后自学,也予以省略。
在前言的最后,要特别感谢长春电视台的王志强台长,上本书《穿越计算机的迷雾》出版后,得到了他的奖励,希望大家同样能从这本书中读到他对我的关怀和鼓励;同时也要感谢我的母亲、我家娘子和我的女儿,她们是我的精神支柱。
好友王南洋负责了本书的一部分校对工作;好友周卫平帮我验证配书代码是否能够在他的机器上正常工作,在这里一并表示感谢。
在阅读本书的过程中,如果有任何问题,可以按以下电子邮件地址给我写信:leechung@126.com;或者进入我的博客参与讨论。博客地址是
http://blog.163.com/leechung@126
http://blog.csdn.net/sholber
答案是这两者很难分清,任何把它们割裂的行为,都好比是避开衣食住行来谈论一个人的生活。尽管汇编语言也是一种计算机语言,但却是与众不同的,与它的同类们格格不入。一方面,处理器的工作是执行指令,你用它所做的一切都是执行指令的结果;另一方面,汇编语言则为每一种指令提供了简单好记、易于书写的符号化表示形式。
因此,这本书讲的既是汇编语言,又是处理器的指令和工作方式。事实上,要控制处理器的工作方式,也必须通过指令进行,而这一切,使用汇编语言来做是最好不过了。
一直以来,人们对于汇编语言的认识和评价可以分为两种,一种是觉得它非常简单,另一种是觉得它学习起来非常困难。
你认为我会赞同哪一种?说汇编语言难学,这没有道理。学习任何一门计算机语言,都需要一些数制和数制转换的知识,也需要大体上懂得计算机是怎么运作的。在这个前提下,汇编语言是最贴近硬件实体的,也是最自然和最朴素的。最朴素的东西反而最难掌握,这实在说不过去。因此,原因很可能出在我们的教科书上,那些一上来就搞一大堆寻址方式的书,往往以最快的速度打败了本来是激情高昂的初学者。
但是,说汇编语言好学,也同样有些荒谬。据我的观察,很多人掌握了若干计算机指令,会编写一个从键盘输入数据,然后进行加减乘除或者归类排序的程序后,就认为自己掌握了汇编语言。还有,直到现在,我还经常在网上看到学生们使用DOS中断编写程序,他们讨论的也大多是实模式,而非32位或者64位保护模式。他们知道如何编译源程序,也知道在命令行输入文件名,程序就能运行了,使用一个中断,就能显示字符。至于这期间发生了什么,程序是如何加载到内存中的,又是怎么重定位的,似乎从来不关汇编语言的事。这样做的结果,就是让人以为汇编语言不过如此,没有大用,而且非常枯燥。
很难说我已经掌握了汇编语言的要义。但至少我知道,尽管汇编语言不适合用来编写大型程序,但它对于理解计算机原理很有帮助,特别是处理器的工作原理和运行机制。就算是为了这个目的,也应该让汇编语言回归它的本位,那就是访问和控制硬件(包括处理器),而不仅仅是编写程序,输入几个数字,找出正数有几个、负数有几个,大于30的有几个。
事实上,汇编语言对学习和理解高级语言,比如c,也有极大的帮助。老教授琢磨了好几天,终于想到一个好的比喻来帮助学生理解什么是指针,实际上,这对于懂得汇编语言的学生来说,根本就不算个事儿,并因此能够使老教授省下时间来喝茶。
对于一个国家来说,不能没有人来研究基础学科,尽管它们不能直接产生效益;而对于一个人来说,也不能没有常识。尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。相应地,汇编语言就是计算机语言里的常识和基础。
这是继《穿越计算机的迷雾》之后,我写的第二本书。这本书与上本书有两点不同,第一,上一本花了4年才完成,而这本只用了一年,速度之快,令我自己咂舌;第二,上本书属于科普性质,漫谈计算机原理,这本呢,就相对专业了。那些还想把我的书当小说看的人,这回要失望了。
很多人可能会问我,为什么要写这样一本书。我只能说,我第一次学汇编的经历实在是太深刻了。我第一次学汇编语言是在1993年,手中的书教材不能说不好,但看起来学习起来实在很吃力。要知道,在那个年代,没有网络,要买到好书,还得到大武汉。就这样,我抱着两本书,反反复复地看,直到半年之后才懂得汇编语言是个什么东西。后来,虽然有心写一本汇编语言的书,一本不一样的汇编语言书,但始终没有时间和精力。
时间过得真快,转眼20年过去了。猛回头,我发现同学们依然在走我的老路,他们所用的教材,都还是我那个年代的,至少区别不大,都还在讲8086处理器的实模式。保护模式是从哪个处理器开始引入的?当然是80286。它是哪个年代的产品?1982年!可是,直到现在,市面上也找不到太多能够把保护模式讲得比较清楚的图书。
也许我应该做点什么。不,事实上,我已经做了,那就是你手中的这本图书。
在计划写这本书的时候,我就给自己划了几条线。首先不能走老路,一上来就讲指令、寻址方式啥的,采用任务驱动方式来写,每一章都要做点事情,最好是比较有趣,足够引起读者的兴趣。在解决问题的过程中,引入一个个的指令,并进行讲解。一句话,我希望是润物细无声式的。
其次,汇编语言和硬件并举,完全抛弃BIOS中断和DOS中断,直接访问硬件,发挥汇编语言的长处。 这样,读者才会深刻体会到汇编的妙处。
这套图书主要讲述16位实模式、32位保护模式和INTEL-64架构。引入虚拟8086模式的引入是为了兼容传统的8086程序,现在看来已经完全过时,不再进行讲述。至于增强的32位模式IA-32e,读者可以在读完这本书之后自学,也予以省略。
在前言的最后,要特别感谢长春电视台的王志强台长,上本书《穿越计算机的迷雾》出版后,得到了他的奖励,希望大家同样能从这本书中读到他对我的关怀和鼓励;同时也要感谢我的母亲、我家娘子和我的女儿,她们是我的精神支柱。
好友王南洋负责了本书的一部分校对工作;好友周卫平帮我验证配书代码是否能够在他的机器上正常工作,在这里一并表示感谢。
在阅读本书的过程中,如果有任何问题,可以按以下电子邮件地址给我写信:leechung@126.com;或者进入我的博客参与讨论。博客地址是
http://blog.163.com/leechung@126
http://blog.csdn.net/sholber
#2
期待ing..
每次都想把汇编扎实的看看,最后总是无疾而终。
这次是第三次了。
每次都想把汇编扎实的看看,最后总是无疾而终。
这次是第三次了。
#3
#4
貌似不错...
#5
不知道为什么看目录有一种几本书的合体的赶脚。
#6
有参考书目么?
#7
貌似不错...
#8
还需要什么参考书目?你当这是抄书涅?用自己的语言的思路写书不是很好么,干绳麻要粘贴复制。
#9
每次看到一些东拼西凑的书就发闷,期待楼主的书能够让人酣畅淋漓
#10
有参考书目就是抄了的意思?我以为只是要借鉴了思想就要放在参考书目里。我去查查参考书目是什么东西。
#11
没找到,不管了。
#12
还是我来说吧。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
#13
还是我来说吧。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
要是借鉴了思想就要列出参考书目,那就多了去了。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
要是借鉴了思想就要列出参考书目,那就多了去了。
#14
还是我来说吧。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
要是借鉴了思想就要列出参考书目,那就多了去了。
所谓“参考书目”,主要是法律上的考量。
*著作权法第二十二条【著作权使用的限制】:在下列情况下,可以不经著作权人许可,不向其支付报酬,但应当指明作者姓名、作品名称,并且不得侵犯著作权人依照本法享有的其他权利:
(一)为个人学习、研究或者欣赏,使用他人已经发表的作品;
(二)为介绍、评论某一作品或者说明某一问题,在作品中适当引用他人已经发表的作品;
(三)。。。。。。
要是借鉴了思想就要列出参考书目,那就多了去了。
#15
参考书目就是intel指令手册以及各种硬件规范
#16
不错呀,感谢楼主介绍
#17
以后看看
#18
果然是好书
#19
哪里能下到后半本书?
#20
学汇编的人貌似不多了啊。
#21
在哪里可以下到整本书呢
#22
等着这个月底出版吧。
#23
我也想看,这本书,哈哈
#24
可以上传吗 楼主 我想看看
#25
网上有1-13章的pdf
另外,你可以加群92033881,群共享里也有。
另外,你可以加群92033881,群共享里也有。
#26
#27
此书已更名为《x86汇编语言:从实模式到保护模式》。
#28
老师请问这本书哪里有卖?
#29
感谢你喜欢这本书。这本书已经改名为《x86汇编语言:从实模式到保护模式》,由电子工业出版社出版发行。
已经出版印刷,但还没有上架,所以网上还不能搜到。预计本月20号之前就可以买到了。
已经出版印刷,但还没有上架,所以网上还不能搜到。预计本月20号之前就可以买到了。
#30
有没有14-17章电子版有发给我邮箱下1002351966@qq.com
谢谢
谢谢
#31
正需要NASM以及保护模式相关汇编语言设计的资料 谢谢LZ