好书推荐 好书速递 排行榜 读书文摘

汇编语言:基于x86处理器(原书第7版)

汇编语言:基于x86处理器(原书第7版)
作者:[美]基普 · 欧文
译者:贺莲 / 龚奕利
副标题:基于x86处理器(原书第7版)
出版社:机械工业出版社
出版年:2016-04
ISBN:9787111530367
行业:教育
浏览数:11

内容简介

本书是汇编语言课程的经典教材,系统介绍x86和Intel64处理器的汇编语言编程与架构。前9章为汇编语言的核心概念,包括:汇编语言基础,x86处理器架构,数据传送、寻址和算术运算,过程,条件处理,整数运算,高级过程,以及字符串和数组。后4章介绍结构和宏、MS-Windows编程、浮点数处理和指令编码,以及高级语言接口。

本书内容翔实,案例丰富,极具逻辑性和系统性,不仅可作为汇编语言课程的教材,还可作为计算机系统基础和体系结构基础方面的教材。

......(更多)

作者简介

基普·欧文(Kip Irvine)佛罗里达国际大学高级讲师,教授计算机相关的课程。 著有多本编程教材,被翻译成多国语言,涵盖的主题如汇编语言、C++、Visual Basic和COBOL。

......(更多)

目录

出版者的话

译者序

前言

第1章 基本概念 1

1.1 欢迎来到汇编语言的世界 1

1.1.1 读者可能会问的问题 2

1.1.2 汇编语言的应用 4

1.1.3 本节回顾 5

1.2 虚拟机概念 5

1.3 数据表示 7

1.3.1 二进制整数 7

1.3.2 二进制加法 8

1.3.3 整数存储大小 9

1.3.4 十六进制整数 10

1.3.5 十六进制加法 11

1.3.6 有符号二进制整数 12

1.3.7 二进制减法 13

1.3.8 字符存储 14

1.3.9 本节回顾 15

1.4 布尔表达式 16

1.4.1 布尔函数真值表 18

1.4.2 本节回顾 18

1.5 本章小结 19

1.6 关键术语 19

1.7 复习题和练习 20

1.7.1 简答题 20

1.7.2 算法基础 21

第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 本节回顾 26

2.2 32位x86处理器 27

2.2.1 操作模式 27

2.2.2 基本执行环境 27

2.2.3 x86内存管理 30

2.2.4 本节回顾 30

2.3 64位x86-64处理器 30

2.3.1 64位操作模式 31

2.3.2 基本64位执行环境 31

2.4 典型x86计算机组件 32

2.4.1 主板 32

2.4.2 内存 34

2.4.3 本节回顾 34

2.5 输入输出系统 34

2.5.1 I/O访问层次 34

2.5.2 本节回顾 36

2.6 本章小结 36

2.7 关键术语 37

2.8 复习题 38

第3章 汇编语言基础 39

3.1 基本语言元素 39

3.1.1 第一个汇编语言程序 39

3.1.2 整数常量 40

3.1.3 整型常量表达式 41

3.1.4 实数常量 41

3.1.5 字符常量 42

3.1.6 字符串常量 42

3.1.7 保留字 42

3.1.8 标识符 43

3.1.9 伪指令 43

3.1.10 指令 44

3.1.11 本节回顾 46

3.2 示例:整数加减法 46

3.2.1 AddTwo程序 46

3.2.2 运行和调试AddTwo程序 48

3.2.3 程序模板 52

3.2.4 本节回顾 52

3.3 汇编、链接和运行程序 53

3.3.1 汇编–链接–执行周期 53

3.3.2 列表文件 53

3.3.3 本节回顾 55

3.4 定义数据 55

3.4.1 内部数据类型 55

3.4.2 数据定义语句 55

3.4.3 向AddTwo程序添加一个变量 56

3.4.4 定义BYTE和SBYTE数据 57

3.4.5 定义WORD和SWORD数据 59

3.4.6 定义DWORD和SDWORD数据 59

3.4.7 定义QWORD数据 60

3.4.8 定义压缩BCD(TBYTE)数据 60

3.4.9 定义浮点类型 61

3.4.10 变量加法程序 61

3.4.11 小端顺序 62

