展开全部

主编推荐语

想真正理解计算机的工作原理,掌握它内部的运行机制,学习汇编语言必不可少。

内容简介

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

本书采用开源的NASM汇编语言编译器和VirtualBox虚拟机软件,以个人计算机广泛采用的Intel处理器为基础,详细讲解了Intel处理器的指令系统和工作模式,以大量的代码演示了16/32/64位软件的开发方法,介绍了处理器的16位实模式和32位保护模式,以及基本的指令系统。

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

目录

  • 版权信息
  • 前言
  • 第1部分 预备知识
  • 第1章 十六进制计数法
  • 1.1 二进制计数法回顾
  • 1.1.1 关于二进制计数法
  • 1.1.2 二进制到十进制的转换
  • 1.1.3 十进制到二进制的转换
  • 1.2 十六进制计数法
  • 1.2.1 十六进制计数法的原理
  • 1.2.2 十六进制到十进制的转换
  • 1.2.3 十进制到十六进制的转换
  • 1.2.4 为什么需要十六进制
  • 1.3 使用Windows计算器方便你的学习过程
  • 本章习题
  • 第2章 处理器、内存和指令
  • 2.1 最早的处理器
  • 2.2 寄存器和算术逻辑部件
  • 2.3 内存储器
  • 2.4 指令和指令集
  • 2.5 古老的Intel 8086处理器
  • 2.5.1 8086的通用寄存器
  • 2.5.2 程序的重定位难题
  • 2.5.3 内存分段机制
  • 2.5.4 8086的内存分段机制
  • 本章习题
  • 第3章 汇编语言和汇编软件
  • 3.1 汇编语言简介
  • 3.2 NASM编译器
  • 3.2.1 NASM的下载和安装
  • 3.2.2 代码的书写和编译过程
  • 3.2.3 用HexView观察编译后的机器代码
  • 本章习题
  • 第4章 虚拟机的安装和使用
  • 4.1 计算机的启动过程
  • 4.1.1 如何将编译好的程序提交给处理器
  • 4.1.2 计算机的加电和复位
  • 4.1.3 基本输入输出系统
  • 4.1.4 硬盘及其工作原理
  • 4.1.5 一切从主引导扇区开始
  • 4.2 创建和使用虚拟机
  • 4.2.1 别害怕,虚拟机是软件
  • 4.2.2 下载和安装Oracle VM VirtualBox
  • 4.2.3 虚拟硬盘简介
  • 4.2.4 练习使用FixVhdWr工具向虚拟硬盘写数据
  • 第2部分 实模式
  • 第5章 编写主引导扇区代码
  • 5.1 本章代码清单
  • 5.2 欢迎来到主引导扇区
  • 5.3 注释
  • 5.4 在屏幕上显示文字
  • 5.4.1 显卡和显存
  • 5.4.2 初始化段寄存器
  • 5.4.3 显存的访问和ASCII代码
  • 5.4.4 显示字符
  • 5.4.5 MOV指令的格式
  • 5.5 显示标号的汇编地址
  • 5.5.1 标号
  • 5.5.2 如何显示十进制数字
  • 5.5.3 在程序中声明并初始化数据
  • 5.5.4 分解数的各个数位
  • 5.5.5 显示分解出来的各个数位
  • 5.6 使程序进入无限循环状态
  • 5.7 完成并编译主引导扇区代码
  • 5.7.1 主引导扇区有效标志
  • 5.7.2 代码的保存和编译
  • 5.8 加载和运行主引导扇区代码
  • 5.8.1 把编译后的指令写入主引导扇区
  • 5.8.2 启动虚拟机观察运行结果
  • 5.9 程序的调试技术
  • 5.9.1 开源的Bochs虚拟机软件
  • 5.9.2 Bochs下的程序调试入门
  • 本章习题
  • 第6章 相同的功能,不同的代码
  • 6.1 代码清单6-1
  • 6.2 跳过非指令的数据区
  • 6.3 在数据声明中使用字面值
  • 6.4 段地址的初始化
  • 6.5 段之间的批量数据传送
  • 6.6 使用循环分解数位
  • 6.7 计算机中的负数
  • 6.7.1 无符号数和有符号数
  • 6.7.2 处理器视角中的数据类型
  • 6.8 数位的显示
  • 6.9 其他标志位和条件转移指令
  • 6.9.1 奇偶标志位PF
  • 6.9.2 进位标志CF
  • 6.9.3 溢出标志OF
  • 6.9.4 现有指令对标志位的影响
  • 6.9.5 条件转移指令
  • 6.10 NASM编译器的$和$$标记
  • 6.11 观察运行结果
  • 6.12 本章程序的调试
  • 6.12.1 调试命令“n”的使用
  • 6.12.2 调试命令“u”的使用
  • 6.12.3 用调试命令“info”察看标志位
  • 本章习题
  • 第7章 比高斯更快的计算
  • 7.1 从1加到100的故事
  • 7.2 代码清单7-1
  • 7.3 显示字符串
  • 7.4 计算1到100的累加和
  • 7.5 累加和各个数位的分解与显示
  • 7.5.1 栈和栈段的初始化
  • 7.5.2 分解各个数位并压栈
  • 7.5.3 出栈并显示各个数位
  • 7.5.4 进一步认识栈
  • 7.6 程序的编译和运行
  • 7.6.1 观察程序的运行结果
  • 7.6.2 在调试过程中察看栈中内容
  • 7.7 8086处理器的寻址方式
  • 7.7.1 寄存器寻址
  • 7.7.2 立即寻址
  • 7.7.3 内存寻址
  • 本章习题
  • 第8章 硬盘和显卡的访问与控制
  • 8.1 本章代码清单
  • 8.2 用户程序的结构
  • 8.2.1 分段、段的汇编地址和段内汇编地址
  • 8.2.2 用户程序头部
  • 8.3 加载程序(器)的工作流程
  • 8.3.1 初始化和决定加载位置
  • 8.3.2 准备加载用户程序
  • 8.3.3 外围设备及其接口
  • 8.3.4 I/O端口和端口访问
  • 8.3.5 通过硬盘控制器端口读扇区数据
  • 8.3.6 过程调用
  • 8.3.7 加载用户程序
  • 8.3.8 用户程序重定位
  • 8.3.9 将控制权交给用户程序
  • 8.3.10 8086处理器的无条件转移指令
  • 8.4 用户程序的工作流程
  • 8.4.1 初始化段寄存器和栈切换
  • 8.4.2 调用字符串显示例程
  • 8.4.3 过程的嵌套
  • 8.4.4 屏幕光标控制
  • 8.4.5 取当前光标位置
  • 8.4.6 处理回车和换行字符
  • 8.4.7 显示可打印字符
  • 8.4.8 滚动屏幕内容
  • 8.4.9 重置光标
  • 8.4.10 切换到另一个代码段中执行
  • 8.4.11 访问另一个数据段
  • 8.5 编译和运行程序并观察结果
  • 本章习题
  • 第9章 中断和动态时钟显示
  • 9.1 外部硬件中断
  • 9.1.1 非屏蔽中断
  • 9.1.2 可屏蔽中断
  • 9.1.3 实模式下的中断向量表
  • 9.1.4 实时时钟、CMOS RAM和BCD编码
  • 9.1.5 代码清单9-1
  • 9.1.6 初始化8259、RTC和中断向量表
  • 9.1.7 使处理器进入低功耗状态
  • 9.1.8 实时时钟中断的处理过程
  • 9.1.9 代码清单9-1的编译和运行
  • 9.2 内部中断
  • 9.3 软中断
  • 9.3.1 BIOS中断
  • 9.3.2 代码清单9-2
  • 9.3.3 从键盘读字符并显示
  • 9.3.4 代码清单9-2的编译和运行
  • 本章习题
  • 第3部分 32位保护模式
  • 第10章 32位x86处理器编程架构
  • 10.1 IA-32架构的基本执行环境
  • 10.1.1 寄存器的扩展
  • 10.1.2 基本的工作模式
  • 10.1.3 线性地址
  • 10.2 现代处理器的结构和特点
  • 10.2.1 流水线
  • 10.2.2 高速缓存
  • 10.2.3 乱序执行
  • 10.2.4 寄存器重命名
  • 10.2.5 分支目标预测
  • 10.3 32位模式的指令系统
  • 10.3.1 32位处理器的寻址方式
  • 10.3.2 操作数大小的指令前缀
  • 10.3.3 一般指令的扩展
  • 本章习题
  • 第11章 进入保护模式
  • 11.1 代码清单11-1
  • 11.2 全局描述符表
  • 11.3 存储器的段描述符
  • 11.4 安装存储器的段描述符并加载GDTR
  • 11.5 关于第21条地址线A20的问题
  • 11.6 保护模式下的内存访问
  • 11.7 清空流水线并串行化处理器
  • 11.8 保护模式下的栈
  • 11.8.1 关于栈段描述符中的界限值
  • 11.8.2 检验32位下的栈操作
  • 11.9 程序的运行和调试
  • 11.9.1 运行程序并观察结果
  • 11.9.2 处理器刚加电时的段寄存器状态
  • 11.9.3 设置PE位后的段寄存器状态
  • 11.9.4 JMP指令执行后的段寄存器状态
  • 11.9.5 察看全局描述符表GDT
  • 11.9.6 察看控制寄存器的内容
  • 本章习题
  • 第12章 存储器的保护
  • 12.1 代码清单12-1
  • 12.2 进入32位保护模式
  • 12.2.1 话说mov ds, ax和mov ds, eax
  • 12.2.2 创建GDT并安装段描述符
  • 12.3 修改段寄存器时的保护
  • 12.4 地址变换时的保护
  • 12.4.1 代码段执行时的保护
  • 12.4.2 栈操作时的保护
  • 12.4.3 数据访问时的保护
  • 12.5 使用别名访问代码段对字符排序
  • 12.6 程序的编译和运行
  • 本章习题
  • 第13章 程序的动态加载和执行
  • 13.1 本章代码清单
  • 13.2 内核的结构、功能和加载
  • 13.2.1 内核的结构
  • 13.2.2 内核的加载
  • 13.2.3 安装内核的段描述符
  • 13.3 在内核中执行
  • 13.4 用户程序的加载和重定位
  • 13.4.1 用户程序的结构
  • 13.4.2 计算用户程序占用的扇区数
  • 13.4.3 简单的动态内存分配
  • 13.4.4 段的重定位和描述符的创建
  • 13.4.5 重定位用户程序内的符号地址
  • 13.5 执行用户程序
  • 13.6 代码的编译、运行和调试
  • 本章习题
  • 第14章 任务和特权级保护
  • 14.1 任务的隔离和特权级保护
  • 14.1.1 任务、任务的LDT和TSS
  • 14.1.2 全局空间和局部空间
  • 14.1.3 特权级保护概述
  • 14.2 代码清单14-1
  • 14.3 内核程序的初始化
  • 14.3.1 调用门
  • 14.3.2 调用门的安装和测试
  • 14.4 加载用户程序并创建任务
  • 14.4.1 任务控制块和TCB链
  • 14.4.2 使用栈传递过程参数
  • 14.4.3 加载用户程序
  • 14.4.4 创建局部描述符表
  • 14.4.5 重定位U-SALT表
  • 14.4.6 创建0、1和2特权级的栈
  • 14.4.7 安装LDT描述符到GDT中
  • 14.4.8 任务状态段TSS的格式
  • 14.4.9 创建任务状态段TSS
  • 14.4.10 安装TSS描述符到GDT中
  • 14.4.11 带参数的过程返回指令
  • 14.5 用户程序的执行
  • 14.5.1 通过调用门转移控制的完整过程
  • 14.5.2 进入3特权级的用户程序的执行
  • 14.5.3 检查调用者的请求特权级RPL
  • 14.5.4 在Bochs中调试程序的新方法
  • 本章习题
  • 第15章 任务切换
  • 15.1 本章代码清单
  • 15.2 任务切换前的设置
  • 15.3 任务切换的方法
  • 15.4 用call/jmp/iret指令发起任务切换的实例
  • 15.5 处理器在实施任务切换时的操作
  • 15.6 程序的编译和运行
  • 本章习题
  • 第16章 分页机制和动态页面分配
  • 16.1 分页机制概述
  • 16.1.1 简单的分页模型
  • 16.1.2 页目录、页表和页
  • 16.1.3 地址变换的具体过程
  • 16.2 本章代码清单
  • 16.3 使内核在分页机制下工作
  • 16.3.1 创建内核的页目录表和页表
  • 16.3.2 任务全局空间和局部空间的页面映射
  • 16.4 创建内核任务
  • 16.4.1 内核的虚拟内存分配
  • 16.4.2 页面位映射串和空闲页的查找
  • 16.4.3 创建页表并登记分配的页
  • 16.4.4 创建内核任务的TSS
  • 16.5 用户任务的创建和切换
  • 16.5.1 多段模型和段页式内存管理
  • 16.5.2 平坦模型和用户程序的结构
  • 16.5.3 用户任务的虚拟地址空间分配
  • 16.5.4 用户程序的加载
  • 16.5.5 段描述符的创建(平坦模型)
  • 16.5.6 重定位U-SALT并复制页目录表
  • 16.5.7 切换到用户任务执行
  • 16.6 程序的编译、执行和调试
  • 16.6.1 本章程序的编译和运行方法
  • 16.6.2 察看CR3寄存器的内容
  • 16.6.3 察看线性地址对应的物理页信息
  • 16.6.4 察看当前任务的页表信息
  • 16.6.5 使用线性(虚拟)地址调试程序
  • 本章习题
  • 第17章 中断和异常的处理与抢占式多任务
  • 17.1 中断和异常
  • 17.1.1 中断和异常概述
  • 17.1.2 中断描述符表、中断门和陷阱门
  • 17.1.3 中断和异常处理程序的保护
  • 17.1.4 中断任务
  • 17.1.5 错误代码
  • 17.2 本章代码清单
  • 17.3 内核的加载和初始化
  • 17.3.1 彻底终结多段模型
  • 17.3.2 创建中断描述符表
  • 17.3.3 用定时中断实施任务切换
  • 17.3.4 8259A芯片的初始化
  • 17.3.5 平坦模型下的字符串显示例程
  • 17.4 内核任务的创建
  • 17.4.1 创建内核任务的TCB
  • 17.4.2 宏汇编技术
  • 17.5 用户任务的创建
  • 17.5.1 准备加载用户程序
  • 17.5.2 转换后援缓冲器的刷新
  • 17.5.3 用户任务的创建和初始化
  • 17.6 程序的编译和执行
  • 本章习题
  • 附录Ⅰ 本书用到的x86指令及其页码
  • 附录Ⅱ 本书用到的重要图表及其页码
展开全部

评分及书评

5.0
3个评分

出版方

电子工业出版社

电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。