电子工业出版社精品店店铺主页二维码
电子工业出版社精品店
微信扫描二维码,访问我们的微信店铺

x86汇编语言 从实模式到保护模式(第2版) 电子工业出版社

49.00
运费: 免运费
x86汇编语言 从实模式到保护模式(第2版) 电子工业出版社 商品图0
x86汇编语言 从实模式到保护模式(第2版) 电子工业出版社 商品图1
x86汇编语言 从实模式到保护模式(第2版) 电子工业出版社 商品缩略图0 x86汇编语言 从实模式到保护模式(第2版) 电子工业出版社 商品缩略图1

商品详情

书名:x86汇编语言:从实模式到保护模式(*2版)  
定价:98.0  
ISBN:9787121447556  
作者:李忠  
版次:*1版  
出版时间:2023-01  

内容提要:  

内容介绍


《x86汇编语言:从实模式到保护模式》*二版修改方向1,在书的前面添加基础性的内容,用来说明汇编语言的由来和必要性,说明汇编语言编程的特点,以期平滑自然地进入汇编语言主题。2,原书中对指令系统及x86指令格式的描述过于简略,此版增补这部分内容;3,读者普遍反映*14章太难太紧凑,此版将相关内容拆分,降低学习的难度;4,整个保护模式部分以现在的观点来看,内容组织不够合理,予以重新组织,配书代码重新编写和组织;5,原书中有模糊的错误的表述,此版予以更正。  

作者介绍


李忠,主要出版著作《穿越计算机的迷雾》《x86汇编语言:从实模式到保护模式》《穿越计算机的迷雾(*2版)》《C语言非常道》等。  

关联推荐


这是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他软件支持的情况下来显示字符、读取硬盘数据、控制其他硬件等。  

媒体评论


这是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他软件支持的情况下来显示字符、读取硬盘数据、控制其他硬件等。  

目录