3.4.12 声明未初始化数据 62

3.4.13 本节回顾 63

3.5 符号常量 63

3.5.1 等号伪指令 63

3.5.2 计算数组和字符串的大小 64

3.5.3 EQU伪指令 65

3.5.4 TEXTEQU伪指令 66

3.5.5 本节回顾 66

3.6 64位编程 67

3.7 本章小结 68

3.8 关键术语 69

3.8.1 术语 69

3.8.2 指令、运算符和伪指令 70

3.9 复习题和练习 70

3.9.1 简答题 70

3.9.2 算法基础 71

3.10 编程练习 71

第4章 数据传送、寻址和算术运算 73

4.1 数据传送指令 73

4.1.1 引言 73

4.1.2 操作数类型 73

4.1.3 直接内存操作数 74

4.1.4 MOV指令 75

4.1.5 整数的全零/符号扩展 76

4.1.6 LAHF和SAHF指令 77

4.1.7 XCHG指令 78

4.1.8 直接–偏移量操作数 78

4.1.9 示例程序(Moves) 79

4.1.10 本节回顾 80

4.2 加法和减法 81

4.2.1 INC和DEC指令 81

4.2.2 ADD指令 81

4.2.3 SUB指令 81

4.2.4 NEG指令 82

4.2.5 执行算术表达式 82

4.2.6 加减法影响的标志位 82

4.2.7 示例程序(AddSubTest) 85

4.2.8 本节回顾 86

4.3 与数据相关的运算符和伪指令 87

4.3.1 OFFSET运算符 87

4.3.2 ALIGN伪指令 88

4.3.3 PTR运算符 88

4.3.4 TYPE运算符 89

4.3.5 LENGTHOF运算符 89

4.3.6 SIZEOF运算符 90

4.3.7 LABEL伪指令 90

4.3.8 本节回顾 90

4.4 间接寻址 91

4.4.1 间接操作数 91

4.4.2 数组 91

4.4.3 变址操作数 92

4.4.4 指针 93

4.4.5 本节回顾 95

4.5 JMP和LOOP指令 95

4.5.1 JMP指令 96

4.5.2 LOOP指令 96

4.5.3 在Visual Studio调试器中显示数组 97

4.5.4 整数数组求和 98

4.5.5 复制字符串 98

4.5.6 本节回顾 99

4.6 64位编程 99

4.6.1 MOV指令 99

4.6.2 64位的SumArray程序 100

4.6.3 加法和减法 101

4.6.4 本节回顾 102

4.7 本章小结 102

4.8 关键术语 104

4.8.1 术语 104

4.8.2 指令、运算符和伪指令 104

4.9 复习题和练习 104

4.9.1 简答题 104

4.9.2 算法基础 106

4.10 编程练习 107

第5章 过程 108

5.1 堆栈操作 108

5.1.1 运行时堆栈(32位模式) 108

5.1.2 PUSH和POP指令 110

5.1.3 本节回顾 112

5.2 定义并使用过程 112

5.2.1 PROC伪指令 112

5.2.2 CALL和RET指令 114

5.2.3 过程调用嵌套 115

5.2.4 向过程传递寄存器参数 116

5.2.5 示例:整数数组求和 116

5.2.6 保存和恢复寄存器 118

5.2.7 本节回顾 119

5.3 链接到外部库 119

5.3.1 背景知识 119

5.3.2 本节回顾 120

5.4 Irvine32链接库 120

5.4.1 创建库的动机 120

5.4.2 概述 122

5.4.3 过程详细说明 123

5.4.4 库测试程序 133

5.4.5 本节回顾 139

5.5 64位汇编编程 139

5.5.1 Irvine64链接库 139

5.5.2 调用64位子程序 140

5.5.3 x64调用规范 140

5.5.4 调用过程示例 141

5.6 本章小结 142

5.7 关键术语 143

5.7.1 术语 143

5.7.2 指令、运算符和伪指令 143

5.8 复习题和练习 143

5.8.1 简答题 143

5.8.2 算法基础 146

5.9 编程练习 146

第6章 条件处理 148

6.1 条件分支 148

6.2 布尔和比较指令 148

6.2.1 CPU状态标志 149

6.2.2 AND指令 149

