书籍详情
x86汇编语言:从实模式到保护模式
作者:李忠
出版社:电子工业出版社
出版时间:2013-01-01
ISBN:9787121187995
定价:¥56.00
购买这本书可以去
内容简介
每一种处理器都有它自己的机器指令集,而汇编语言的发明则是为了方便这些机器指令的记忆和书写。尽管汇编语言已经较少用于大型软件程序的开发,但从学习者的角度来看,要想真正理解计算机的工作原理,掌握它内部的运行机制,学习汇编语言是必不可少的。本书采用开源的NASM汇编语言编译器和VirtualBox虚拟机软件,以个人计算机广泛采用的Intel处理器为基础,详细讲解了Intel处理器的指令系统和工作模式,以大量的代码演示了16/32/64位软件的开发方法,介绍了处理器的16位实模式和32位保护模式,以及基本的指令系统。这是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他软件支持的情况下来显示字符、读取硬盘数据、控制其他硬件等。本书可作为大专院校相关专业学生和计算机编程爱好者的教程。
作者简介
暂缺《x86汇编语言:从实模式到保护模式》作者简介
目录
目 录
第1部分 预备知识
第1章 十六进制计数法\t3
1.1 二进制计数法回顾\t3
1.1.1 关于二进制计数法\t3
1.1.2 二进制到十进制的转换\t3
1.1.3 十进制到二进制的转换\t4
1.2 十六进制计数法\t4
1.2.1 十六进制计数法的原理\t4
1.2.2 十六进制到十进制的转换\t5
1.2.3 十进制到十六进制的转换\t6
1.3 为什么需要十六进制\t6
本章习题\t7
第2章 处理器、内存和指令\t8
2.1 最早的处理器\t8
2.2 寄存器和算术逻辑部件\t8
2.3 内存储器\t10
2.4 指令和指令集\t11
2.5 古老的Intel 8086处理器\t13
2.5.1 8086的通用寄存器\t13
2.5.2 程序的重定位难题\t14
2.5.3 内存分段机制\t17
2.5.4 8086的内存分段机制\t18
本章习题\t21
第3章 汇编语言和汇编软件\t22
3.1 汇编语言简介\t22
3.2 NASM编译器\t24
3.2.1 从网上下载NASM安装程序\t24
3.2.2 安装NASM编译器\t25
3.2.3 下载配书源码和工具\t26
3.2.4 用Nasmide体验代码的书写和编译过程\t28
3.2.5 用HexView观察编译后的机器代码\t29
本章习题\t30
第4章 虚拟机的安装和使用\t31
4.1 计算机的启动过程\t31
4.1.1 如何将编译好的程序提交给处理器\t31
4.1.2 计算机的加电和复位\t31
4.1.3 基本输入输出系统\t32
4.1.4 硬盘及其工作原理\t33
4.1.5 一切从主引导扇区开始\t35
4.2 创建和使用虚拟机\t35
4.2.1 别害怕,虚拟机是软件\t35
4.2.2 下载Oracle VM VirtualBox\t36
4.2.3 安装Oracle VM VirtualBox\t36
4.2.4 创建一台虚拟PC\t37
4.2.5 虚拟硬盘简介\t42
4.2.6 练习使用FixVhdWr工具向虚拟硬盘写数据\t43
第2部分 16位处理器下的实模式
第5章 编写主引导扇区代码\t49
5.1 欢迎来到主引导扇区\t49
5.2 注释\t49
5.3 在屏幕上显示文字\t50
5.3.1 显卡和显存\t50
5.3.2 初始化段寄存器\t52
5.3.3 显存的访问和ASCII代码\t53
5.3.4 显示字符\t55
5.4 显示标号的汇编地址\t56
5.4.1 标号\t56
5.4.2 如何显示十进制数字\t60
5.4.3 在程序中声明并初始化数据\t61
5.4.4 分解数的各个数位\t61
5.4.5 显示分解出来的各个数位\t65
5.5 使程序进入无限循环状态\t66
5.6 完成并编译主引导扇区代码\t67
5.6.1 主引导扇区有效标志\t67
5.6.2 代码的保存和编译\t68
5.7 加载和运行主引导扇区代码\t68
5.7.1 把编译后的指令写入主引导扇区\t68
5.7.2 启动虚拟机观察运行结果\t70
5.7.3 程序的调试\t70
本章习题\t71
第6章 相同的功能,不同的代码\t72
6.1 代码清单6-1\t72
6.2 跳过非指令的数据区\t72
6.3 在数据声明中使用字面值\t72
6.4 段地址的初始化\t73
6.5 段之间的批量数据传送\t74
6.6 使用循环分解数位\t75
6.7 计算机中的负数\t77
6.7.1 无符号数和有符号数\t77
6.7.2 处理器视角中的数据类型\t80
6.8 数位的显示\t82
6.9 其他标志位和条件转移指令\t83
6.9.1 奇偶标志位PF\t83
6.9.2 进位标志CF\t83
6.9.3 溢出标志OF\t84
6.9.4 现有指令对标志位的影响\t84
6.9.5 条件转移指令\t85
6.10 NASM编译器的$和$$标记\t87
6.11 观察运行结果\t87
本章习题\t88
第7章 比高斯更快的计算\t89
7.1 从1加到100的故事\t89
7.2 代码清单7-1\t89
7.3 显示字符串\t89
7.4 计算1到100的累加和\t90
7.5 累加和各个数位的分解与显示\t90
7.5.1 堆栈和堆栈段的初始化\t90
7.5.2 分解各个数位并压栈\t92
7.5.3 出栈并显示各个数位\t94
7.5.4 进一步认识堆栈\t95
7.6 程序的编译和运行\t96
7.7 8086处理器的寻址方式\t96
7.7.1 寄存器寻址\t96
7.7.2 立即寻址\t97
7.7.3 内存寻址\t97
本章习题\t101
第8章 硬盘和显卡的访问与控制\t102
8.1 本章代码清单\t102
8.1.1 本章意图\t102
8.1.2 代码清单8-1\t103
8.2 用户程序的结构\t103
8.2.1 分段、段的汇编地址和段内汇编地址\t103
8.2.2 用户程序头部\t106
8.3 加载程序(器)的工作流程\t109
8.3.1 初始化和决定加载位置\t109
8.3.2 准备加载用户程序\t110
8.3.3 外围设备及其接口\t111
8.3.4 I/O端口和端口访问\t112
8.3.5 通过硬盘控制器端口读扇区数据\t114
8.3.6 过程调用\t116
8.3.7 加载用户程序\t121
8.3.8 用户程序重定位\t122
8.3.9 将控制权交给用户程序\t126
8.3.10 8086处理器的无条件转移指令\t126
8.4 用户程序的工作流程\t128
8.4.1 初始化段寄存器和堆栈切换\t128
8.4.2 调用字符串显示例程\t129
8.4.3 过程的嵌套\t130
8.4.4 屏幕光标控制\t131
8.4.5 取当前光标位置\t131
8.4.6 处理回车和换行字符\t132
8.4.7 显示可打印字符\t133
8.4.8 滚动屏幕内容\t134
8.4.9 重置光标\t134
8.4.10 切换到另一个代码段中执行\t135
8.4.11 访问另一个数据段\t135
8.5 编译和运行程序并观察结果\t135
本章习题\t136
第9章 中断和动态时钟显示\t137
9.1 外部硬件中断\t137
9.1.1 非屏蔽中断\t138
9.1.2 可屏蔽中断\t138
9.1.3 实模式下的中断向量表\t140
9.1.4 实时时钟、CMOS RAM和BCD编码\t141
9.1.5 代码清单9-1\t145
9.1.6 初始化8259、RTC和中断向量表\t145
9.1.7 使处理器进入低功耗状态\t147
9.1.8 实时时钟中断的处理过程\t148
9.1.9 代码清单9-1的编译和运行\t150
9.2 内部中断\t150
9.3 软中断\t151
9.3.1 常用的BIOS中断\t151
9.3.2 代码清单9-2\t155
9.3.3 从键盘读字符并显示\t155
9.3.4 代码清单9-2的编译和运行\t155
本章习题\t156
第3部分 32位保护模式
第10章 32位Intel微处理器编程架构\t159
10.1 IA-32架构的基本执行环境\t164
10.1.1 寄存器的扩展\t162
10.1.2 基本的工作模式\t162
10.1.3 线性地址\t163
10.2 现代处理器的结构和特点\t164
10.2.1 流水线\t164
10.2.2 高速缓存\t165
10.2.3 乱序执行\t165
10.2.4 寄存器重命名\t166
10.2.5 分支目标预测\t167
10.3 32位模式的指令系统\t168
10.3.1 32位处理器的寻址方式\t168
10.3.2 操作数大小的指令前缀\t169
10.3.3 一般指令的扩展\t171
本章习题\t174
第11章 进入保护模式\t175
11.1 代码清单11-1\t175
11.2 全局描述符表\t175
11.3 存储器的段描述符\t177
11.4 安装存储器的段描述符并加载GDTR\t180
11.5 关于第21条地址线A20的问题\t182
11.6 保护模式下的内存访问\t184
11.7 清空流水线并串行化处理器\t188
11.8 保护模式下的堆栈\t189
11.8.1 关于堆栈段描述符中的界限值\t189
11.8.2 检验32位下的堆栈操作\t190
11.9 程序的编译和运行\t191
本章习题\t191
第12章 存储器的保护\t192
12.1 代码清单12-1\t192
12.2 进入32位保护模式\t192
12.2.1 话说mov ds,ax和mov ds,eax\t192
12.2.2 创建GDT并安装段描述符\t193
12.3 修改段寄存器时的保护\t195
12.4 地址变换时的保护\t197
12.4.1 代码段执行时的保护\t197
12.4.2 堆栈操作时的保护\t198
12.4.3 数据访问时的保护\t200
12.5 使用别名访问代码段对字符排序\t201
12.6 程序的编译和运行\t203
本章习题\t203
第13章 程序的动态加载和执行\t204
13.1 本章代码清单\t204
13.2 内核的结构、功能和加载\t205
13.2.1 内核的结构\t205
13.2.2 内核的加载\t206
13.2.3 安装内核的段描述符\t208
13.3 在内核中执行\t211
13.4 用户程序的加载和重定位\t213
13.4.1 用户程序的结构\t213
13.4.2 计算用户程序占用的扇区数\t215
13.4.3 简单的动态内存分配\t216
13.4.4 段的重定位和描述符的创建\t217
1
第1部分 预备知识
第1章 十六进制计数法\t3
1.1 二进制计数法回顾\t3
1.1.1 关于二进制计数法\t3
1.1.2 二进制到十进制的转换\t3
1.1.3 十进制到二进制的转换\t4
1.2 十六进制计数法\t4
1.2.1 十六进制计数法的原理\t4
1.2.2 十六进制到十进制的转换\t5
1.2.3 十进制到十六进制的转换\t6
1.3 为什么需要十六进制\t6
本章习题\t7
第2章 处理器、内存和指令\t8
2.1 最早的处理器\t8
2.2 寄存器和算术逻辑部件\t8
2.3 内存储器\t10
2.4 指令和指令集\t11
2.5 古老的Intel 8086处理器\t13
2.5.1 8086的通用寄存器\t13
2.5.2 程序的重定位难题\t14
2.5.3 内存分段机制\t17
2.5.4 8086的内存分段机制\t18
本章习题\t21
第3章 汇编语言和汇编软件\t22
3.1 汇编语言简介\t22
3.2 NASM编译器\t24
3.2.1 从网上下载NASM安装程序\t24
3.2.2 安装NASM编译器\t25
3.2.3 下载配书源码和工具\t26
3.2.4 用Nasmide体验代码的书写和编译过程\t28
3.2.5 用HexView观察编译后的机器代码\t29
本章习题\t30
第4章 虚拟机的安装和使用\t31
4.1 计算机的启动过程\t31
4.1.1 如何将编译好的程序提交给处理器\t31
4.1.2 计算机的加电和复位\t31
4.1.3 基本输入输出系统\t32
4.1.4 硬盘及其工作原理\t33
4.1.5 一切从主引导扇区开始\t35
4.2 创建和使用虚拟机\t35
4.2.1 别害怕,虚拟机是软件\t35
4.2.2 下载Oracle VM VirtualBox\t36
4.2.3 安装Oracle VM VirtualBox\t36
4.2.4 创建一台虚拟PC\t37
4.2.5 虚拟硬盘简介\t42
4.2.6 练习使用FixVhdWr工具向虚拟硬盘写数据\t43
第2部分 16位处理器下的实模式
第5章 编写主引导扇区代码\t49
5.1 欢迎来到主引导扇区\t49
5.2 注释\t49
5.3 在屏幕上显示文字\t50
5.3.1 显卡和显存\t50
5.3.2 初始化段寄存器\t52
5.3.3 显存的访问和ASCII代码\t53
5.3.4 显示字符\t55
5.4 显示标号的汇编地址\t56
5.4.1 标号\t56
5.4.2 如何显示十进制数字\t60
5.4.3 在程序中声明并初始化数据\t61
5.4.4 分解数的各个数位\t61
5.4.5 显示分解出来的各个数位\t65
5.5 使程序进入无限循环状态\t66
5.6 完成并编译主引导扇区代码\t67
5.6.1 主引导扇区有效标志\t67
5.6.2 代码的保存和编译\t68
5.7 加载和运行主引导扇区代码\t68
5.7.1 把编译后的指令写入主引导扇区\t68
5.7.2 启动虚拟机观察运行结果\t70
5.7.3 程序的调试\t70
本章习题\t71
第6章 相同的功能,不同的代码\t72
6.1 代码清单6-1\t72
6.2 跳过非指令的数据区\t72
6.3 在数据声明中使用字面值\t72
6.4 段地址的初始化\t73
6.5 段之间的批量数据传送\t74
6.6 使用循环分解数位\t75
6.7 计算机中的负数\t77
6.7.1 无符号数和有符号数\t77
6.7.2 处理器视角中的数据类型\t80
6.8 数位的显示\t82
6.9 其他标志位和条件转移指令\t83
6.9.1 奇偶标志位PF\t83
6.9.2 进位标志CF\t83
6.9.3 溢出标志OF\t84
6.9.4 现有指令对标志位的影响\t84
6.9.5 条件转移指令\t85
6.10 NASM编译器的$和$$标记\t87
6.11 观察运行结果\t87
本章习题\t88
第7章 比高斯更快的计算\t89
7.1 从1加到100的故事\t89
7.2 代码清单7-1\t89
7.3 显示字符串\t89
7.4 计算1到100的累加和\t90
7.5 累加和各个数位的分解与显示\t90
7.5.1 堆栈和堆栈段的初始化\t90
7.5.2 分解各个数位并压栈\t92
7.5.3 出栈并显示各个数位\t94
7.5.4 进一步认识堆栈\t95
7.6 程序的编译和运行\t96
7.7 8086处理器的寻址方式\t96
7.7.1 寄存器寻址\t96
7.7.2 立即寻址\t97
7.7.3 内存寻址\t97
本章习题\t101
第8章 硬盘和显卡的访问与控制\t102
8.1 本章代码清单\t102
8.1.1 本章意图\t102
8.1.2 代码清单8-1\t103
8.2 用户程序的结构\t103
8.2.1 分段、段的汇编地址和段内汇编地址\t103
8.2.2 用户程序头部\t106
8.3 加载程序(器)的工作流程\t109
8.3.1 初始化和决定加载位置\t109
8.3.2 准备加载用户程序\t110
8.3.3 外围设备及其接口\t111
8.3.4 I/O端口和端口访问\t112
8.3.5 通过硬盘控制器端口读扇区数据\t114
8.3.6 过程调用\t116
8.3.7 加载用户程序\t121
8.3.8 用户程序重定位\t122
8.3.9 将控制权交给用户程序\t126
8.3.10 8086处理器的无条件转移指令\t126
8.4 用户程序的工作流程\t128
8.4.1 初始化段寄存器和堆栈切换\t128
8.4.2 调用字符串显示例程\t129
8.4.3 过程的嵌套\t130
8.4.4 屏幕光标控制\t131
8.4.5 取当前光标位置\t131
8.4.6 处理回车和换行字符\t132
8.4.7 显示可打印字符\t133
8.4.8 滚动屏幕内容\t134
8.4.9 重置光标\t134
8.4.10 切换到另一个代码段中执行\t135
8.4.11 访问另一个数据段\t135
8.5 编译和运行程序并观察结果\t135
本章习题\t136
第9章 中断和动态时钟显示\t137
9.1 外部硬件中断\t137
9.1.1 非屏蔽中断\t138
9.1.2 可屏蔽中断\t138
9.1.3 实模式下的中断向量表\t140
9.1.4 实时时钟、CMOS RAM和BCD编码\t141
9.1.5 代码清单9-1\t145
9.1.6 初始化8259、RTC和中断向量表\t145
9.1.7 使处理器进入低功耗状态\t147
9.1.8 实时时钟中断的处理过程\t148
9.1.9 代码清单9-1的编译和运行\t150
9.2 内部中断\t150
9.3 软中断\t151
9.3.1 常用的BIOS中断\t151
9.3.2 代码清单9-2\t155
9.3.3 从键盘读字符并显示\t155
9.3.4 代码清单9-2的编译和运行\t155
本章习题\t156
第3部分 32位保护模式
第10章 32位Intel微处理器编程架构\t159
10.1 IA-32架构的基本执行环境\t164
10.1.1 寄存器的扩展\t162
10.1.2 基本的工作模式\t162
10.1.3 线性地址\t163
10.2 现代处理器的结构和特点\t164
10.2.1 流水线\t164
10.2.2 高速缓存\t165
10.2.3 乱序执行\t165
10.2.4 寄存器重命名\t166
10.2.5 分支目标预测\t167
10.3 32位模式的指令系统\t168
10.3.1 32位处理器的寻址方式\t168
10.3.2 操作数大小的指令前缀\t169
10.3.3 一般指令的扩展\t171
本章习题\t174
第11章 进入保护模式\t175
11.1 代码清单11-1\t175
11.2 全局描述符表\t175
11.3 存储器的段描述符\t177
11.4 安装存储器的段描述符并加载GDTR\t180
11.5 关于第21条地址线A20的问题\t182
11.6 保护模式下的内存访问\t184
11.7 清空流水线并串行化处理器\t188
11.8 保护模式下的堆栈\t189
11.8.1 关于堆栈段描述符中的界限值\t189
11.8.2 检验32位下的堆栈操作\t190
11.9 程序的编译和运行\t191
本章习题\t191
第12章 存储器的保护\t192
12.1 代码清单12-1\t192
12.2 进入32位保护模式\t192
12.2.1 话说mov ds,ax和mov ds,eax\t192
12.2.2 创建GDT并安装段描述符\t193
12.3 修改段寄存器时的保护\t195
12.4 地址变换时的保护\t197
12.4.1 代码段执行时的保护\t197
12.4.2 堆栈操作时的保护\t198
12.4.3 数据访问时的保护\t200
12.5 使用别名访问代码段对字符排序\t201
12.6 程序的编译和运行\t203
本章习题\t203
第13章 程序的动态加载和执行\t204
13.1 本章代码清单\t204
13.2 内核的结构、功能和加载\t205
13.2.1 内核的结构\t205
13.2.2 内核的加载\t206
13.2.3 安装内核的段描述符\t208
13.3 在内核中执行\t211
13.4 用户程序的加载和重定位\t213
13.4.1 用户程序的结构\t213
13.4.2 计算用户程序占用的扇区数\t215
13.4.3 简单的动态内存分配\t216
13.4.4 段的重定位和描述符的创建\t217
1
猜您喜欢