第1章 Windows汇编语言程序设计基础知识 1
1.1 如何学习Windows汇编语言 1
1.2 Windows汇编语言与DOS汇编语言的区别 1
1.3 二进制数 2
1.3.1 将十进制数转为二进制、八进制和十六进制数 2
1.3.2 不同数制表示法 5
1.3.3 计算机容量的一些计量单位 5
1.3.4 无符号数的表示范围 6
1.3.5 有符号数的表示范围 7
1.3.6 补码 7
1.3.7 数据的二进制存储 9
1.4 汇编语言的基本元素 10
1.4.1 整数常量 10
1.4.2 算术运算符及其优先级 10
1.4.3 实数常量 11
1.4.4 字符常量和字符串常量 11
1.4.5 标识符 11
1.4.6 伪指令 12
1.4.7 指令和标号 13
1.4.8 MASM中的@@标号 13
1.4.9 注释 13
1.4.10 .mode1语句 14
1.4.11 用.386指明使用的指令集 14
1.4.12 节区的定义 15
1.4.13 invoke伪指令 16
1.4.14 续行号 16
1.4.15 wsprintf格式化信息串函数和其他输入输出函数 17
1.4.16 第一个输入输出程序例 18
1.4.17 创建编译链接环境 20
1.4.18 编译链接和运行 20
1.4.19 建立编译链接批命令文件 21
1.4.20 全局变量的定义和初始值 21
1.4.21 局部变量 24
1.4.22 可在程序代码中插入数据 24
1.4.23 等号伪指令 24
1.4.24 EQU伪指令 25
1.4.25 当前地址运算符$ 26
1.4.26 OFFSET、ADDR操作符和LEA指令 27
1.4.27 ALIGN和EVEN伪指令 28
1.4.28 PTR操作符 28
1.4.29 TYPE操作符 29
1.4.30 LENGTHOF操作符 30
1.4.31 SIZEOF或SIZE操作符 31
1.4.32 LABLE伪指令 31
1.4.33 TYPEDEF和TYPEDEF PTR操作符 32
1.4.34 基数控制伪指令RADIX 35
1.4.35 ORG伪指令 35
1.4.36 REPT伪指令 35
1.4.37 ASSUME伪指令 37
1.4.38 SHORT伪指令 37
1.5 高级语法 38
1.5.1 高级语法while-endw 38
1.5.2 条件运算符 39
1.5.3 高级语法repeat-until 40
1.5.4 高级语法if-elseif-endif 42
1.5.5 高级语法continue 43
1.5.6 高级语法break if 44
1.6 结构体 46
1.6.1 结构体的定义 46
1.6.2 定义结构体变量并初始化 47
1.6.3 结构体成员名的使用方法 47
1.6.4 结构体的嵌套定义和使用 50
1.6.5 用EQU定义结构体变量 50
1.6.6 结构体定义例 52
1.7 共用体 53
1.7.1 共用体的定义和使用 53
1.7.2 共用体的嵌套定义 57
1.7.3 共用体和结构体的交叉定义例 58
1.7.4 位结构RECORD和位屏蔽MASK 59
1.8 宏定义和条件汇编伪指令 61
1.8.1 宏定义及使用方法 61
1.8.2 条件汇编伪指令和特殊操作符 63
1.9 过程 65
1.9.1 无参过程的定义 65
1.9.2 无参过程的调用方法 66
1.9.3 有参过程的定义 67
1.9.4 有参过程的调用方法 67
1.9.5 过程中的USES参数 67
1.9.6 过程中的语言类型 68
1.9.7 用PROTO声明过程 69
1.9.8 过程中的值传递和地址传递 69
1.9.9 用堆栈传递参数 71
1.9.10 程序举例 74
1.10 用IDA将过程反汇编 85
1.10.1 ENTER和LEAVE指令 85
1.10.2 ret和retn指令的区别 87
1.10.3 不同类型过程的反汇编 88
1.10.4 过程反汇编规律总结 94
1.10.5 过程反汇编后的修改方法 94
1.10.6 一个完整程序的反汇编 95
1.11 常用数值转换库函数 101
1.12 库函数应用程序举例 102
习题 106
第2章 寄存器和字符串操作指令 110
2.1 80386以上CPU处理器的寄存器 110
2.1.1 32位通用寄存器 110
2.1.2 16位段寄存器 111
2.1.3 32位标志寄存器 112
2.1.4 算术运算影响的标志 114
2.1.5 有符号数和无符号数的转移指令 117
2.1.6 转移指令列表 119
2.1.7 32位程序指针寄存器 119
2.1.8 32位控制寄存器 119
2.1.9 系统地址寄存器 120
2.2 字符串操作指令 120
2.2.1 REP MOVSB的使用方法(递增复制) 121
2.2.2 REP MOVSB的使用方法(递减复制) 123
2.2.3 REP STOSB的使用方法 124
2.2.4 LODSB和STOSB的配合使用 125
2.2.5 SCASB的使用方法 126
2.2.6 CMPSB的使用方法 128
2.2.7 LOOPNZ的使用方法 131
习题 133
第3章 指令详解 135
3.1 普通指令 135
3.2 移位指令 157
3.3 转移指令 161
3.4 特权指令 162
第4章 控制台编程 166
4.1 控制台输入输出函数 166
4.1.1 控制台句柄 166
4.1.2 控制台输出函数 167
4.1.3 控制台输入函数 168
4.2 文件管理 170
4.2.1 CreateFile打开或创建文件 171
4.2.2 WriteFile写文件 172
4.2.3 ReadFile读文件 174
4.2.4 SetFilePointer移动文件指针 175
4.2.5 GetFileSize测试文件大小 178
4.2.6 CreateFileMapping建立内存映射文件 180
4.2.7 MapViewOfFile将内存映射文件中的内容映射到内存 180
4.2.8 GetCL将命令行参数搬入缓冲区 183
4.2.9 FindFirstFile搜索第一个文件 184
4.2.10 FindNextFile搜索下一个文件 184
4.3 直接访问硬盘 186
4.3.1 读硬盘引导扇区 187
4.3.2 读硬盘引导扇区并显示 189
4.4 申请内存 192
4.4.1 GetProcessHeap获取进程当前的默认堆 193
4.4.2 HeapAlloc申请内存 193
4.4.3 HeapFree释放内存 193
第5章 图形界面编程 195
5.1 MessageBox显示信息框并将程序用IDA反汇编 195
5.2 第一个图形界面程序 197
5.3 用IDA将程序反汇编 202
5.4 创建窗口并演示消息 205
5.5 资源文件 209
5.5.1 资源文件程序例 209
5.5.2 资源文件程序例的反汇编 212
5.5.3 菜单资源的使用方法 214
第6章 图形操作 222
6.1 用画笔和刷子绘图 222
6.2 给窗口和按钮画有阴影的外框 228
第7章 将典型C程序反汇编成汇编语言 236
7.1 一重循环的反汇编 236
7.2 二重循环的反汇编 238
7.3 do-while循环的反汇编 239
7.4 while循环的反汇编 240
7.5 if-else的反汇编 241
7.6 switch-case的反汇编 242
7.7 结构体的反汇编 244
7.8 共用体的反汇编 246
7.9 一维数组的反汇编 247
7.10 二维数组的反汇编 248
7.11 静态变量(static)在不同存储区 250
7.12 指针程序的反汇编 252
7.13 二级指针程序的反汇编 254
7.14 函数指针程序的反汇编 257
习题 259
第8章 时钟中断 260
8.1 秒表计时器程序例 261
8.2 秒表计时器程序的反汇编 265
第9章 动态链接库 271
9.1 如何编写动态链接库程序 271
9.2 如何在用户程序中调用动态链接库中的函数 273
第10章 实模式和保护模式内存管理 279
10.1 地址线的根数和寻址范围的关系 279
10.2 实地址模式下的逻辑地址 280
10.3 保护模式 282
10.3.1 保护模式下内存寻址示意图 282
10.3.2 非系统段描述符的格式和含义 283
10.3.3 系统段描述符的格式和含义 286
10.3.4 定义段描述符结构体 287
10.3.5 段描述符结构体使用例 288
10.3.6 描述符表寄存器 289
10.3.7 如何通过全局描述符表寻址 290
10.3.8 如何获取系统全局描述符表 291
10.3.9 访问高端内存程序例 292
10.3.10 局部描述符表 298
10.3.11 门描述符 304
10.3.12 任务状态段TSS 305
10.3.13 用调用门实现越权访问 313
10.3.14 中断描述符表 321
10.3.15 分页管理与映射 328
习题 337
第11章 调试工具Windbg的安装与使用 339
11.1 VMware是什么 339
11.1.1 VMware的安装方法 339
11.1.2 虚拟机安装完后的配置 341
11.2 Windbg的安装方法 343
11.2.1 Windbg快捷键的设置 343
11.2.2 通信端口的配置 343
11.2.3 基本设置 343
11.2.4 Windbg的启动 344
11.3 Windbg的使用方法 346
11.3.1 如何装入可执行程序 346
11.3.2 如何反汇编整个程序 347
11.3.3 如何调试进程 348
11.4 Windbg命令列表 349
11.4.1 显示和设置寄存器R 350
11.4.2 单步跟踪T,TA,TC,WT,P,PA,PC 350
11.4.3 反汇编U,UF 351
11.4.4 断点BP,BU,BM 351
11.4.5 断点管理BL,BD,BE,BC 352
11.4.6 对内存变量的访问设置断点BA 353
11.4.7 列表装载模块名LM 353
11.4.8 切换数制和语法表达式N,.EXPR 354
11.4.9 数据修改E 354
11.4.10 数据查看D 355
11.4.11 显示当前过程所有局部变量名和值DV 355
11.4.12 显示内存变量DT 356
11.4.13 运行到程序尾或断点或指定地址G 357
11.4.14 显示栈信息K 357
11.4.15 显示最近的符号表LN 357
11.4.16 退出Q 357
11.4.17 查找内存S 358
附录A 键盘扫描码和ASCII码表 359
习题答案 361