6.2.3 OR指令 150

6.2.4 位映射集 151

6.2.5 XOR指令 152

6.2.6 NOT指令 153

6.2.7 TEST指令 153

6.2.8 CMP指令 154

6.2.9 置位和清除单个CPU标志位 155

6.2.10 64位模式下的布尔指令 155

6.2.11 本节回顾 156

6.3 条件跳转 156

6.3.1 条件结构 156

6.3.2 Jcond指令 156

6.3.3 条件跳转指令类型 157

6.3.4 条件跳转应用 159

6.3.5 本节回顾 163

6.4 条件循环指令 163

6.4.1 LOOPZ和LOOPE指令 163

6.4.2 LOOPNZ和LOOPNE指令 164

6.4.3 本节回顾 164

6.5 条件结构 164

6.5.1 块结构的IF语句 165

6.5.2 复合表达式 167

6.5.3 WHILE循环 168

6.5.4 表驱动选择 169

6.5.5 本节回顾 171

6.6 应用:有限状态机 172

6.6.1 验证输入字符串 172

6.6.2 验证有符号整数 172

6.6.3 本节回顾 176

6.7 条件控制流伪指令 176

6.7.1 新建IF语句 177

6.7.2 有符号数和无符号数的比较 178

6.7.3 复合表达式 179

6.7.4 用.REPEAT和.WHILE创建循环 181

6.8 本章小结 182

6.9 关键术语 183

6.9.1 术语 183

6.9.2 指令、运算符和伪指令 184

6.10 复习题和练习 184

6.10.1 简答题 184

6.10.2 算法基础 186

6.11 编程练习 187

6.11.1 测试代码的建议 187

6.11.2 习题 188

第7章 整数运算 191

7.1 移位和循环移位指令 191

7.1.1 逻辑移位和算术移位 191

7.1.2 SHL指令 192

7.1.3 SHR指令 193

7.1.4 SAL和SAR指令 193

7.1.5 ROL指令 194

7.1.6 ROR指令 195

7.1.7 RCL和RCR指令 195

7.1.8 有符号数溢出 196

7.1.9 SHLD/SHRD指令 196

7.1.10 本节回顾 198

7.2 移位和循环移位的应用 198

7.2.1 多个双字的移位 198

7.2.2 二进制乘法 199

7.2.3 显示二进制位 200

7.2.4 提取文件日期字段 200

7.2.5 本节回顾 201

7.3 乘法和除法指令 201

7.3.1 MUL指令 201

7.3.2 IMUL指令 203

7.3.3 测量程序执行时间 205

7.3.4 DIV指令 207

7.3.5 有符号数除法 208

7.3.6 实现算术表达式 211

7.3.7 本节回顾 212

7.4 扩展加减法 212

7.4.1 ADC指令 212

7.4.2 扩展加法示例 213

7.4.3 SBB指令 215

7.4.4 本节回顾 215

7.5 ASCII和非压缩十进制运算 216

7.5.1 AAA指令 217

7.5.2 AAS指令 218

7.5.3 AAM指令 218

7.5.4 AAD指令 219

7.5.5 本节回顾 219

7.6 压缩十进制运算 219

7.6.1 DAA指令 220

7.6.2 DAS指令 220

7.6.3 本节回顾 221

7.7 本章小结 221

7.8 关键术语 222

7.8.1 术语 222

7.8.2 指令、运算符和伪指令 222

7.9 复习题和练习 222

7.9.1 简答题 222

7.9.2 算法基础 224

7.10 编程练习 225

第8章 高级过程 227

8.1 引言 227

8.2 堆栈帧 227

8.2.1 堆栈参数 227

8.2.2 寄存器参数的缺点 228

8.2.3 访问堆栈参数 230

8.2.4 32位调用规范 232

8.2.5 局部变量 233

8.2.6 引用参数 235

8.2.7 LEA指令 235

8.2.8 ENTER和LEAVE指令 236

8.2.9 LOCAL伪指令 238

8.2.10 Microsoft x64调用规范 239

8.2.11 本节回顾 239

8.3 递归 239

8.3.1 递归求和 240

8.3.2 计算阶乘 241

8.3.3 本节回顾 246

