编辑推荐
全面讲解IA-32结构系列(80x86系列)处理器的32位编程。
新目标:理解系统原理,提升编程技能。
新方法:依托高级语言,讲解低级语言。
新平台:利用虚拟机器,运行示例代码。
内容简介
本书设定新目标,采用新方法,基于新平台,讲解IA��32结构系列(80x86系列)CPU的32位编程。本书分为4个部分: 第一部分利用VC 2010环境的嵌入汇编和目标代码,介绍IA��32系列(80x86系列)CPU的基本功能和32位编程技术; 第二部分利用开源汇编器NASM、开源虚拟机VirtualBox和模拟器Bochs,介绍汇编语言和计算机系统底层输入输出的实现方式; 第三部分详细讲解保护方式编程技术,生动展示保护方式编程细节; 第四部分简要说明相关软件工具的使用。
本书依托高级语言,讲解低级语言;利用虚拟平台,演示系统原理。第一部分和第二部分可作为高校计算机及电子信息类专业学生学习汇编语言的教材,第三部分可作为编程爱好者学习保护方式编程技术的教材或参考书。
目录
第1章基础知识
1.1CPU简介
1.1.1目标代码
1.1.2基本功能
1.2汇编语言概念
1.2.1机器指令
1.2.2汇编格式指令
1.2.3汇编语言及其优缺点
1.3数据的表示和存储
1.3.1数值数据的表示
1.3.2非数值数据的表示
1.3.3基本数据类型
1.3.4数据的存储
习题
第2章IA��32处理器基本功能
2.1IA��32处理器简介
2.1.1IA��32系列处理器
2.1.2保护方式和实地址方式
2.2通用寄存器及使用
2.2.1通用寄存器
2.2.2简单传送指令
2.2.3简单加减指令
2.2.4VC嵌入汇编和实验
2.3标志寄存器及使用
2.3.1标志寄存器
2.3.2状态标志
2.3.3状态标志操作指令
2.3.4带进位加减指令
2.4段寄存器及使用
2.4.1存储器分段
2.4.2逻辑地址
2.4.3段寄存器
2.5寻址方式
2.5.1立即寻址方式和寄存器寻址方式
2.5.232位的存储器寻址方式
2.5.3取有效地址指令
2.6指令指针寄存器和简单控制转移
2.6.1指令指针寄存器
2.6.2常用条件转移指令
2.6.3比较指令和数值大小比较
2.6.4简单的无条件转移指令
2.7堆栈和堆栈操作
2.7.1堆栈
2.7.2堆栈操作指令
习题
第3章程序设计初步
3.1堆栈的作用
3.1.1过程调用和返回指令
3.1.2参数传递
3.1.3局部变量
3.2算术逻辑运算指令
3.2.1乘除运算指令
3.2.2逻辑运算指令
3.2.3移位指令
3.3分支程序设计
3.3.1分支程序设计示例
3.3.2无条件和条件转移指令
3.3.3多路分支的实现
3.4循环程序设计
3.4.1循环程序设计示例
3.4.2循环指令
3.4.3多重循环设计举例
3.5子程序设计
3.5.1子程序设计要点
3.5.2子程序设计举例
3.5.3子程序调用方法
习题
第4章字符串操作和位操作
4.1字符串操作
4.1.1字符串操作指令
4.1.2重复操作前缀
4.1.3应用举例
4.2位操作
4.2.1位操作指令
4.2.2应用举例
4.3条件设置字节指令
4.3.1条件设置字节指令概述
4.3.2应用举例
习题
第5章VC目标代码的阅读理解
5.1汇编语言形式的目标代码
5.1.1基本样式
5.1.2符号化表示
5.2C语言部分编译的解析
5.2.1类型的转换
5.2.2表达式求值
5.2.3指针的本质
5.2.4结构体变量
5.3C++部分功能实现细节
5.3.1引用
5.3.2通过引用传递参数
5.3.3函数重载
5.3.4虚函数
5.4目标程序的优化
5.4.1关于程序优化
5.4.2使大小最小化
5.4.3使速度最大化
5.4.4内存地址对齐
5.5C库函数分析
5.5.1函数strlen
5.5.2函数strpbrk
5.5.3函数memset
5.6C程序的目标代码
5.6.1Base64编码操作
5.6.2源程序
5.6.3目标程序
习题
第6章汇编语言
6.1实方式执行环境
6.1.1寄存器和指令集
6.1.2存储器分段管理
6.1.316位的存储器寻址方式
6.2源程序和语句
6.2.1汇编语言源程序
6.2.2语句及其格式
6.3操作数表示
6.3.1常数
6.3.2数值表达式
6.3.3有效地址
6.3.4数据类型说明
6.4伪指令语句和变量
6.4.1数据定义语句
6.4.2存储单元定义语句
6.4.3常数符号声明语句
6.4.4演示举例
6.5段声明和段间转移
6.5.1段声明语句
6.5.2无条件段间转移指令
6.5.3段间过程调用和返回指令
6.6目标文件和段模式
6.6.1目标文件
6.6.2段模式声明语句
6.7宏
6.7.1宏指令的声明和使用
6.7.2单行宏的声明和使用
6.7.3宏相关方法
习题
第7章BIOS和虚拟机
7.1BIOS及其调用
7.1.1BIOS简介
7.1.2键盘输入和显示输出
7.1.3应用举例
7.2磁盘及其读写
7.2.1磁盘简介
7.2.2磁盘读写
7.2.3主引导记录分析
7.3虚拟机
7.3.1虚拟机工作原理
7.3.2虚拟硬盘文件
7.3.3直接写屏显示方式
7.4一个简易的加载器
7.4.1加载方法
7.4.2程序加载器
7.4.3工作程序示例
习题
第8章输入输出和中断
8.1输入输出的基本概念
8.1.1I/O端口地址
8.1.2I/O指令
8.1.3数据传送方式
8.1.4实时时钟的存取
8.2查询传送方式
8.2.1查询传送流程
8.2.2实时时钟的稳妥存取
8.3中断概述
8.3.1中断的概念
8.3.2中断向量表
8.3.3中断响应过程
8.3.4内部中断
8.3.5外部中断
8.3.6中断优先级和中断嵌套
8.4中断处理程序设计
8.4.1键盘中断处理程序
8.4.2除法出错中断处理程序
8.4.3扩展显示I/O程序
8.4.4时钟显示程序
习题
第9章保护方式程序设计
9.1概述
9.1.1存储器管理
9.1.2特权级设置
9.2分段存储管理机制
9.2.1存储段
9.2.2存储段描述符
9.2.3全局和局部描述符表
9.2.4段选择子
9.2.5逻辑地址到线性地址的转换
9.3存储管理寄存器和控制寄存器
9.3.1存储管理寄存器
9.3.2控制寄存器
9.3.3相关存取指令
9.4实方式与保护方式切换示例
9.4.1实方式和保护方式切换的演示(示例一)
9.4.2不同模式代码段切换的演示(示例二)
9.4.3局部描述符表使用的演示(示例三)
9.5分页存储管理机制
9.5.1存储分页
9.5.2线性地址到物理地址的转换
9.5.3页级保护和虚拟存储器支持
9.5.4分页存储管理机制的演示(示例四)
9.6任务状态段和控制门
9.6.1系统段描述符
9.6.2门描述符
9.6.3任务状态段
9.7控制转移
9.7.1任务内相同特权级的转移
9.7.2相同特权级转移的演示(示例五)
9.7.3任务内不同特权级的变换
9.7.4特权级变换的演示(示例六)
9.7.5任务切换
9.7.6任务切换的演示(示例七)
9.8中断和异常的处理
9.8.1异常概念
9.8.2异常类型
9.8.3中断和异常的处理
9.8.4中断处理的演示(示例八)
9.8.5异常处理的演示(示例九)
9.9保护机制小结
9.9.1转移途径小结
9.9.2特权指令
习题
第10章实验工具的使用
10.1汇编器NASM的使用
10.1.1NASM简介
10.1.2NASM的使用
10.1.3链接器及其使用
10.2虚拟机管理器VirtualBox的使用
10.2.1VirtualBox简介
10.2.2VirtualBox的使用
10.2.3关于硬件加速
10.3模拟器Bochs的使用
10.3.1Bochs简介
10.3.2Bochs的配置与运行
10.3.3控制台调试
10.3.4图形化界面调试
10.4VHDWriter的使用
参考文献
精彩书摘
阅读理解高级语言源程序的目标代码,不仅有助于学习汇编语言程序设计,而且有助于提升高级语言程序设计能力。在介绍VC编译器生成的目标代码文件样式的基础上,本章解析C和C++部分语言功能的实现细节,介绍目标代码优化的相关概念和方法,讨论几个典型库函数的汇编源代码。
5.1汇编语言形式的目标代码
在微软Visual Studio 2010的VC集成开发环境中,可以由C或者C++源程序生成汇编语言形式的目标代码。本节简要介绍这样的目标代码文件的样式。
5.1.1基本样式
首先介绍项目属性页中的配置属性的相关选项值及其使用。
为了便于对比源程序和目标程序,尽量减少由编译器额外增加的指令,所以在项目属性页中的配置属性中采用如下设置。
(1) 在C/C++项下,常规的调试信息格式子项,选择“C7兼容(/Z7)”。
(2) 在C/C++项下,代码生成的基本运行时检查子项,选择“默认值”,既不进行堆栈帧的检查,也不进行未初始化变量的检查。
(3) 在C/C++项下,代码生成的缓冲区安全检查子项,选择“否(/GS-)”。
为了更清楚地观察对库函数的调用,在项目属性页中的配置属性中,在开始的常规项下,项目默认值的MFC的使用子项,选择“在静态库中使用MFC”。
在本章下面的介绍中,如果无特别说明,都采用如上所述的项目属性配置。实际上,在前面几章中所介绍的C语言程序目标代码,几乎都是在上述项目属性的配置下生成的。
在项目属性页的配置属性中,在C/C++项下,输出文件的汇编程序输出子项,如果选择“仅有程序集的列表(/FA)”,那么在编译时将生成扩展名为.asm的汇编语言形式的目标代码文件; 如果选择“带源代码的程序集(/FAs)”,那么在生成的汇编形式的目标代码中,还含有作为注释的高级语言源代码。
在项目属性页的配置属性中,在C/C++项下,优化的优化子项是主要的编译优化选项。如果选择“已禁用(/Od)”,表示不希望任何优化。如果选择“使大小最小化(/O1)”,表示希望目标代码的长度尽量短小。如果选择“使速度最大化(/O2)”,表示希望目标代码的执行速度尽量快。
【例5��1】如下C语言程序dp51是大家熟悉的一个经典程序。
……
前言/序言
随着计算资源的日益丰富和开发环境的日趋完善,直接运用汇编语言编写程序的场合越来越少,因此汇编语言课程需要新定位,汇编语言课程需要新概念。
在这样的背景下,本书设定新的目标,采用新的方法,基于新的平台,讲解IA��32结构系列(80x86系列)CPU的32位编程。学习汇编语言的新目标是深入理解计算机系统的工作原理,全面提升高级语言程序设计能力,而不再是熟练运用汇编语言编写程序。汇编语言课程将起到“上承高级语言,下启机器系统”的桥梁作用。学习汇编语言的新方法是依托高级语言。在学习汇编语言之前,通常已经具备高级语言(C或者C++语言等)程序设计的基础。通过采用嵌入汇编和分析目标代码等方法,不仅可以降低学习和掌握汇编格式指令的难度,而且有助于“知其然,知其所以然”,有助于更好地掌握高级语言。实践汇编语言的新平台是虚拟机。目前虚拟机已经十分流行,它是很理想的“裸机”。基于虚拟机不仅可以突破操作系统的约束,为所欲为地操纵“机器”,从而轻松调试设备驱动程序或者系统程序,而且有助于熟悉计算机系统的启动过程,有助于明了计算机系统硬件和软件的相互关系。
本书分为4个部分,共10章。第一部分由前五章组成,利用VC 2010环境的嵌入汇编和目标代码,讲解IA��32系列(80x86系列)CPU的基本功能和32位编程技术。第1章介绍基础知识; 第2章说明IA��32系列CPU的基本功能; 第3章和第4章讲解利用IA��32系列CPU的指令设计程序; 第5章分析VC源程序的目标代码。第二部分由第6章、第7章和第8章组成,利用汇编器NASM和虚拟机,讲解汇编语言和系统输入输出。第6章基于汇编器NASM介绍汇编语言; 第7章在介绍BIOS和主引导记录之后,说明虚拟机的原理及其使用方法; 第8章基于虚拟机讲解计算机系统底层输入输出的实现方式。第三部分是第9章,详细讲解基于IA��32系列CPU的保护方式程序设计,该章内容十分丰富。第四部分是第10章,简要说明相关工具的使用,包括开源汇编器NASM、开源虚拟机VirtualBox和开源模拟器Bochs等。
本书依托高级语言,讲解低级语言; 利用虚拟平台,演示系统原理。第一部分和第二部分可作为学习汇编语言的教材,第三部分可作为学习保护方式编程技术的教材或参考书。本书还提供教学用PPT。
杨季文撰写第1~4章和第6~9章,朱晓旭撰写第5章,胡沁涵撰写第10章,赵雷参与部分工作。杨季文负责全书统稿、定稿。
本书得到了指导老师钱培德教授的大力支持,在此表示衷心感谢。本书还得到了同事
朱巧明、吕强、李云飞和李培峰
等教授的大力帮助,在此表示感谢。还要感谢同事卢维亮、查伟忠、陈宇和王莉等老师的帮助。
由于编者时间仓促和水平所限,书中难免有不妥之处,恳请读者批评指正。
作者
2017年6月
新概念汇编语言:面向“工程教育认证”计算机系列课程规划教材 内容简介 本书是一部面向“工程教育认证”(EAC)标准而精心规划的计算机系列课程教材,聚焦于汇编语言这一计算机底层核心技术。本书旨在为学子们构建一个扎实、系统且具有前瞻性的汇编语言知识体系,为他们在未来的计算机科学与技术领域深耕细作奠定坚实基础。我们深刻理解工程教育认证对人才培养的严苛要求,因此,本书在内容设计上,不仅强调了知识的深度与广度,更注重培养学生的计算思维、工程实践能力以及解决复杂工程问题的综合素质。 第一章:计算的基石——数制与编码 本章作为汇编语言学习的起点,将带领读者深入理解计算机内部信息是如何表示和处理的。我们将从最基础的数制概念入手,详细讲解二进制、八进制、十进制和十六进制之间的相互转换。这不仅是汇编语言编程的必备技能,更是理解计算机硬件工作原理的关键。随后,本章将深入探讨各种编码方案,包括但不限于ASCII码、BCD码、以及在内存中表示负数的原码、反码和补码。我们将分析不同编码方式的优缺点,以及它们在实际应用中的场景。特别地,我们将强调补码在现代计算机系统中为何成为主流,并结合实例讲解其运算特性。本章内容将通过大量的习题和实际操作,帮助读者建立起对计算机底层数据表示的直观认识,为后续章节的学习扫清障碍。 第二章:指令的语言——汇编指令集概览 本章将正式拉开汇编语言的序幕,介绍现代处理器中最常用的汇编指令集。我们将首先讲解指令的通用结构,包括操作码(Opcode)和操作数(Operand),以及指令的寻址方式,如立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、基址寻址、变址寻址等。通过对这些寻址方式的深入剖析,读者将能够理解CPU如何高效地访问内存中的数据。随后,我们将详细介绍各类指令,包括: 数据传输指令: 如 `MOV`(移动)、`PUSH`(入栈)、`POP`(出栈)等,理解数据如何在寄存器和内存之间进行传递。 算术运算指令: 如 `ADD`(加)、`SUB`(减)、`MUL`(乘)、`DIV`(除)、`INC`(增1)、`DEC`(减1)等,掌握基本的算术运算。 逻辑运算指令: 如 `AND`(按位与)、`OR`(按位或)、`XOR`(按位异或)、`NOT`(按位取反)、`SHL`(左移)、`SHR`(右移)等,理解位级别的逻辑操作。 控制转移指令: 如 `JMP`(无条件跳转)、`JE`(相等跳转)、`JNE`(不相等跳转)、`JG`(大于跳转)、`JL`(小于跳转)等,掌握程序流程的控制。 位操作与标志位: 重点讲解这些指令如何影响CPU的状态标志寄存器(Flags Register),以及如何利用标志位进行条件判断和程序分支。 本章内容将以清晰的图示和简明扼要的文字,帮助读者快速掌握汇编指令的语义和用法。 第三章:CPU的指挥官——寄存器详解 CPU寄存器是CPU内部用于暂存指令、数据和地址的少量高速存储单元,是汇编语言编程的核心。本章将对现代处理器(例如,以x86架构为例)的通用寄存器、段寄存器、标志寄存器和控制寄存器进行深入的讲解。我们将分析每个通用寄存器的用途和特点,例如EAX(累加器)、EBX(基址寄存器)、ECX(计数器)、EDX(数据寄存器)、ESI(源变址寄存器)、EDI(目的变址寄存器)以及ESP(栈顶指针)、EBP(栈基址指针)等。同时,我们将阐述段寄存器(CS, DS, SS, ES, FS, GS)在内存分段管理中的作用,以及标志寄存器(如零标志ZF、进位标志CF、符号标志SF、溢出标志OF等)如何反映指令执行的结果,并作为条件跳转的依据。本章将通过大量的实例,展示如何巧妙地运用寄存器来提高程序的运行效率。 第四章:内存的蓝图——内存寻址与管理 内存是计算机中用于存储程序和数据的主要部件。本章将深入探讨汇编语言中各种复杂的内存寻址模式,包括直接寻址、寄存器间接寻址、基址-变址寻址、基址-变址-偏移量寻址等。我们将详细讲解这些寻址方式在实际编程中的应用,以及它们如何帮助程序员高效地访问和操作内存中的数据。此外,本章还将涉及内存的组织结构,如堆栈(Stack)的原理和操作(`PUSH`和`POP`指令)、内存段的划分与访问控制。我们将通过模拟内存模型,让读者直观地理解数据在内存中的存储方式以及程序如何通过地址找到所需的数据。 第五章:程序结构与流程控制 掌握了基本的指令和内存操作后,本章将引导读者构建完整的程序结构,并实现复杂的流程控制。我们将讲解如何使用子程序(Subroutine)和函数(Function)来组织代码,实现模块化编程,提高代码的可读性和可重用性。通过`CALL`和`RET`指令,读者将理解子程序的调用和返回机制,以及栈在参数传递和局部变量管理中的重要作用。此外,本章将重点讲解汇编语言中的循环结构(如`LOOP`指令、条件跳转实现的循环)和分支结构(如`IF-THEN-ELSE`、`SWITCH`等在汇编层面的实现)。我们将通过设计和实现一些经典的算法,例如排序算法(冒泡排序、选择排序)、查找算法(顺序查找、二分查找)的汇编版本,来巩固这些概念。 第六章:输入输出的桥梁——I/O端口与中断 任何程序都需要与外部世界进行交互,本章将介绍汇编语言如何实现输入输出(I/O)操作。我们将讲解I/O端口的概念,以及如何通过特定的I/O指令(如`IN`和`OUT`)来读写I/O设备。我们将以键盘输入和屏幕输出为例,详细演示I/O端口的工作原理和编程方法。更重要的是,本章将深入探讨中断(Interrupt)机制。我们将讲解中断的概念、中断向量表(IVT)、中断服务程序(ISR)的编写以及中断的类型(如硬件中断、软件中断、异常)。通过理解中断,读者将明白计算机如何响应外部事件,以及中断在实现高效I/O和系统管理中的关键作用。 第七章:数据结构的汇编实现 为了更好地管理和组织复杂数据,本章将引导读者学习如何在汇编语言中实现常见的数据结构。我们将从最基本的一维数组和多维数组的创建与访问开始,讲解如何使用指针和索引来操作这些数据集合。随后,我们将深入探讨链表(Linked List)的汇编实现,包括节点结构的设计、节点的插入、删除和遍历。进一步地,我们将讲解栈(Stack)和队列(Queue)在汇编语言中的构建和操作,理解它们在算法和程序设计中的应用。通过本章的学习,读者将能够灵活地运用汇编语言来处理各种复杂的数据组织形式。 第八章:系统调用与高级编程 虽然汇编语言是底层语言,但它并非孤立存在。本章将介绍汇编语言如何与操作系统进行交互,以及如何调用高级语言的库函数。我们将讲解系统调用(System Call)的概念,以及如何通过特定的系统调用接口(如Linux下的`int 0x80`或`syscall`指令,Windows下的`NtCreateFile`等)来实现文件操作、进程管理等高级功能。此外,我们将演示如何在汇编程序中调用C语言函数,或者在C语言程序中嵌入汇编代码,这对于性能优化和访问底层硬件至关重要。本章将以一个实际项目为例,展示如何利用汇编语言的优势来解决实际工程问题。 第九章:嵌入式系统与性能优化 汇编语言在嵌入式系统开发中扮演着不可或缺的角色,因为其直接的硬件控制能力和极高的执行效率。本章将介绍汇编语言在微控制器、嵌入式设备等领域的应用。我们将探讨如何利用汇编语言来编写驱动程序、实现实时控制、以及进行性能关键部分的优化。我们将通过分析一些典型的嵌入式场景,如实时操作系统(RTOS)的任务调度、传感器数据采集的低延迟处理等,来展示汇编语言在提高系统性能、降低功耗方面的独特优势。 第十章:现代计算机体系结构与汇编的演进 本章将放眼更广阔的计算机体系结构,探讨汇编语言在不同指令集架构(ISA)下的特点和差异。我们将简要介绍RISC(精简指令集计算机)和CISC(复杂指令集计算机)的理念,并对比不同体系结构(如ARM、MIPS)的汇编语言。此外,我们将讨论现代CPU的流水线、缓存、超线程等技术如何影响汇编程序的性能,以及如何编写能够充分利用这些硬件特性的汇编代码。最后,本章将对汇编语言的未来发展趋势进行展望,探讨其在人工智能、高性能计算等新兴领域的潜在应用。 工程教育认证的特色融入 本书在内容编排和习题设计上,充分体现了工程教育认证对学生能力培养的要求。每章结尾都设有“思考与实践”环节,包含以下几个方面: 理论巩固题: 检验学生对本章核心概念的理解。 编程实践题: 要求学生独立完成汇编语言编程任务,从简单的指令应用到复杂的程序设计,逐步提升编程能力。 问题分析与设计: 引导学生分析实际工程问题,并尝试用汇编语言进行建模和解决方案设计,培养解决复杂工程问题的能力。 代码优化与性能分析: 鼓励学生思考如何优化汇编代码,提高运行效率,培养工程实践中的成本意识和效率意识。 实验项目: 结合实际硬件平台(如开发板),设计一系列实验项目,让学生亲手操作,体验汇编语言的实际应用,培养动手能力和工程实践能力。 本书的目标是培养出具备扎实底层计算理论基础、优秀的编程能力、以及能够独立分析和解决复杂工程问题的计算机专业人才,为他们未来在各个计算机相关领域的发展提供坚实的支撑,并使其能够顺利通过工程教育认证的各项评估。