本书共分为9章,具体介绍了汇编语言基础知识、Win32汇编语言基本组成、Win32汇编语言的编译运行、CPU指令系统、FPU指令系统、选择结构程序设计、循环结构程序设计、模块化程序设计和吾爱破解软件使用简介等内容。先详细介绍了汇编语言程序设计中要用到的相关理论基础和计算机的组成与工作原理,如数值与字符的表示方法、存储体系结构与工作原理等;再全面介绍了32位CPU指令与浮点指令;最后详尽介绍了汇编语言程序设计的方法,使读者可以把更多的精力用于汇编的程序设计上。本书力争做到,初学者用C语言能实现的功能,用本书的32位汇编语言也能实现。
本书所有例子的源程序都是完整的,并有详细的注释,且都能在Windows XP和Windows 7环境上编译运行通过,特别适合初学者。本书有配套的考试系统和相应的题库,既可作为测评的标准化试题(单项选择题、多项选择题、判断题和填空题),又可作为测评的程序设计题(程序改错题、程序填空题和程序设计题),可按程序功能要求进行测评,也可按标准答案源程序的相似度进行模糊测评。
本书可作为应用型本科院校计算机类专业《Win32汇编语言程序设计》的教材,也可作为《计算机组成原理与汇编语言(Win32)》的教材,适合既要求有一定理论知识,又要求突出实践的院校,尤其适合强调提高编程能力的院校和读者。
随着计算机技术的发展,学生要学习的课程越来越多,每门课的学时越来越少,而汇编语言从16位过渡到32位,指令越来越多,如何在有限的时间里学到尽可能多的知识,特别是如何提高汇编语言的编程能力,压力越来越大。于是,本书作者结合多年的教学与软件开发的经验,编写了本书。
本书虽详尽介绍了CPU指令和FPU指令等,但在实际程序设计过程中,往往可能只需要掌握其中20%的指令,就能解决现实工作中80%的问题,而剩余20%的问题,可以根据具体的需要,查阅具体的指令;其中的案例也是作者根据多年教学经验归纳、总结、设计的,文字表述也是经过再三斟酌的,插图也是经过专门加工的。
随着计算机技术的发展,学生要学习的课程越来越多,每门课的学时越来越少,而汇编语言从16位过渡到32位,指令越来越多,如何在有限的时间里学到尽可能多的知识,特别是如何提高汇编语言的编程能力,压力越来越大。于是,我们结合多年的教学与软件开发的经验,编写了本书。
本书虽详尽介绍了CPU指令和FPU指令等,但并不是每条指令都需要掌握,因为实际程序设计过程中,往往可能只需要掌握其中20%的指令,就能解决现实工作中80%的问题,而剩余20%的问题,可以根据具体的需要,查阅具体的指令。因此,在教学过程中,可根据具体的情况,选修相关内容。
作者建议,本书按12个主题进行教与学,每个主题讲授与训练约3个学时,课堂测试与讲评约1个学时,合计48学时。
序 号 主 题 主 要 内 容
1 数据类型 Win32汇编语言程序结构基本组成,各种数据类型数据的定义与输入输出
2 MASM整数+-*/% 简单整数数据传送指令,整数的加减乘除余,实现整数表达式的计算
3 MASM实数+-*/ 浮点数数据传送指令,浮点数的加减乘除,实现浮点数表达式的计算
4 MASM函数 算术指令,如FSQRT、FSIN、FCOS、FABS等函数的使用
5 选择结构 实现整数(含字符)大小和浮点数大小的比较
6 循环结构 .while和.repeat循环及LOOP循环指令,实现各种循环重复操作
7 C嵌入汇编 串操作指令结合C嵌入汇编,在C中实现各种字符串功能
8 子程序(函数) 子程序(函数)的定义与调用,实现模块化程序设计
9 递归程序设计 汇编实现递归程序设计及C与汇编相互调用、函数重载
10 软件破解 OD实现逆向工程,破解其他开发工具生成的.exe文件的登录密码
11 浮点数表示 计算机浮点数的表示等,实现浮点数与机器码的相互转换,其他编码转换
12 CPU与存储器连接 32位CPU体系结构、存储访问工作原理等
通过以上12讲的教学,学生在48学时下就能具有比较强的汇编编程能力,又能初步了解计算机 的组成与工作原理,因此,本教材也可作为《计算机组成原理与汇编语言(Win32)》的教材。
本书由田民格担任主编,秦彩杰、吕良智担任副主编。其中秦彩杰编写第1、2、3章,田民格编写第4、5、6章,吕良智编写第7、8、9章和附录。
本书配套的电子课件和源程序等资料可登录作者的FTP下载,网址为FTP://218.5. 241.13,用户名为tmg,密码为123456。本书资料在masm文件夹中,其中“组成与汇编单机版.rar”是本书单机版考试系统,根目录下的ksxt.exe是本书网络版考试系统。
为使本书篇幅不致过长,其中的案例是根据作者多年教学经验归纳、总结、设计的,文字表述也是经过再三斟酌的,插图也是经过专门加工的。在使用本书的过程中,若发现有任何问题,可与作者进行沟通联系,以使本书臻于完善。作者E-mail为TmgDelphi@163.com。
编 者
第1章 汇编语言基础知识 1
1.1 计数制 1
1.1.1 十进制(Decimal) 1
1.1.2 二进制(Binary) 1
1.1.3 八进制(Octal) 2
1.1.4 十六进制(HexaDecimal) 2
1.2 进制数间的转换 3
1.2.1 十进制转二进制 3
1.2.2 十进制转八进制和十六进制 4
1.2.3 十进制转二进制加法口算方法 4
1.2.4 十进制转二进制减法口算方法 5
1.2.5 十进制转二进制其他口算方法 6
1.3 计算机计量单位 6
1.3.1 计算机存储容量计量单位 6
1.3.2 计算机时钟周期计量单位 6
1.4 数值数据的表示 7
1.4.1 无符号整数的表示 7
1.4.2 有符号整数的表示 7
1.4.3 移码 8
1.4.4 BCD码 9
1.4.5 浮点数 9
1.5 字符数据的表示 12
1.5.1 ASCII码 12
1.5.2 机内码 12
1.5.3 Unicode 13
1.5.4 UTF-8 14
习题1 14
第2章 Win32汇编语言基本组成 16
2.1 程序结构 16
2.1.1 处理器选择伪指令 17
2.1.2 .model伪指令 18
2.1.3 指明是否区分大小写 18
2.1.4 要引用的头文件和库文件 18
2.1.5 函数原型PROTO声明 19
2.1.6 函数原型EXTRN声明 19
2.1.7 变量的定义及使用 20
2.1.8 数据段和代码段的定义 21
2.1.9 注释 22
2.1.10 指令、标号和分行 22
2.1.11 invoke伪指令调用函数 23
2.1.12 Call指令调用函数 23
2.1.13 函数调用返回值 24
2.1.14 函数的定义 24
2.1.15 局部变量的定义 26
2.1.16 程序结束 27
2.1.17 汇编结束 27
2.2 数据类型 27
2.2.1 整数 27
2.2.2 整数常量表达式 28
2.2.3 浮点数 30
2.2.4 字符和字符串 33
2.2.5 结构体 34
习题2 36
第3章 Win32汇编语言的编译运行 40
3.1 配置编译链接环境 40
3.1.1 配置VC6.0环境 41
3.1.2 MASM32的安装 41
3.1.3 配置MASM32环境 44
3.1.4 通过注册表配置VC和MASM32环境 44
3.2 命令提示符下编译链接和运行 44
3.3 VC环境下编译链接和运行 46
3.4 C/C++嵌入汇编指令 48
3.4.1 汇编指令访问C整型变量 48
3.4.2 汇编指令读取C整型数组元素 49
3.4.3 汇编指令写入C字符数组 50
3.5 C程序反汇编生成汇编源程序 51
3.5.1 C程序编译时生成汇编语言源程序 51
3.5.2 修改C程序反汇编生成的汇编源程序 52
习题3 55
第4章 CPU指令系统 57
4.1 系统结构 58
4.2 80386微处理器结构 59
4.3 CPU寄存器 61
4.3.1 16位寄存器组 61
4.3.2 32位寄存器组 61
4.3.3 标志寄存器EFlags 62
4.4 80X86处理器工作模式 64
4.5 存储器 65
4.6 操作数寻址方式 67
4.7 数据传送类指令 71
4.7.1 通用数据传送MOV/MOV[SZ]X 71
4.7.2 数据交换XCHG 73
4.7.3 字节查表转换XLAT[B] 75
4.7.4 字节反向存储BSWAP 76
4.7.5 入栈PUSH/PUSHA[D] 76
4.7.6 出栈POP/POPA[D] 77
4.7.7 取地址LEA/L[DEFGS]S 77
4.7.8 EFlags低8位与AH传送LAHF/SAHF 78
4.7.9 EFlags出入栈PUSHF[D]/POPF[D] 79
4.7.10 进位位CF操作CLC/STC/CMC 79
4.7.11 方向位DF操作CLD/STD 79
4.7.12 中断允许位IF操作CLI/STI 79
4.8 整数算术运算指令 79
4.8.1 加法ADD/ADC/INC/XADD 80
4.8.2 减法SUB/SBB/DEC/NEG 82
4.8.3 乘法MUL/IMUL 82
4.8.4 除法DIV/IDIV 83
4.8.5 符号扩展CBW/CWD/CDQ 85
4.8.6 整数比较CMP/CMPXCHG[8B] 86
4.9 调整指令(实现大数运算) 87
4.9.1 数字字符加法调整AAA 87
4.9.2 数字字符减法调整AAS 89
4.9.3 二进制编码调整为BCD码AAM 90
4.9.4 BCD码调整为二进制编码AAD 90
4.9.5 BCD码加法调整DAA 91
4.9.6 BCD码减法调整DAS 92
4.10 逻辑运算指令 93
4.10.1 逻辑与操作AND 93
4.10.2 逻辑或操作OR 94
4.10.3 逻辑非操作NOT 94
4.10.4 逻辑异或操作XOR 94
4.10.5 逻辑比较测试TEST 95
4.11 位操作指令 96
4.11.1 算术移位SAL/SAR 96
4.11.2 逻辑移位SHL/SHR 97
4.11.3 双精度移位SHLD/SHRD 98
4.11.4 不带进位循环移位ROL/ROR 100
4.11.5 带进位循环移位RCL/RCR 100
4.11.6 位扫描BSF/BSR 101
4.11.7 第i位操作BT[CRS] 103
4.12 串操作指令 104
4.12.1 重复串操作REP[E|Z|NE|NZ] 105
4.12.2 移串操作MOVS[B|W|D] 106
4.12.3 取串操作LODS[B|W|D] 108
4.12.4 存串操作STOS[B|W|D] 109
4.12.5 输入串操作INS[B|W|D] 110
4.12.6 输出串操作OUTS[B|W|D] 111
4.12.7 串扫描操作SCAS[B|W|D] 111
4.12.8 串比较操作CMPS[B|W|D] 112
4.13 CPU控制指令 114
4.13.1 空操作指令NOP 114
4.13.2 等待指令WAIT 115
4.13.3 暂停指令HLT 115
4.13.4 封锁数据指令LOCK 115
4.13.5 获得CPU信息CPUID 115
4.13.6 读时间戳计数器RDTSC 116
习题4 117
第1章
汇编语言基础知识
本章主要介绍数值数据和字符数据在计算机内部的表示方法,包括各种进制数及相关计量单位;数值数据详细介绍整数和浮点数(实数)的表示方法及显示方法,字符数据详细介绍ASCII码、机内码、Unicode编码和UTF-8编码的表示方法及显示方法。通过本章的学习,读者应该完成以下学习目标:
(1)掌握十进制、二进制、十六进制的表示方法及其相互转换方法。
(2)了解八进制和二进制口算方法。
(3)掌握无符号整数和有符号整数的表示方法。
(4)掌握移码的表示方法以及了解BCD码的表示方法。
(5)掌握浮点数(实数)的表示方法。
(6)了解ASCII码常用字符的编码规律。
(7)了解机内码和区位码的编码规律及其相互转换方法。
(8)了解Unicode和UTF-8的编码规律及其相互转换方法。
1.1 计 数 制
1.1.1 十进制(Decimal)
十进制用0~9共10个数码来表示,其基数为10,运算规则为逢十进一,各位权是10i(整数部分最低位位权为100,其余各位位权从右至左指数依次增大;小数部分最高位位权为10-1,其余各位位权从左至右指数依次减小),十进制数后缀字母为D,一般省略,n位整数m位小数十进制数N表示如下:
N=an-1an-2…a0.a-1…a-mD
=an-1×10n-1+an-2×10n-2+…+a0×100+a-1×10-1+…+a-m×10-m
例如:
N=325.46D
=3×102+2×101+5×100+4×10-1+6×10-2
=325.46
1.1.2 二进制(Binary)
二进制用0和1两个数码来表示,其基数为2,运算规则为逢二进一,各位权是2i,二进制数后缀字母为B,n位整数m位小数的二进制数N表示如下:
N=an-1an-2…a0.a-1…a-mB
=an-1×2n-1+an-2×2n-2+…+a0×20+a-1×2-1+…+a-m×2-m
例如:
N=10111101.11B
=1×27+0×26+1×25+1×24+1×23+1×22+0×21+1×20+1×2-1+1×2-2
=1×128+0×64+1×32+1×16+1×8+1×4+0×2+1×1+1×0.5+1×0.25
=189.75
……