8.4 INVOKE、ADDR、PROC和PROTO 246

8.4.1 INVOKE伪指令 246

8.4.2 ADDR运算符 247

8.4.3 PROC伪指令 247

8.4.4 PROTO伪指令 250

8.4.5 参数类别 253

8.4.6 示例:交换两个整数 253

8.4.7 调试提示 254

8.4.8 WriteStackFrame过程 255

8.4.9 本节回顾 256

8.5 新建多模块程序 256

8.5.1 隐藏和导出过程名 256

8.5.2 调用外部过程 257

8.5.3 跨模块使用变量和标号 258

8.5.4 示例:ArraySum程序 259

8.5.5 用Extern新建模块 259

8.5.6 用INVOKE和PROTO新建模块 262

8.5.7 本节回顾 265

8.6 参数的高级用法(可选主题) 265

8.6.1 受USES运算符影响的堆栈 265

8.6.2 向堆栈传递8位和16位参数 266

8.6.3 传递64位参数 267

8.6.4 非双字局部变量 268

8.7 Java字节码(可选主题) 269

8.7.1 Java虚拟机 269

8.7.2 指令集 270

8.7.3 Java反汇编示例 271

8.7.4 示例:条件分支 273

8.8 本章小结 274

8.9 关键术语 275

8.9.1 术语 275

8.9.2 指令、运算符和伪指令 276

8.10 复习题和练习 276

8.10.1 简答题 276

8.10.2 算法基础 276

8.11 编程练习 277

第9章 字符串和数组 279

9.1 引言 279

9.2 字符串基本指令 279

9.2.1 MOVSB、MOVSW和MOVSD 280

9.2.2 CMPSB、CMPSW和CMPSD 280

9.2.3 SCASB、SCASW和SCASD 281

9.2.4 STOSB、STOSW和STOSD 282

9.2.5 LODSB、LODSW和LODSD 282

9.2.6 本节回顾 282

9.3 部分字符串过程 283

9.3.1 Str_compare过程 283

9.3.2 Str_length过程 284

9.3.3 Str_copy过程 284

9.3.4 Str_trim过程 285

9.3.5 Str_ucase过程 287

9.3.6 字符串库演示程序 288

9.3.7 Irivne64库中的字符串过程 289

9.3.8 本节回顾 291

9.4 二维数组 291

9.4.1 行列顺序 291

9.4.2 基址–变址操作数 292

9.4.3 基址–变址–偏移量操作数 294

9.4.4 64位模式下的基址–变址操作数 294

9.4.5 本节回顾 295

9.5 整数数组的检索和排序 295

9.5.1 冒泡排序 295

9.5.2 对半查找 297

9.5.3 本节回顾 302

9.6 Java字节码:字符串处理(可选主题) 302

9.7 本章小结 303

9.8 关键术语和指令 304

9.9 复习题和练习 304

9.9.1 简答题 304

9.9.2 算法基础 305

9.10 编程练习 305

第10章 结构和宏 308

10.1 结构 308

10.1.1 定义结构 308

10.1.2 声明结构变量 309

10.1.3 引用结构变量 310

10.1.4 示例:显示系统时间 313

10.1.5 结构包含结构 315

10.1.6 示例:醉汉行走 315

10.1.7 声明和使用联合 318

10.1.8 本节回顾 320

10.2 宏 320

10.2.1 概述 320

10.2.2 定义宏 321

10.2.3 调用宏 322

10.2.4 其他宏特性 323

10.2.5 使用本书的宏库(仅32位模式) 326

10.2.6 示例程序:封装器 332

10.2.7 本节回顾 333

10.3 条件汇编伪指令 333

10.3.1 检查缺失的参数 333

10.3.2 默认参数初始值设定 334

10.3.3 布尔表达式 335

10.3.4 IF、ELSE和ENDIF伪指令 335

10.3.5 IFIDN和IFIDNI伪指令 336

10.3.6 示例:矩阵行求和 336

10.3.7 特殊运算符 339

10.3.8 宏函数 342

10.3.9 本节回顾 343

10.4 定义重复语句块 344

10.4.1 WHILE伪指令 344

10.4.2 REPEAT伪指令 344

