本书出版时间:2012 年
10
月底
11
月初。任½疑问,请
到新浪微博@均陵鼠侠,或者加群
92033881。
x86 汇编语言:
从实模式到保护模式
李
忠 王晓波 ½ 洁 著
Publishing House of Electronics Industry
北京·BEIJING
x86 汇编语言:从实模式到保护模式
内 容 简 介
每一种处理器½有它自己的机器指令集,而汇编语言的发明则是为了方便这些机器指令的记忆和书写。
½管汇编语言已经较少用于大型½件程序的开发,½从学习者的角度来看,要想真正理解计算机的工½原理,
掌握它内部的运行机制,学习汇编语言是必不可少的。
这套图书分为两册,采用开源的
NASM
汇编语言编译器和
VirtualBox
虚拟机½件,以个人计算机广泛采
用的
Intel
处理器为基础,详细讲解了
Intel
处理器的指令系统和工½模式,以大量的代码演示了
16/32/64
½½件的开发方法。上册集中介绍处理器的
16
½实模式和
32
½保护模式,以及基本的指令系统;下册侧重于
介绍
64
½工½模式、多处理器管理、高速缓存控制、温度和电源管理、高级可编程中断控制器、多媒½支持
等。
这是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教½如½直接控制硬件,在
不借助于
BIOS、DOS、Windows、Linux
或者任½其他½件支持的情况下来显示字符、读取硬盘数据、控制其
他硬件等。本书可½为大专院校相关专业学生和计算机编程爱½者的教程。
未经许可,不得以任½方式复制或抄袭本书之部分或全部内容。
版权所有,侵权必究。
图书在版编目(CIP)数据
/主编. —北京: 电子工业出版社,2012.9
ISBN 978-7-121-0-0
Ⅰ. ①汇…
Ⅱ. ①…
Ⅲ. ①
Ⅳ. ①
号
中½版本图书馆
CIP
数据核字(2012)第
责任编辑:董亚峰
印
刷:
装
订:
出版发行:电子工业出版社
北京市海淀区万寿路
173
信箱
开
印
定
本:787×1
092 1/16
印张:
次:2012 年
9
月第
1
次印刷
价:00.00 元
凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系
及邮购电话:
(010)88254888。
质量投诉请发邮件至
zlts@phei.com.cn,盗版侵权举报请发邮件至 dbqq@phei.com.cn。
服务热线:
(010)88258888。
邮编
100036
千字
字数:
4
第1章
十六进制计数法
前
言
½管汇编语言也是一种计算机语言,
½却是与众不同的,
与它的同类们格格不入。
一方面,
处理器的工½是执行指令,用它所做的一切½是执行指令并获得结果;另一方面,汇编语言为
每一种指令提供了简单½记、易于书写的符号化表示½式。
一直以来,人们对于汇编语言的认识和评价可以分为两种,一种是觉得它非常简单,另一
种是觉得它学习起来非常困难。
½认为我会赞同哪一种?说汇编语言难学,这没有道理。学习任½一门计算机语言,½需
要一些数制和数制½换的知识,也需要大½上懂得计算机是怎么运½的。在这个前提下,汇编
语言是最贴近硬件实½的,也是最自然和最朴素的。最朴素的东西反而最难掌握,这实在说不
过去。因此,原因很可½出在我们的教科书上,那些一上来就搞一大堆寻址方式的书,往往以
最快的速度打败了本来激情高昂的初学者。
½是,说汇编语言½学,也同样有些荒谬。据我的观察,很多人掌握了若干计算机指令,
会编写一个从键盘输入数据,然后进行加减乘除或者½类排序的程序后,就认为自己掌握了汇
编语言。还有,直到现在,我还经常在½上看到学生们½用
DOS
中断编写程序,他们讨论的
也大多是实模式,而非
32
½或者
64
½保护模式。他们知道如½编译源程序,也知道在½令行
输入文件名,程序就½运行了,½用一个中断,就½显示字符。至于这期间发生了什么,程序
是如½加½½到内存中的,又是怎么重定½的,似乎从来不关汇编语言的事。这样做的结果,就
是让人以为汇编语言不过如此,没有大用,而且非常枯燥。
很难说我已经掌握了汇编语言的要义。½至少我知道,½管汇编语言不适合用来编写大型
程序,½它对于理解计算机原理很有帮助,特别是处理器的工½原理和运行机制。就算是为了
这个目的,也应该让汇编语言回½它的本½,那就是访问和控制硬件(包括处理器)
,而不仅
仅是编写程序,输入几个数字,找出正数有几个、负数有几个,大于
30
的有几个。
事实上,汇编语言对学习和理解高级语言,比如
C
语言,也有极大的帮助。老教授琢磨了
½几天,终于想到一个½的比喻来帮助学生理解什么是指针,实际上,这对于懂得汇编语言的
学生来说,根本就不算个事儿,并因此½够½老教授省下时间来喝茶。
对于一个½家来说,不½没有人来研究基础学科,½管它们不½直接产生效益;而对于一
个人来说,也不½没有常识。½管常识不½直接挣钱吃饭,½它½响谈吐,½响½的判断力和
决断力,决定着½接受新事物和新知识的程度。相应地,汇编语言就是计算机语言里的常识和
基础。
这是继《穿越计算机的迷雾》之后,我写的第二本书。这本书与上本书有两点不同,第一,
上一本花了
4
年才完成,而这本只用了一年,速度之快,令我自己咂舌;第二,上本书属于科
普性质,漫谈计算机原理,这本书就相对专业了。那些还想把我的书½小说看的人,这回要失
望了。
很多人可½会问我,为什么要写这样一本书。我只½说,我第一次学汇编的经历实在是太
深刻了。我第一次学汇编语言是在
1993
年,手中的教材不½说不½,½学习起来实在很吃力。
要知道,在那个年代,没有½络,要买到½书,还得到大武汉。就这样,我抱着两本书,反反
复复地看,
直到半年之后才懂得汇编语言是个什么东西。
后来,
½然有心写一本汇编语言的书,
一本不一样的汇编语言书,½始终没有时间和精力。
时间过得真快,½眼
20
年过去了。猛回头,我发现同学们依然在走我的老路,他们所用
5
x86 汇编语言:从实模式到保护模式
的教材,½还是我那个年代的,至少区别不大,½还在讲
8086
处理器的实模式。保护模式是
从哪个处理器开始引入的?½然是
80286。它是哪个年代的产品?1982
年!可是,直到现在,
市面上也找不到太多½够把保护模式讲得比较清楚的图书。
也许我应该做点什么。不,事实上,我已经做了,那就是½手中的这本图书。王晓波和湖
北经济学院的½洁共同参与了本书的创½。
在计划写这本书的时候,我就给自己画了几条线。首先不½走老路,一上来就讲指令、寻
址方式,采用任务驱动方式来写,每一章½要做点事情,最½是比较有趣,足够引起读者的事
情。在解决问题的过程中,引入一个个的指令,并进行讲解。一句话,我希望是润物细无声式
的。
其次,汇编语言和硬件并举,完全抛弃
BIOS
中断和
DOS
中断,直接访问硬件,发挥汇
编语言的长处。这样,读者才会深刻½会到汇编的妙处。
这套图书主要讲述
16
½实模式、32 ½保护模式和
Intel-64
架构。引入虚拟
8086
模式是为
了兼容传统的
8086
程序,
现在看来已经完全过时,
不再进行讲述。
至于增强的
32
½模式
IA-32e,
读者可以在读完这本书之后自学,也予以省略。
书中配套的程序清单和源代码以及可½用到的程序½件,
感兴趣的读者可到电子工业出版
社华信教育资源½下½½(待定)
。
本书原来有
18
章,后来,考虑到实模式的内容过多,而去掉了一章。这一章的标题是《聆
听数字的声音》
,讲述如½通过直接访问和控制
Sound Blaster 16
声卡来播放声音,对此感兴趣
的朋友可以在配书光盘中找到它。
特别感谢长春电视台的王志强台长和台长助理周武军,上本书《穿越计算机的迷雾》出版
后,台长王志强亲自过问出版情况,并给予我特别的奖励,希望大家同样½从这本书中读到他
们对我的关怀和鼓励;同时也要感谢我的母亲、我爱人和我的女儿,她们是我的精神支柱。½
友王南洋、桑½伟、刘维钊、蒋胜友、邱海龙、万利等负责了本书的一部分校对工½;½友周
卫平帮我验证配书代码是否½够在他的机器上正常工½;如果想调试本书中的程序,可以½用
bochs
½件,它的视频教程是由王南洋制½的,在这里向他们表示感谢。在阅读本书的过程中,
如果有任½问题,可以按以下电子邮件地址给我写信:leechung@126.com;或者进入我的博客
参与讨论。博客地址是
http://blog.163.com/leechung@126
6
第1章
十六进制计数法
目
第 1 部分 预备知识
第
1
章
1.1
½
十六进制计数法
··············································
············································· 3
二进制计数法回顾
·········································3
·········································
1.1.1
1.1.2
1.1.3
关于二进制计数法
······································
·····································3
二进制到十进制的½换
···································
··································3
十进制到二进制的½换
···································
··································4
十六进制计数法的原理
···································
··································4
十六进制到十进制的½换
·································5
·································
十进制到十六进制的½换
·································6
·································
1.2
十六进制计数法
···········································
··········································4
1.2.1
1.2.2
1.2.3
1.3
为什么需要十六进制
········································
·······································6
本章习题
··················································7
··················································
第
2
章
2.1
2.2
2.3
2.4
2.5
处理器、内存和指令
·········································· 8
··········································
最早的处理器
············································8
············································
寄存器和算术逻辑部件
······································8
······································
内存储器·
············································· 10
··············································
指令和指令集
··········································· 11
···········································
古老的
Intel 8086
处理器
···································· 13
····································
2.5.1
2.5.2
2.5.3
2.5.4
8086
的通用寄存器
·····································
···································· 13
程序的重定½难题
·····································
···································· 14
内存分段机制
········································
······································· 17
8086
的内存分段机制
··································· 18
···································
本章习题
················································· 21
·················································
第
3
章
3.1
3.2
汇编语言和汇编½件
··········································
·········································22
汇编语言简介
··········································· 22
···········································
NASM
编译器
···········································
·········································· 24
3.2.1
3.2.2
3.2.3
3.2.4
3.2.5
从½上下½½
NASM
安装程序
······························ 24
······························
安装
NASM
编译器
···································· 25
····································
下½½配书源码和工具
··································· 26
···································
用
Nasmide
½验代码的书写和编译过程
······················· 28
·······················
用
HexView
观察编译后的机器代码
·························· 29
··························
本章习题
················································· 30
·················································
7
评论