目 录  
*1部分 预备知识  
*1章 十六进制计数法 002  
1.1 二进制计数法回顾 002  
1.1.1 关于二进制计数法 002  
1.1.2 二进制到十进制的转换 003  
1.1.3 十进制到二进制的转换 003  
1.2 十六进制计数法 004  
1.2.1 十六进制计数法的原理 004  
1.2.2 十六进制到十进制的转换 005  
1.2.3 十进制到十六进制的转换 005  
1.2.4 为什么需要十六进制 006  
1.3 使用Windows计算器方便你的学习过程 007  
本章习题 008  
*2章 计算机和汇编语言 009  
2.1 用电表示数字 009  
2.2 二进制加法机 010  
2.3 具有记忆功能的器件——寄存器 011  
2.4 带寄存器的加法机 013  
2.5 能做四则运算的机器 014  
2.6 机器指令 015  
2.7 内存 017  
2.8 自动计算 021  
2.9 处理器 023  
2.10 汇编语言的诞生 025  
本章习题 027  
第3章 分段机制和逻辑地址 028  
3.1 寄存器和字长 028  
3.2 内存访问和字节序 029  
3.3 古老的INTEL 8086处理器 030  
3.3.1 8086的通用寄存器 030  
3.3.2 程序的重定位难题 031  
3.3.3 逻辑地址 034  
3.3.4 8086的内存分段机制 036  
本章习题 040  
第4章 汇编语言和汇编软件 041  
4.1 汇编语言程序 041  
4.2 NASM编译器 043  
4.2.1 NASM的下载和安装 043  
4.2.2 代码的书写和编译过程 044  
4.2.3 用HexView观察编译后的机器代码 047  
4.3 配书文件包的下载和使用 048  
本章习题 049  
*2部分 实模式  
第5章 虚拟机的安装和使用 051  
5.1 计算机的启动过程 051  
5.1.1 如何将编译好的程序提交给处理器 051  
5.1.2 计算机的加电和复位 052  
5.1.3 基本输入输出系统 052  
5.1.4 硬盘及其工作原理 054  
5.1.5 一切从主引导扇区开始 055  
5.2 创建和使用虚拟机 056  
5.2.1 别害怕,虚拟机是软件 056  
5.2.2 下载和安装Oracle VM VirtualBox 057  
5.2.3 虚拟硬盘简介 058  
5.2.4 练习使用FixVhdWr工具向虚拟硬盘写数据 059  
第6章 编写主引导扇区代码 063  
6.1 本章代码清单 063  
6.2 欢迎来到主引导扇区 063  
6.3 注释 064  
6.4 在屏幕上显示文字 064  
6.4.1 显卡和显存 064  
5.4.2 初始化段寄存器 067  
6.4.3 显存的访问和ASCII代码 067  
6.4.4 显示字符 070  
6.4.5 mov指令的格式 071  
6.5 显示标号的汇编地址 072  
6.5.1 标号 072  
6.5.2 如何显示十进制数字 076  
6.5.3 在程序中声明并初始化数据 077  
6.5.4 分解数的各个数位 078  
6.5.5 显示分解出来的各个数位 082  
6.6 使程序进入无限循环状态 083  
6.7 完成并编译主引导扇区代码 085  
6.7.1 主引导扇区有效标志 085  
6.7.2 代码的保存和编译 086  
6.8 加载和运行主引导扇区代码 086  
6.8.1 把编译后的指令写入主引导扇区 086  
6.8.2 启动虚拟机观察运行结果 087  
6.9 程序的调试技术 087  
6.9.1 开源的Bochs虚拟机软件 087  
6.9.2 Bochs下的程序调试入门 088  
本章习题 094  
第7章 相同的功能,不同的代码 095  
7.1 代码清单7-1 095  
7.2 跳过非指令的数据区 095  
7.3 在数据声明中使用字面值 096  
7.4 段地址的初始化 096  
7.5 段之间的批量数据传送 097  
7.6 使用循环分解数位 099  
7.7 计算机中的负数 101  
7.7.1 无符号数和有符号数 101  
7.7.2 处理器视角中的数据类型 104  
7.8 数位的显示 107  
7.9 其他标志位和条件转移指令 108  
7.9.1 奇偶标志位PF 108  
7.9.2 进位标志CF 109  
7.9.3 溢出标志OF 109  
7.9.4 现有指令对标志位的影响 110  
7.9.5 条件转移指令 111  
7.10 NASM编译器的$和$$标记 113  
7.11 观察运行结果 114  
7.12 本章程序的调试 114  
7.12.1 调试命令“n”的使用 114  
7.12.2 调试命令“u”的使用 115  
7.12.3 用调试命令“info”查看标志位 117  
本章习题 118  
?  
第8章 比高斯更快的计算 119  
8.1 从1加到100的故事 119  
8.2 代码清单8-1 119  
8.3 显示字符串 119  
8.4 计算1到100的累加和 120  
8.5 累加和各个数位的分解与显示 121  
8.5.1 栈和栈段的初始化 121  
8.5.2 分解各个数位并压栈 121  
8.5.3 出栈并显示各个数位 124  
8.5.4 进一步认识栈 125  
8.6 程序的编译和运行 127  
8.6.1 观察程序的运行结果 127  
8.6.2 在调试过程中查看栈中内容 127  
8.7 8086处理器的寻址方式 128  
8.7.1 寄存器寻址 129  
8.7.2 立即寻址 129  
8.7.3 内存寻址 129  
本章习题 134  
第9章 硬盘和显卡的访问与控制 135  
9.1 本章代码清单 136  
9.2 用户程序的结构 136  
9.2.1 分段、段的汇编地址和段内汇编地址 136  
9.2.2 用户程序头部 140  
9.3 加载程序(器)的工作流程 142  
9.3.1 初始化和决定加载位置 142  
9.3.2 准备加载用户程序 143  
9.3.3 外围设备及其接口 145  
9.3.4 I/O端口和端口访问 146  
9.3.5 通过硬盘控制器端口读扇区数据 148  
9.3.6 过程调用 151  
9.3.7 加载用户程序 156  
9.3.8 用户程序重定位 157  
9.3.9 将控制权交给用户程序 161  
9.3.10 8086处理器的无条件转移指令 161  
9.4 用户程序的工作流程 164  
9.4.1 初始化段寄存器和栈切换 164  
9.4.2 调用字符串显示例程 165  
9.4.3 过程的嵌套 165  
9.4.4 屏幕光标控制 166  
9.4.5 取当前光标位置 167  
9.4.6 处理回车和换行字符 168  
9.4.7 显示可打印字符 169  
9.4.8 滚动屏幕内容 169  
9.4.9 重置光标 170  
9.4.10 切换到另一个代码段中执行 170  
9.4.11 访问另一个数据段 171  
9.5 编译和运行程序并观察结果 171  
本章习题 172  
第3部分 保护模式  
*10章 中断和动态时钟显示 174  
10.1 外部硬件中断 175  
10.1.1 非屏蔽中断 176  
10.1.2 可屏蔽中断 176  
10.1.3 实模式下的中断向量表 178  
10.1.4 实时时钟、CMOS RAM和BCD编码 179  
10.1.5 实时时钟RTC的中断信号 181  
10.1.6 代码清单10-1 185  
10.1.7 初始化8259、RTC和中断向量表 185  
10.1.8 使处理器进入低功耗状态 187  
10.1.9 实时时钟中断的处理过程 187  
10.1.10 代码清单10-1的编译和运行 190  
10.2 内部中断 191  
10.3 软中断 191  
10.3.1 BIOS中断 192  
10.3.2 代码清单10-2 193  
10.3.3 从键盘读字符并显示 193  
10.3.4 代码清单10-2的编译和运行 194  
本章习题 194  
*11章 32位x86处理器编程架构 195  
11.1 IA-32架构的基本执行环境 195  
11.1.1 寄存器的扩展 195  
11.1.2 基本的工作模式 198  
11.1.3 线性地址和分页 199  
11.2 现代处理器的结构和特点 200  
11.2.1 流水线 200  
11.2.2 高速缓存 201  
11.2.3 乱序执行 201  
11.2.4 寄存器重命名 202  
11.2.5 分支目标预测 203  
11.3 32位处理器的寻址方式 204  
*12章 进入保护模式 206  
12.1 代码清单12-1 207  
12.2 全局描述符表 207  
12.3 存储器的段描述符 208  
12.4 安装存储器的段描述符并加载GDTR 213  
12.5 关于*21条地址线A20的问题 215  
12.6 保护模式下的内存访问 216  
12.7 程序的运行和调试 221  
12.7.1 运行程序并观察结果 221  
12.7.2 处理器刚加电时的段寄存器状态 222  
12.7.3 设置PE位后的段寄存器状态 224  
12.7.4 加载段寄存器DS之后的状态 225  
12.7.5 查看全局描述符表GDT 225  
12.7.6 查看控制寄存器的内容 226  
本章习题 226  
*13章 操作数和有效地址的尺寸 227  
13.1 代码清单13-1 227  
13.2 INTEL 80286处理器的16位保护模式 227  
13.3 指令的操作尺寸 228  
13.3.1 16位操作尺寸 228  
13.3.2 32位操作尺寸 229  
13.3.3 默认操作尺寸 229  
13.3.4 操作尺寸反转前缀 232  
13.3.5 编译时的操作尺寸 234  
13.4 清空流水线并串行化处理器 235  
13.5 有效地址尺寸和内存访问 237  
13.6 一般指令在32位操作尺寸下的扩展 239  
本章习题 241  
*14章 存储器的保护 243  
14.1 代码清单14-1 243  
14.2 进入32位保护模式 243  
14.2.1 话说mov ds,ax和mov ds,eax 243  
14.2.2 创建GDT并安装段描述符 244  
14.3 修改段寄存器时的保护 247  
14.4 地址变换时的保护 249  
14.4.1 代码段执行时的保护 249  
14.4.2 数据访问时的保护 250  
14.4.3 栈操作时的保护 251  
14.5 使用别名访问代码段对字符排序 253  
14.6 程序的编译和运行 256  
本章习题 256  
*15章 程序的动态加载和执行 257  
15.1 本章代码清单 258  
15.2 内核的结构、功能和加载 258  
15.2.1 内核的结构 258  
15.2.2 内核的加载 259  
15.2.3 安装内核的段描述符 261  
15.3 在内核中执行 265  
15.4 用户程序的加载和重定位 267  
15.4.1 用户程序的结构 267  
15.4.2 计算用户程序占用的扇区数 268  
15.4.3 简单的动态内存分配 270  
15.4.4 段的重定位和描述符的创建 271  
15.4.5 重定位用户程序内的符号地址 274  
15.5 执行用户程序 278  
15.6 代码的编译、运行和调试 279  
本章习题 281  
*16章 任务和特权级保护 282  
16.1 任务的隔离和特权级保护 283  
16.1.1 任务、任务的LDT和TSS 283  
16.1.2 全局空间和局部空间 284  
16.1.3 特权级保护概述 287  
16.2 代码清单16-1 295  
16.3 内核程序的初始化 295  
16.3.1 调用门 296  
16.3.2 调用门的安装和测试 299  
16.4 加载用户程序并创建任务 301  
16.4.1 任务控制块和TCB链 301  
16.4.2 使用栈传递过程参数 304  
16.4.3 加载用户程序 306  
16.4.4 创建局部描述符表 306  
16.4.5 重定位U-SALT表 308  
16.4.6 创建0、1和2特权级的栈 309  
16.4.7 安装LDT描述符到GDT中 309  
16.4.8 任务状态段TSS的格式 310  
16.4.9 创建任务状态段TSS 314  
16.4.10 安装TSS描述符到GDT中 315  
16.4.11 带参数的过程返回指令 315  
16.5 用户程序的执行 316  
16.5.1 通过调用门转移控制的完整过程 316  
16.5.2 进入3特权级的用户程序的执行 320  
16.5.3 检查调用者的请求特权级RPL 323  
16.5.4 在Bochs中调试程序的新方法 324  
本章习题 325  
*17章 协同式任务切换 326  
17.1 本章代码清单 326  
17.2 任务切换前的设置 326  
17.3 任务切换的方法 329  
17.4 用jmp指令发起任务切换的实例 333  
17.5 处理器在实施任务切换时的操作 340  
17.6 程序的编译和运行 342  
本章习题 342  
*18章 中断和异常的处理与抢占式多任务 343  
18.1 中断和异常 343  
18.1.1 中断和异常概述 343  
18.1.2 中断描述符表、中断门和陷阱门 346  
18.2 本章代码清单 348  
18.3 内核的加载和初始化 348  
18.3.1 创建中断描述符表 348  
18.3.2 8259A芯片的初始化 352  
18.3.3 中断和异常处理程序的保护 354  
18.3.4 中断任务 355  
18.3.5 错误代码 357  
18.3.6 用定时中断实施任务切换 358  
18.4 内核任务的创建 360  
18.5 用户任务的创建和执行 360  
18.6 程序的编译和执行 362  
本章习题 362  
?  
*19章 分页机制和动态页面分配 363  
19.1 分页机制概述 364  
19.1.1 简单的分页模型 364  
19.1.2 页目录、页表和页 373  
19.1.3 地址变换的具体过程 375  
19.2 本章代码清单 376  
19.3 使内核在分页机制下工作 377  
19.3.1 创建内核的页目录表和页表 377  
19.3.2 任务全局空间和局部空间的页面映射 382  
19.4 创建内核任务 389  
19.4.1 内核的虚拟内存分配 389  
19.4.2 页面位映射串和空闲页的查找 394  
19.4.3 内核任务的确立 398  
19.5 用户任务的创建和切换 399  
19.5.1 用户任务的虚拟内存分配策略 399  
19.5.2 用户任务的虚拟地址空间分配 402  
19.5.3 创建用户任务的LDT 403  
19.5.4 用户程序的加载 405  
19.5.5 重定位U-SALT并复制页目录表 405  
19.5.6 切换到用户任务执行 408  
19.6 程序的编译、执行和调试 409  
19.6.1 本章程序的编译和运行方法 409  
19.6.2 查看CR3寄存器的内容 409  
19.6.3 查看线性地址对应的物理页信息 410  
19.6.4 查看当前任务的页表信息 411  
19.6.5 使用线性(虚拟)地址调试程序 411  
本章习题 412  
*20章 平坦内存模型和软件任务切换 413  
20.1 多段模型和平坦模型 413  
20.1.1 多段模型和段页式内存管理 413  
20.1.2 平坦模型 415  
20.2 本章代码清单 416  
20.3 初始化系统并加载内核 416  
20.3.1 定义平坦模型下的段描述符 417  
20.3.2 平坦模型下的内核程序 418  
20.3.3 加载内核程序 419  
20.4 内核的初始化 421  
20.4.1 进入内核并初始化中断系统 421  
20.4.2 软中断和系统调用 422  
20.4.3 系统调用的安装及其工作原理 423  
20.4.4 任务状态段TSS的新用法 424  
20.5 用户任务的创建 427  
20.5.1 平坦模型下的用户程序结构 428  
20.5.2 用户任务的创建过程 428  
20.6 软件任务切换 429  
20.6.1 保存当前任务的状态 430  
20.6.2 恢复并执行新任务 430  
20.7 内核任务的执行 431  
20.8 用户任务的执行 432  
本章习题 433  