10.4.3 FOR伪指令 345

10.4.4 FORC伪指令 345

10.4.5 示例:链表 346

10.4.6 本节回顾 347

10.5 本章小结 348

10.6 关键术语 349

10.6.1 术语 349

10.6.2 运算符和伪指令 349

10.7 复习题和练习 349

10.7.1 简答题 349

10.7.2 算法基础 350

10.8 编程练习 351

第11章 MS-Windows编程 354

11.1 Win32控制台编程 354

11.1.1 背景知识 354

11.1.2 Win32控制台函数 357

11.1.3 显示消息框 359

11.1.4 控制台输入 361

11.1.5 控制台输出 366

11.1.6 读写文件 368

11.1.7 Irvine32链接库的文件I/O 371

11.1.8 测试文件I/O过程 373

11.1.9 控制台窗口操作 375

11.1.10 控制光标 378

11.1.11 控制文本颜色 379

11.1.12 时间与日期函数 380

11.1.13 使用64位Windows API 383

11.1.14 本节回顾 384

11.2 编写图形化的Windows应用程序 384

11.2.1 必要的结构 385

11.2.2 MessageBox函数 386

11.2.3 WinMain过程 387

11.2.4 WinProc过程 387

11.2.5 ErrorHandler过程 388

11.2.6 程序清单 388

11.2.7 本节回顾 391

11.3 动态内存分配 391

11.3.1 HeapTest程序 394

11.3.2 本节回顾 397

11.4 x86存储管理 397

11.4.1 线性地址 398

11.4.2 页转换 400

11.4.3 本节回顾 401

11.5 本章小结 402

11.6 关键术语 403

11.7 复习题和练习 403

11.7.1 简答题 403

11.7.2 算法基础 404

11.8 编程练习 404

第12章 浮点数处理与指令编码 406

12.1 浮点数二进制表示 406

12.1.1 IEEE二进制浮点数表示 406

12.1.2 阶码 407

12.1.3 规格化二进制浮点数 407

12.1.4 新建IEEE表示 408

12.1.5 十进制小数转换为二进制实数 409

12.1.6 本节回顾 411

12.2 浮点单元 411

12.2.1 FPU寄存器栈 411

12.2.2 舍入 413

12.2.3 浮点数异常 414

12.2.4 浮点数指令集 414

12.2.5 算术运算指令 416

12.2.6 比较浮点数值 419

12.2.7 读写浮点数值 422

12.2.8 异常同步 423

12.2.9 代码示例 423

12.2.10 混合模式运算 425

12.2.11 屏蔽与未屏蔽异常 426

12.2.12 本节回顾 427

12.3 x86指令编码 427

12.3.1 指令格式 427

12.3.2 单字节指令 428

12.3.3 立即数送寄存器 428

12.3.4 寄存器模式指令 429

12.3.5 处理器操作数大小前缀 429

12.3.6 内存模式指令 430

12.3.7 本节回顾 432

12.4 本章小结 432

12.5 关键术语 433

12.6 复习题和练习 434

12.6.1 简答题 434

12.6.2 算法基础 434

12.7 编程练习 435

第13章 高级语言接口 438

13.1 引言 438

13.1.1 通用规范 438

13.1.2 .MODEL伪指令 439

13.1.3 检查编译器生成的代码 441

13.1.4 本节回顾 444

13.2 内嵌汇编代码 444

13.2.1 Visual C++中的__asm伪指令 444

13.2.2 文件加密示例 447

13.2.3 本节回顾 449

13.3 32位汇编程序与C/C++的链接 449

13.3.1 IndexOf示例 450

13.3.2 调用C和C++函数 453

13.3.3 乘法表示例 454

13.3.4 调用C库函数 457

13.3.5 目录表程序 459

13.3.6 本节回顾 461

13.4 本章小结 461

13.5 关键术语 462

13.6 复习题 462

13.7 编程练习 462

附录A MASM参考知识 464

附录B x86指令集 483

附录C “本节回顾”问题答案 510

索引 527

......(更多)

读书文摘

Instruction I-2 cannot enter stage S4 until I-2 has completed the stage

This instruction is only used with unsigned/signed integers

......(更多)

猜你喜欢

点击查看