关于我们
书单推荐
新书推荐
|
汇编语言:基于x86处理器(原书第8版) 读者对象:读者对象:1. 高校电子和计算机工程专业的教师和学生。 2. 嵌入式、物联网等领域的研发人员。 3. 工业实时控制领域的工程师。
本书专门为Intel/Windows/DOS平台编写,对汇编语言进行了完整且详细的研究和讲解,教授读者在机器级编写和调试程序。第1~9章包含汇编语言的基本概念、x86处理器架构、汇编语言基础、过程等核心概念,后续章节讲解了结构和宏、MS-Windows编程、浮点数处理和指令编码等内容。本书不仅可作为汇编语言课程的教材,还可以作为计算机系统基础和体系结构基础方面的教材,符合国内所提倡的系统观教学理念。书中不仅讲授具体问题的解决方案,而且注重帮助学生举一反三,综合应用,学到的编程理念能顺利应用于其他编程的课程中。
译者序
前言 关于作者 相关码表 第1章 基本概念 1 1.1 欢迎来到汇编语言的世界 1 1.1.1 读者可能会问的问题 2 1.1.2 汇编语言的应用 4 1.1.3 本节回顾 5 1.2 虚拟机概念 5 1.2.1 本节回顾 6 1.3 数据表示 7 1.3.1 二进制整数 7 1.3.2 二进制加法 9 1.3.3 整数存储大小 9 1.3.4 十六进制整数 10 1.3.5 十六进制加法 11 1.3.6 有符号二进制整数 12 1.3.7 二进制减法 14 1.3.8 字符存储 14 1.3.9 二进制编码的十进制数 16 1.3.10 本节回顾 16 1.4 布尔表达式 17 1.4.1 布尔函数的真值表 18 1.4.2 本节回顾 19 1.5 本章小结 20 1.6 关键术语 20 1.7 复习题和练习 21 1.7.1 简答题 21 1.7.2 算法题 22 第2章 x86处理器架构 23 2.1 一般概念 23 2.1.1 基本微机设计 23 2.1.2 指令执行周期 24 2.1.3 读取内存 25 2.1.4 加载并执行程序 26 2.1.5 本节回顾 27 2.2 32位x86处理器 27 2.2.1 操作模式 27 2.2.2 基本执行环境 28 2.2.3 x86内存管理 30 2.2.4 本节回顾 31 2.3 64位x86-64处理器 31 2.3.1 64位操作模式 32 2.3.2 基本的64位执行环境 32 2.3.3 本节回顾 33 2.4 典型x86计算机的组件 33 2.4.1 母板 33 2.4.2 内存 35 2.4.3 本节回顾 35 2.5 输入/输出系统 36 2.5.1 I/O访问层次 36 2.5.2 本节回顾 38 2.6 本章小结 38 2.7 关键术语 39 2.8 复习题 40 第3章 汇编语言基础 41 3.1 基本语言元素 41 3.1.1 第一个汇编语言程序 41 3.1.2 整数字面量 42 3.1.3 常整数表达式 43 3.1.4 实数字面量 43 3.1.5 字符字面量 44 3.1.6 字符串字面量 44 3.1.7 保留字 44 3.1.8 标识符 45 3.1.9 伪指令 45 3.1.10 指令 46 3.1.11 本节回顾 48 3.2 示例:整数加减法 48 3.2.1 AddTwo程序 48 3.2.2 运行和调试AddTwo程序 50 3.2.3 程序模板 54 3.2.4 本节回顾 54 3.3 汇编、链接和运行程序 55 3.3.1 汇编–链接–执行周期 55 3.3.2 列表文件 55 3.3.3 本节回顾 57 3.4 定义数据 57 3.4.1 内部数据类型 57 3.4.2 数据定义语句 58 3.4.3 向AddTwo程序添加一个变量 58 3.4.4 定义BYTE和SBYTE数据 59 3.4.5 定义WORD和SWORD数据 61 3.4.6 定义DWORD和SDWORD数据 61 3.4.7 定义QWORD数据 62 3.4.8 定义压缩的BCD(TBYTE)数据 62 3.4.9 定义浮点类型 62 3.4.10 变量相加程序 63 3.4.11 小端序 64 3.4.12 声明未初始化数据 64 3.4.13 本节回顾 65 3.5 符号常量 65 3.5.1 等号伪指令 66 3.5.2 计算数组和字符串的大小 67 3.5.3 EQU伪指令 68 3.5.4 TEXTEQU伪指令 68 3.5.5 本节回顾 69 3.6 64位编程介绍 70 3.7 本章小结 71 3.8 关键术语 72 3.8.1 术语 72 3.8.2 指令、操作符及伪指令 72 3.9 复习题和练习 73 3.9.1 简答题 73 3.9.2 算法题 73 3.10 编程练习 74 第4章 数据传送、寻址及算术运算 75 4.1 数据传送指令 75 4.1.1 引言 75 4.1.2 操作数类型 75 4.1.3 直接内存操作数 76 4.1.4 MOV指令 77 4.1.5 整数的零/符号扩展 78 4.1.6 LAHF和SAHF指令 79 4.1.7 XCHG指令 80 4.1.8 直接–偏移量操作数 80 4.1.9 传送数据的示例 81 4.1.10 本节回顾 83 4.2 加法和减法 84 4.2.1 INC和DEC指令 84 4.2.2 ADD指令 84 4.2.3 SUB指令 85 4.2.4 NEG指令 85 4.2.5 实现算术表达式 85 4.2.6 加减法影响的标志 86 4.2.7 示例程序(AddSubTest) 88 4.2.8 本节回顾 89 4.3 与数据相关的操作符和伪指令 90 4.3.1 OFFSET操作符 90 4.3.2 ALIGN伪指令 91 4.3.3 PTR操作符 92 4.3.4 TYPE操作符 92 4.3.5 LENGTHOF操作符 93 4.3.6 SIZEOF操作符 93 4.3.7 LABEL伪指令 94 4.3.8 本节回顾 94 4.4 间接寻址 94 4.4.1 间接操作数 94 4.4.2 数组 95 4.4.3 变址操作数 96 4.4.4 指针 97 4.4.5 本节回顾 99 4.5 JMP和LOOP指令 100 4.5.1 JMP指令 100 4.5.2 LOOP指令 101 4.5.3 在Visual Studio调试器中显示数组 102 4.5.4 整数数组求和 103 4.5.5 复制字符串 103 4.5.6 本节回顾 104 4.6 64位编程 105 4.6.1 MOV指令 105 4.6.2 64位版本的SumArray程序 105 4.6.3 加法和减法 106 4.6.4 本节回顾 107 4.7 本章小结 107 4.8 关键术语 109 4.8.1 术语 109 4.8.2 指令、操作符及伪指令 109 4.9 复习题和练习 109 4.9.1 简答题 109 4.9.2 算法题 111 4.10 编程练习 112 第5章 过程 113 5.1 堆栈操作 113 5.1.1 运行时堆栈(32位模式) 113 5.1.2 PUSH和POP指令 115 5.1.3 本节回顾 118 5.2 定义和使用过程 118 5.2.1 PROC伪指令 118 5.2.2 CALL和RET指令 120 5.2.3 嵌套过程调用 120 5.2.4 向过程传递寄存器参数 121 5.2.5 示例:整数数组求和 122 5.2.6 保存和恢复寄存器 123 5.2.7 本节回顾 124 5.3 链接到外部库 124 5.3.1 背景信息 125 5.3.2 本节回顾 125 5.4 Irvine32库 126 5.4.1 创建库的动机 126 5.4.2 Win32控制台窗口 127 5.4.3 各个过程的描述 128 5.4.4 库测试程序 138 5.4.5 本节回顾 144 5.5 64位汇编编程 145 5.5.1 Irvine64库 145 5.5.2 调用64位子例程 145 5.5.3 x64调用规约 146 5.5.4 调用过程的示例程序 146 5.5.5 本节回顾 147 5.6 本章小结 148 5.7 关键术语 149 5.7.1 术语 149 5.7.2 指令、操作符及伪指令 149 5.8 复习题和练习 149 5.8.1 简答题 149 5.8.2 算法题 151 5.9 编程练习 152 第6章 条件处理 154 6.1 布尔和比较指令 154 6.1.1 CPU状态标志 154 6.1.2 AND指令 155 6.1.3 OR指令 156 6.1.4 位映射集 157 6.1.5 XOR指令 158 6.1.6 NOT指令 159 6.1.7 TEST指令 159 6.1.8 CMP指令 160 6.1.9 置位和清零各个CPU标志 161 6.1.10 64位模式下的布尔指令 161 6.1.11 本节回顾 161 6.2 条件跳转 162 6.2.1 条件结构 162 6.2.2 Jcond指令 162 6.2.3 条件跳转指令的类型 163 6.2.4 条件跳转应用 166 6.2.5 本节回顾 169 6.3 条件循环指令 170 6.3.1 LOOPZ和LOOPE指令 170 6.3.2 LOOPNZ和LOOPNE指令 170 6.3.3 本节回顾 171 6.4 条件结构 171 6.4.1 块结构的IF语句 171 6.4.2 复合表达式 175 6.4.3 WHILE循环 176 6.4.4 表驱动的选择 178 6.4.5 本节回顾 180 6.5 应用:有限状态机 181 6.5.1 验证输入字符串 181 6.5.2 验证有符号整数 182 6.5.3 本节回顾 185 6.6 条件控制流伪指令(可选主题) 186 6.6.1 创建IF语句 186 6.6.2 有符号数和无符号数的比较 188 6.6.3 复合表达式 189 6.6.4 用.REPEAT和.WHILE创建循环 191 6.7 本章小结 192 6.8 关键术语 193 6.8.1 术语 193 6.8.2 指令、操作符及伪指令 193 6.9 复习题和练习 194 6.9.1 简答题 194 6.9.2 算法题 195 6.10 编程练习 196 6.10.1 对代码测试的建议 196 6.10.2 习题描述 197 第7章 整数算术运算 200 7.1 移位和循环移位指令 200 7.1.1 逻辑移位和算术移位 200 7.1.2 SHL指令 201 7.1.3 SHR指令 202 7.1.4 SAL和SAR指令 202 7.1.5 ROL指令 203 7.1.6 ROR指令 204 7.1.7 RCL和RCR指令 204 7.1.8 有符号数溢出 205 7.1.9 SHLD/SHRD指令 205 7.1.10 本节回顾 207 7.2 移位和循环移位的应用 207 7.2.1 多个双字的移位 208 7.2.2 通过移位做乘法 208 7.2.3 显示二进制位 209 7.2.4 提取文件日期字段 210 7.2.5 本节回顾 210 7.3 乘法和除法指令 212 7.3.1 无符号整数乘法(MUL) 212 7.3.2 有符号整数乘法(IMUL) 213 7.3.3 测量程序执行时间 216 7.3.4 无符号整数除法(DIV) 217 7.3.5 有符号整数除法(IDIV) 219 7.3.6 实现算术表达式 222 7.3.7 本节回顾 224 7.4 扩展的加减法 225 7.4.1 ADC指令 225 7.4.2 扩展加法的示例 225 7.4.3 SBB指令 227 7.4.4 本节回顾 228 7.5 ASCII和非压缩十进制算术运算 228 7.5.1 AAA指令 229 7.5.2 AAS指令 230 7.5.3 AAM指令 231 7.5.4 AAD指令 231 7.5.5 本节回顾 231 7.6 压缩十进制的算术运算 232 7.6.1 DAA指令 232 7.6.2 DAS指令 233 7.6.3 本节回顾 233 7.7 本章小结 234 7.8 关键术语 235 7.8.1 术语 235 7.8.2 指令、操作符及伪指令 235 7.9 复习题和练习 235 7.9.1 简答题 235 7.9.2 算法题 237 7.10 编程练习 237 第8章 高级过程 240 8.1 引言 240 8.2 堆栈帧 240 8.2.1 堆栈参数 240 8.2.2 寄存器参数的缺点 241 8.2.3 访问堆栈参数 243 8.2.4 32位调用规约 245 8.2.5 局部变量 246 8.2.6 引用参数 247 8.2.7 LEA指令 248 8.2.8 ENTER和LEAVE指令 249 8.2.9 LOCAL伪指令 250 8.2.10 Microsoft x64调用规约 251 8.2.11 本节回顾 252 8.3 递归 252 8.3.1 递归求和 253 8.3.2 计算阶乘 254 8.3.3 本节回顾 258 8.4 INVOKE、ADDR、PROC及PROTO 259 8.4.1 INVOKE伪指令 259 8.4.2 ADDR操作符 260 8.4.3 PROC伪指令 260 8.4.4 PROTO伪指令 263 8.4.5 参数分类 266 8.4.6 示例:交换两个整数 266 8.4.7 调试提示 267 8.4.8 WriteStackFrame过程 267 8.4.9 本节回顾 268 8.5 创建多模块程序 269 8.5.1 隐藏和导出过程名 269 8.5.2 调用外部过程 269 8.5.3 跨模块使用变量和符号 270 8.5.4 示例:ArraySum程序 271 8.5.5 用Extern创建模块 271 8.5.6 用INVOKE和PROTO创建模块 274 8.5.7 本节回顾 277 8.6 参数的高级用法(可选主题) 277 8.6.1 受USES操作符影响的堆栈 277 8.6.2 向堆栈传递8位和16位参数 278 8.6.3 传递64位参数 279 8.6.4 非双字局部变量 280 8.7 Java字节码(可选主题) 281 8.7.1 Java虚拟机 281 8.7.2 指令集 282 8.7.3 Java反汇编示例 283 8.7.4 示例:条件分支 285 8.8 本章小结 287 8.9 关键术语 288 8.9.1 术语 288 8.9.2 指令、操作符及伪指令 288 8.10 复习题和练习 288 8.10.1 简答题 288 8.10.2 算法题 289 8.11 编程练习 289 第9章 字符串和数组 291 9.1 引言 291 9.2 字符串原语指令 291 9.2.1 MOVSB、MOVSW及MOVSD 292 9.2.2 CMPSB、CMPSW及CMPSD 293 9.2.3 SCASB、SCASW及SCASD 293 9.2.4 STOSB、STOSW及STOSD 294 9.2.5 LODSB、LODSW及LODSD 294 9.2.6 本节回顾 294 9.3 若干字符串过程 295 9.3.1 Str_compare过程 295 9.3.2 Str_length过程 296 9.3.3 Str_copy过程 297 9.3.4 Str_trim过程 297 9.3.5 Str_ucase过程 299 9.3.6 字符串库演示程序 300 9.3.7 Irvine64库中的字符串过程 301 9.3.8 本节回顾 304 9.4 二维数组 304 9.4.1 行列顺序 304 9.4.2 基址–变址操作数 305 9.4.3 基址–变址–位移操作数 306 9.4.4 64位模式下的基址–变址操作数 307 9.4.5 本节回顾 308 9.5 整数数组的查找和排序 308 9.5.1 冒泡排序 309 9.5.2 对半查找 310 9.5.3 本节回顾 315 9.6 Java字节码:字符串处理(可选主题) 315 9.7 本章小结 316 9.8 关键术语和指令 317 9.9 复习题和练习 317 9.9.1 简答题 317 9.9.2 算法题 318 9.10 编程练习 318 第10章 结构和宏 322 10.1 结构 322 10.1.1 定义结构 322 10.1.2 声明结构对象 323 10.1.3 引用结构对象 324 10.1.4 示例:显示系统时间 327 10.1.5 结构包含结构 329 10.1.6 示例:醉汉行走 329 10.1.7 声明和使用联合 332 10.1.8 本节回顾 334 10.2 宏 334 10.2.1 概述 334 10.2.2 定义宏 335 10.2.3 调用宏 336 10.2.4 其他宏特性 337 10.2.5 使用本书的宏库(仅32位模式) 340 10.2.6 示例程序:封装器 345 10.2.7 本节回顾 346 10.3 条件汇编伪指令 347 10.3.1 检查缺失的参数 347 10.3.2 默认参数初始化值 348 10.3.3 布尔表达式 348 10.3.4 IF、ELSE及ENDIF伪指令 349 10.3.5 IFIDN和IFIDNI伪指令 349 10.3.6 示例:矩阵行求和 350 10.3.7 特殊操作符 353 10.3.8 宏函数 356 10.3.9 本节回顾 357 10.4 定义重复语句块 357 10.4.1 WHILE伪指令 358 10.4.2 REPEAT伪指令 358 10.4.3 FOR伪指令 358 10.4.4 FORC伪指令 359 10.4.5 示例:链表 360 10.4.6 本节回顾 361 10.5 本章小结 362 10.6 关键术语 363 10.6.1 术语 363 10.6.2 操作符及伪指令 363 10.7 复习题和练习 364 10.7.1 简答题 364 10.7.2 算法题 364 10.8 编程练习 366 第11章 MS-Windows编程 368 11.1 Win32控制台编程 368 11.1.1 背景信息 368 11.1.2 Win32控制台函数 371 11.1.3 显示消息框 373 11.1.4 控制台输入 375 11.1.5 控制台输出 380 11.1.6 读写文件 382 11.1.7 Irvine32库中的文件I/O 385 11.1.8 测试文件I/O过程 386 11.1.9 控制台窗口操作 389 11.1.10 控制光标 392 11.1.11 控制文本颜色 392 11.1.12 时间和日期函数 394 11.1.13 使用64位Windows API 397 11.1.14 本节回顾 398 11.2 编写图形化的Windows应用程序 398 11.2.1 必要的结构 399 11.2.2 MessageBox函数 400 11.2.3 WinMain过程 400 11.2.4 WinProc过程 401 11.2.5 ErrorHandler过程 401 11.2.6 程序清单 402 11.2.7 本节回顾 405 11.3 动态内存分配 405 11.3.1 HeapTest程序 408 11.3.2 本节回顾 411 11.4 32位x86存储管理 411 11.4.1 线性地址 412 11.4.2 页转换 414 11.4.3 本节回顾 416 11.5 本章小结 416 11.6 关键术语 417 11.7 复习题和练习 417 11.7.1 简答题 417 11.7.2 算法题 418 11.8 编程练习 418 第12章 浮点数处理和指令编码 420 12.1 浮点数的二进制表示 420 12.1.1 IEEE二进制浮点数表示 420 12.1.2 阶数 421 12.1.3 规格化二进制浮点数 422 12.1.4 创建IEEE表示 422 12.1.5 将十进制分数转换为二进制实数 424 12.1.6 本节回顾 425 12.2 浮点单元 425 12.2.1 FPU寄存器栈 426 12.2.2 舍入 428 12.2.3 浮点异常 429 12.2.4 浮点指令集 429 12.2.5 算术运算指令 432 12.2.6 比较浮点数值 435 12.2.7 读写浮点数值 437 12.2.8 异常同步 438 12.2.9 代码示例 439 12.2.10 混合模式算术运算 440 12.2.11 屏蔽和非屏蔽异常 441 12.2.12 本节回顾 442 12.3 x86指令编码 443 12.3.1 指令格式 443 12.3.2 单字节指令 444 12.3.3 将立即数送入寄存器 444 12.3.4 寄存器模式指令 445 12.3.5 处理器操作数大小前缀 446 12.3.6 内存模式指令 446 12.3.7 本节回顾 448 12.4 本章小结 449 12.5 关键术语 450 12.6 复习题和练习 450 12.6.1 简答题 450 12.6.2 算法题 451 12.7 编程练习 452 第13章 高级语言接口 454 13.1 引言 454 13.1.1 通用规约 454 13.1.2 .MODEL伪指令 455 13.1.3 检查编译器生成的代码 457 13.1.4 本节回顾 460 13.2 内联汇编代码 461 13.2.1 Visual C++中的_?_asm伪指令 461 13.2.2 文件加密示例 463 13.2.3 本节回顾 465 13.3 将32位汇编语言代码链接到C/C++ 466 13.3.1 IndexOf示例 466 13.3.2 调用C和C++函数 469 13.3.3 乘法表的示例 471 13.3.4 本节回顾 474 13.4 本章小结 474 13.5 关键术语 474 13.6 复习题 474 13.7 编程练习 475 第14章 16位MS-DOS编程 476 14.1 MS-DOS和IBM-PC 476 14.1.1 内存组织 476 14.1.2 重定向输入/输出 478 14.1.3 软件中断 478 14.1.4 INT指令 478 14.1.5 16位程序的代码编写 479 14.1.6 本节回顾 481 14.2 MS-DOS功能调用(INT 21h) 481 14.2.1 若干输出功能 482 14.2.2 Hello World程序示例 483 14.2.3 若干输入功能 484 14.2.4 日期/时间功能 487 14.2.5 本节回顾 490 14.3 标准的MS-DOS文件I/O服务 490 14.3.1 创建或打开文件(716Ch) 491 14.3.2 关闭文件句柄(3Eh) 492 14.3.3 移动文件指针(42h) 493 14.3.4 获取文件创建日期和时间 493 14.3.5 若干库过程 494 14.3.6 示例:读取和复制一个文本文件 495 14.3.7 读取MS-DOS命令的尾部 496 14.3.8 示例:创建二进制文件 498 14.3.9 本节回顾 501 14.4 本章小结 501 14.5 关键术语 503 14.6 编程练习 503 第15章 磁盘基础知识 505 15.1 磁盘存储系统 505 15.1.1 磁道、柱面及扇区 505 15.1.2 磁盘分区(卷) 506 15.1.3 本节回顾 507 15.2 文件系统 508 15.2.1 FAT12 508 15.2.2 FAT16 509 15.2.3 FAT32 509 15.2.4 NTFS 509 15.2.5 主磁盘区 510 15.2.6 本节回顾 510 15.3 磁盘目录 511 15.3.1 MS-DOS目录结构 512 15.3.2 MS-Windows中的长文件名 513 15.3.3 文件分配表 515 15.3.4 本节回顾 515 15.4 读写磁盘扇区 515 15.4.1 扇区显示程序 517 15.4.2 本节回顾 520 15.5 系统级文件功能 520 15.5.1 获取磁盘空闲空间(7303h) 520 15.5.2 创建子目录(39h) 523 15.5.3 删除子目录(3Ah) 523 15.5.4 设置当前目录(3Bh) 523 15.5.5 获取当前目录(47h) 524 15.5.6 获取和设置文件属性(7143h) 524 15.5.7 本节回顾 525 15.6 本章小结 525 15.7 关键术语 526 15.8 编程练习 526 第16章 BIOS级编程 528 16.1 引言 528 16.1.1 BIOS数据区 528 16.2 使用INT 16h进行键盘输入 529 16.2.1 键盘如何工作 530 16.2.2 INT 16h功能 530 16.2.3 本节回顾 534 16.3 使用INT 10h进行视频编程 534 16.3.1 基本背景 534 16.3.2 控制颜色 536 16.3.3 INT 10h视频功能 537 16.3.4 库过程示例 546 16.3.5 本节回顾 547 16.4 使用INT 10h绘制图形 547 16.4.1 INT 10h与像素有关的功能 548 16.4.2 程序DrawLine 548 16.4.3 笛卡尔坐标程序 550 16.4.4 将笛卡尔坐标转换为屏幕坐标 552 16.4.5 本节回顾 552 16.5 内存映射的图形 553 16.5.1 模式13h:320×200,256色 553 16.5.2 内存映射图形程序 554 16.5.3 本节回顾 556 16.6 鼠标编程 557 16.6.1 鼠标INT 33h功能 557 16.6.2 鼠标跟踪程序 561 16.6.3 本节回顾 565 16.7 本章小结 565 16.8 编程练习 566 网络资源 附录A MASM参考知识 附录B x86指令集 附录C BIOS和MS-DOS中断 附录D “本节回顾”的问题答案(第14~16章) 词汇表
你还可能感兴趣
我要评论
|