作者简介:  
李忠,主要出版著作《穿越计算机的迷雾》《x86汇编语言:从实模式到保护模式》《穿越计算机的迷雾(*2版)》《C语言非常道》等。  

媒体评论:  
这是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他软件支持的情况下来显示字符、读取硬盘数据、控制其他硬件等。  

目录:  
目 录  
*1部分 预备知识  
*1章 十六进制计数法 002  
1.1 二进制计数法回顾 002  
1.1.1 关于二进制计数法 002  
1.1.2 二进制到十进制的转换 003  
1.1.3 十进制到二进制的转换 003  
1.2 十六进制计数法 004  
1.2.1 十六进制计数法的原理 004  
1.2.2 十六进制到十进制的转换 005  
1.2.3 十进制到十六进制的转换 005  
1.2.4 为什么需要十六进制 006  
1.3 使用Windows计算器方便你的学习过程 007  
本章习题 008  
*2章 计算机和汇编语言 009  
2.1 用电表示数字 009  
2.2 二进制加法机 010  
2.3 具有记忆功能的器件——寄存器 011  
2.4 带寄存器的加法机 013  
2.5 能做四则运算的机器 014  
2.6 机器指令 015  
2.7 内存 017  
2.8 自动计算 021  
2.9 处理器 023  
2.10 汇编语言的诞生 025  
本章习题 027  
第3章 分段机制和逻辑地址 028  
3.1 寄存器和字长 028  
3.2 内存访问和字节序 029  
3.3 古老的INTEL 8086处理器 030  
3.3.1 8086的通用寄存器 030  
3.3.2 程序的重定位难题 031  
3.3.3 逻辑地址 034  
3.3.4 8086的内存分段机制 036  
本章习题 040  
第4章 汇编语言和汇编软件 041  
4.1 汇编语言程序 041  
4.2 NASM编译器 043  
4.2.1 NASM的下载和安装 043  
4.2.2 代码的书写和编译过程 044  
4.2.3 用HexView观察编译后的机器代码 047  
4.3 配书文件包的下载和使用 048  
本章习题 049  
*2部分 实模式  
第5章 虚拟机的安装和使用 051  
5.1 计算机的启动过程 051  
5.1.1 如何将编译好的程序提交给处理器 051  
5.1.2 计算机的加电和复位 052  
5.1.3 基本输入输出系统 052  
5.1.4 硬盘及其工作原理 054  
5.1.5 一切从主引导扇区开始 055  
5.2 创建和使用虚拟机 056  
5.2.1 别害怕,虚拟机是软件 056  
5.2.2 下载和安装Oracle VM VirtualBox 057  
5.2.3 虚拟硬盘简介 058  
5.2.4 练习使用FixVhdWr工具向虚拟硬盘写数据 059  
第6章 编写主引导扇区代码 063  
6.1 本章代码清单 063  
6.2 欢迎来到主引导扇区 063  
6.3 注释 064  
6.4 在屏幕上显示文字 064  
6.4.1 显卡和显存 064  
5.4.2 初始化段寄存器 067  
6.4.3 显存的访问和ASCII代码 067  
6.4.4 显示字符 070  
6.4.5 mov指令的格式 071  
6.5 显示标号的汇编地址 072  
6.5.1 标号 072  
6.5.2 如何显示十进制数字 076  
6.5.3 在程序中声明并初始化数据 077  
6.5.4 分解数的各个数位 078  
6.5.5 显示分解出来的各个数位 082  
6.6 使程序进入无限循环状态 083  
6.7 完成并编译主引导扇区代码 085  
6.7.1 主引导扇区有效标志 085  
6.7.2 代码的保存和编译 086  
6.8 加载和运行主引导扇区代码 086  
6.8.1 把编译后的指令写入主引导扇区 086  
6.8.2 启动虚拟机观察运行结果 087  
6.9 程序的调试技术 087  
6.9.1 开源的Bochs虚拟机软件 087  
6.9.2 Bochs下的程序调试入门 088  
本章习题 094  
第7章 相同的功能,不同的代码 095  
7.1 代码清单7-1 095  
7.2 跳过非指令的数据区 095  
7.3 在数据声明中使用字面值 096  
7.4 段地址的初始化 096  
7.5 段之间的批量数据传送 097  
7.6 使用循环分解数位 099  
7.7 计算机中的负数 101  
7.7.1 无符号数和有符号数 101  
7.7.2 处理器视角中的数据类型 104  
7.8 数位的显示 107  
7.9 其他标志位和条件转移指令 108  
7.9.1 奇偶标志位PF 108  
7.9.2 进位标志CF 109  
7.9.3 溢出标志OF 109  
7.9.4 现有指令对标志位的影响 110  
7.9.5 条件转移指令 111  
7.10 NASM编译器的$和$$标记 113  
7.11 观察运行结果 114  
7.12 本章程序的调试 114  
7.12.1 调试命令“n”的使用 114  
7.12.2 调试命令“u”的使用 115  
7.12.3 用调试命令“info”查看标志位 117  
本章习题 118  
?  
第8章 比高斯更快的计算 119  
8.1 从1加到100的故事 119  
8.2 代码清单8-1 119  
8.3 显示字符串 119  
8.4 计算1到100的累加和 120  
8.5 累加和各个数位的分解与显示 121  
8.5.1 栈和栈段的初始化 121  
8.5.2 分解各个数位并压栈 121  
8.5.3 出栈并显示各个数位 124  
8.5.4 进一步认识栈 125  
8.6 程序的编译和运行 127  
8.6.1 观察程序的运行结果 127  
8.6.2 在调试过程中查看栈中内容 127  
8.7 8086处理器的寻址方式 128  
8.7.1 寄存器寻址 129  
8.7.2 立即寻址 129  
8.7.3 内存寻址 129  
本章习题 134  
第9章 硬盘和显卡的访问与控制 135  
9.1 本章代码清单 136  
9.2 用户程序的结构 136  
9.2.1 分段、段的汇编地址和段内汇编地址 136  
9.2.2 用户程序头部 140  
9.3 加载程序(器)的工作流程 142  
9.3.1 初始化和决定加载位置 142  
9.3.2 准备加载用户程序 143  
9.3.3 外围设备及其接口 145  
9.3.4 I/O端口和端口访问 146  
9.3.5 通过硬盘控制器端口读扇区数据 148  
9.3.6 过程调用 151  
9.3.7 加载用户程序 156  
9.3.8 用户程序重定位 157  
9.3.9 将控制权交给用户程序 161  
9.3.10 8086处理器的无条件转移指令 161  
9.4 用户程序的工作流程 164  
9.4.1 初始化段寄存器和栈切换 164  
9.4.2 调用字符串显示例程 165  
9.4.3 过程的嵌套 165  
9.4.4 屏幕光标控制 166  
9.4.5 取当前光标位置 167  
9.4.6 处理回车和换行字符 168  
9.4.7 显示可打印字符 169  
9.4.8 滚动屏幕内容 169  
9.4.9 重置光标 170  
9.4.10 切换到另一个代码段中执行 170  
9.4.11 访问另一个数据段 171  
9.5 编译和运行程序并观察结果 171  
本章习题 172  
第3部分 保护模式  
*10章 中断和动态时钟显示 174  
10.1 外部硬件中断 175  
10.1.1 非屏蔽中断 176  
10.1.2 可屏蔽中断 176  
10.1.3 实模式下的中断向量表 178  
10.1.4 实时时钟、CMOS RAM和BCD编码 179  
10.1.5 实时时钟RTC的中断信号 181  
10.1.6 代码清单10-1 185  
10.1.7 初始化8259、RTC和中断向量表 185  
10.1.8 使处理器进入低功耗状态 187  
10.1.9 实时时钟中断的处理过程 187  
10.1.10 代码清单10-1的编译和运行 190  
10.2 内部中断 191  
10.3 软中断 191  
10.3.1 BIOS中断 192  
10.3.2 代码清单10-2 193  
10.3.3 从键盘读字符并显示 193  
10.3.4 代码清单10-2的编译和运行 194  
本章习题 194  
*11章 32位x86处理器编程架构 195  
11.1 IA-32架构的基本执行环境 195  
11.1.1 寄存器的扩展 195  
11.1.2 基本的工作模式 198  
11.1.3 线性地址和分页 199  
11.2 现代处理器的结构和特点 200  
11.2.1 流水线 200  
11.2.2 高速缓存 201  
11.2.3 乱序执行 201  
11.2.4 寄存器重命名 202  
11.2.5 分支目标预测 203  
11.3 32位处理器的寻址方式 204  
*12章 进入保护模式 206  
12.1 代码清单12-1 207  
12.2 全局描述符表 207  
12.3 存储器的段描述符 208  
12.4 安装存储器的段描述符并加载GDTR 213  
12.5 关于*21条地址线A20的问题 215  
12.6 保护模式下的内存访问 216  
12.7 程序的运行和调试 221  
12.7.1 运行程序并观察结果 221  
12.7.2 处理器刚加电时的段寄存器状态 222  
12.7.3 设置PE位后的段寄存器状态 224  
12.7.4 加载段寄存器DS之后的状态 225  
12.7.5 查看全局描述符表GDT 225  
12.7.6 查看控制寄存器的内容 226  
本章习题 226  
*13章 操作数和有效地址的尺寸 227  
13.1 代码清单13-1 227  
13.2 INTEL 80286处理器的16位保护模式 227  
13.3 指令的操作尺寸 228  
13.3.1 16位操作尺寸 228  
13.3.2 32位操作尺寸 229  
13.3.3 默认操作尺寸 229  
13.3.4 操作尺寸反转前缀 232  
13.3.5 编译时的操作尺寸 234  
13.4 清空流水线并串行化处理器 235  
13.5 有效地址尺寸和内存访问 237  
13.6 一般指令在32位操作尺寸下的扩展 239  
本章习题 241  
*14章 存储器的保护 243  
14.1 代码清单14-1 243  
14.2 进入32位保护模式 243  
14.2.1 话说mov ds,ax和mov ds,eax 243  
14.2.2 创建GDT并安装段描述符 244  
14.3 修改段寄存器时的保护 247  
14.4 地址变换时的保护 249  
14.4.1 代码段执行时的保护 249  
14.4.2 数据访问时的保护 250  
14.4.3 栈操作时的保护 251  
14.5 使用别名访问代码段对字符排序 253  
14.6 程序的编译和运行 256  
本章习题 256  
*15章 程序的动态加载和执行 257  
15.1 本章代码清单 258  
15.2 内核的结构、功能和加载 258  
15.2.1 内核的结构 258  
15.2.2 内核的加载 259  
15.2.3 安装内核的段描述符 261  
15.3 在内核中执行 265  
15.4 用户程序的加载和重定位 267  
15.4.1 用户程序的结构 267  
15.4.2 计算用户程序占用的扇区数 268  
15.4.3 简单的动态内存分配 270  
15.4.4 段的重定位和描述符的创建 271  
15.4.5 重定位用户程序内的符号地址 274  
15.5 执行用户程序 278  
15.6 代码的编译、运行和调试 279  
本章习题 281  
*16章 任务和特权级保护 282  
16.1 任务的隔离和特权级保护 283  
16.1.1 任务、任务的LDT和TSS 283  
16.1.2 全局空间和局部空间 284  
16.1.3 特权级保护概述 287  
16.2 代码清单16-1 295  
16.3 内核程序的初始化 295  
16.3.1 调用门 296  
16.3.2 调用门的安装和测试 299  
16.4 加载用户程序并创建任务 301  
16.4.1 任务控制块和TCB链 301  
16.4.2 使用栈传递过程参数 304  
16.4.3 加载用户程序 306  
16.4.4 创建局部描述符表 306  
16.4.5 重定位U-SALT表 308  
16.4.6 创建0、1和2特权级的栈 309  
16.4.7 安装LDT描述符到GDT中 309  
16.4.8 任务状态段TSS的格式 310  
16.4.9 创建任务状态段TSS 314  
16.4.10 安装TSS描述符到GDT中 315  
16.4.11 带参数的过程返回指令 315  
16.5 用户程序的执行 316  
16.5.1 通过调用门转移控制的完整过程 316  
16.5.2 进入3特权级的用户程序的执行 320  
16.5.3 检查调用者的请求特权级RPL 323  
16.5.4 在Bochs中调试程序的新方法 324  
本章习题 325  
*17章 协同式任务切换 326  
17.1 本章代码清单 326  
17.2 任务切换前的设置 326  
17.3 任务切换的方法 329  
17.4 用jmp指令发起任务切换的实例 333  
17.5 处理器在实施任务切换时的操作 340  
17.6 程序的编译和运行 342  
本章习题 342  
*18章 中断和异常的处理与抢占式多任务 343  
18.1 中断和异常 343  
18.1.1 中断和异常概述 343  
18.1.2 中断描述符表、中断门和陷阱门 346  
18.2 本章代码清单 348  
18.3 内核的加载和初始化 348  
18.3.1 创建中断描述符表 348  
18.3.2 8259A芯片的初始化 352  
18.3.3 中断和异常处理程序的保护 354  
18.3.4 中断任务 355  
18.3.5 错误代码 357  
18.3.6 用定时中断实施任务切换 358  
18.4 内核任务的创建 360  
18.5 用户任务的创建和执行 360  
18.6 程序的编译和执行 362  
本章习题 362  
?  
*19章 分页机制和动态页面分配 363  
19.1 分页机制概述 364  
19.1.1 简单的分页模型 364  
19.1.2 页目录、页表和页 373  
19.1.3 地址变换的具体过程 375  
19.2 本章代码清单 376  
19.3 使内核在分页机制下工作 377  
19.3.1 创建内核的页目录表和页表 377  
19.3.2 任务全局空间和局部空间的页面映射 382  
19.4 创建内核任务 389  
19.4.1 内核的虚拟内存分配 389  
19.4.2 页面位映射串和空闲页的查找 394  
19.4.3 内核任务的确立 398  
19.5 用户任务的创建和切换 399  
19.5.1 用户任务的虚拟内存分配策略 399  
19.5.2 用户任务的虚拟地址空间分配 402  
19.5.3 创建用户任务的LDT 403  
19.5.4 用户程序的加载 405  
19.5.5 重定位U-SALT并复制页目录表 405  
19.5.6 切换到用户任务执行 408  
19.6 程序的编译、执行和调试 409  
19.6.1 本章程序的编译和运行方法 409  
19.6.2 查看CR3寄存器的内容 409  
19.6.3 查看线性地址对应的物理页信息 410  
19.6.4 查看当前任务的页表信息 411  
19.6.5 使用线性(虚拟)地址调试程序 411  
本章习题 412  
*20章 平坦内存模型和软件任务切换 413  
20.1 多段模型和平坦模型 413  
20.1.1 多段模型和段页式内存管理 413  
20.1.2 平坦模型 415  
20.2 本章代码清单 416  
20.3 初始化系统并加载内核 416  
20.3.1 定义平坦模型下的段描述符 417  
20.3.2 平坦模型下的内核程序 418  
20.3.3 加载内核程序 419  
20.4 内核的初始化 421  
20.4.1 进入内核并初始化中断系统 421  
20.4.2 软中断和系统调用 422  
20.4.3 系统调用的安装及其工作原理 423  
20.4.4 任务状态段TSS的新用法 424  
20.5 用户任务的创建 427  
20.5.1 平坦模型下的用户程序结构 428  
20.5.2 用户任务的创建过程 428  
20.6 软件任务切换 429  
20.6.1 保存当前任务的状态 430  
20.6.2 恢复并执行新任务 430  
20.7 内核任务的执行 431  
20.8 用户任务的执行 432  
本章习题 433  

电子工业出版社精品店店铺主页二维码
电子工业出版社精品店
扫描二维码,访问我们的微信店铺

x86汇编语言 从实模式到保护模式(第2版) 电子工业出版社

手机启动微信
扫一扫购买

收藏到微信 or 发给朋友

1. 打开微信,扫一扫左侧二维码

2. 点击右上角图标

点击右上角分享图标

3. 发送给朋友、分享到朋友圈、收藏

发送给朋友、分享到朋友圈、收藏

微信支付

支付宝

扫一扫购买

收藏到微信 or 发给朋友

1. 打开微信,扫一扫左侧二维码

2. 点击右上角图标

点击右上角分享图标

3. 发送给朋友、分享到朋友圈、收藏

发送给朋友、分享到朋友圈、收藏