万本电子书0元读

万本电子书0元读

顶部广告

64位汇编语言的编程艺术电子书

本书源于作者的经典书籍The Art of Assembly Language,从32位汇编语言升级为64位汇编语言,基于Microsoft宏汇编程序(MASM)讲解x86-64 CPU上汇编语言的编程艺术,涵盖原理、方法和技巧,是系统学习和掌握汇编语言编程的有益参考。本书从计算机的组成结构始介绍,包括计算机数据表示和运算,以及内存的访问和组织等。之后详细讲解汇编语言程序设计,涉及过程和算术运算的相关知识,再通过低级控制结构过渡到高级主题,如表查找和位操作。此外,还探索了x87浮单元、SIMD指令,以及MASM的宏工具。

售       价:¥

纸质售价:¥149.20购买纸书

30人正在读 | 0人评论 6.4

作       者:(美)兰德尔·海德(Randall Hyde)

出  版  社:机械工业出版社

出版时间:2024-01-04

字       数:3961.0万

所属分类: 科技 > 计算机/网络 > 计算机理论与教程

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(0条)
  • 读书简介
  • 目录
  • 累计评论(0条)
本书源于作者的经典书籍The Art of Assembly Language,从32位汇编语言升级为64位汇编语言,基于Microsoft宏汇编程序(MASM)讲解x86-64 CPU上汇编语言的编程艺术。本书从计算机的组成结构始介绍,包括计算机数据表示和运算,以及内存的访问和组织等。之后详细讲解汇编语言程序设计,涉及过程和算术运算的相关知识,再通过低级控制结构过渡到高级主题,如表查找和位操作。此外,还探索了x87浮单元、SIMD指令,以及MASM的宏工具。书中的程序清单均可免费下载,供读者即学即用。本书适合计算机专业的学生、相关领域的从业人员以及对汇编语言感兴趣的技术人员阅读。<br/>【推荐语】<br/>本书源于作者的经典书籍The Art of Assembly Language,从32位汇编语言升级为64位汇编语言,基于Microsoft宏汇编程序(MASM)讲解x86-64 CPU上汇编语言的编程艺术,涵盖原理、方法和技巧,是系统学习和掌握汇编语言编程的有益参考。本书从计算机的组成结构始介绍,包括计算机数据表示和运算,以及内存的访问和组织等。之后详细讲解汇编语言程序设计,涉及过程和算术运算的相关知识,再通过低级控制结构过渡到高级主题,如表查找和位操作。此外,还探索了x87浮单元、SIMD指令,以及MASM的宏工具。<br/>【作者】<br/>兰德尔·海德 (Randall Hyde) 嵌式软件工程师,曾在医疗、核能、消费电子和娱乐行业工作。他在大学教授汇编语言编程超过10年,多年来为嵌式和商业应用程序编写了数十万行汇编代码。著有The Art of Assembly Language和Write Great Code系列书籍,均由No Starch出版社出版。<br/>
目录展开

书名页

译者序

推荐序

前言

致谢

第一部分 计算机的组成结构

第1章 汇编语言的第一个程序

1.1 先决条件

1.2 在计算机上安装MASM

1.3 在计算机上安装文本编辑器

1.4 MASM程序的结构剖析

1.5 运行第一个MASM程序

1.6 运行第一个MASM和C++的混合程序

1.7 英特尔x86-64 CPU系列简介

1.8 内存子系统

1.9 在MASM中声明内存变量

1.9.1 将内存地址与变量关联

1.9.2 将数据类型与变量关联

1.10 在MASM中声明(命名)常量

1.11 基本的机器指令

1.11.1 mov指令

1.11.2 指令操作数的类型检查

1.11.3 add和sub指令

1.11.4 lea指令

1.11.5 call和ret指令以及MASM过程

1.12 调用C/C++过程

1.13 “Hello,world!”程序

1.14 在汇编语言中返回函数结果

1.15 自动化构建过程

1.16 微软ABI注释

1.16.1 变量大小

1.16.2 寄存器的用途

1.16.3 栈对齐

1.17 拓展阅读资料

1.18 自测题

第2章 计算机数据表示和运算

2.1 数制系统

2.1.1 十进制数制系统的回顾

2.1.2 二进制数制系统

2.1.3 二进制约定

2.2 十六进制数制系统

2.3 关于数字与表示的注释

2.4 数据组织

2.4.1 位

2.4.2 半字节

2.4.3 字节

2.4.4 字

2.4.5 双字

2.4.6 四字和八字

2.5 位的逻辑运算

2.5.1 逻辑与运算

2.5.2 逻辑或运算

2.5.3 逻辑异或运算

2.5.4 逻辑非运算

2.6 二进制数和位串的逻辑运算

2.7 有符号数和无符号数

2.8 符号扩展和零扩展

2.9 符号缩减和饱和法

2.10 简要回顾:控制转移指令概述

2.10.1 jmp指令

2.10.2 条件跳转指令

2.10.3 cmp指令和相应的条件跳转

2.10.4 条件跳转的同义词

2.11 移位和循环移位

2.12 位字段和打包数据

2.13 IEEE浮点数格式

2.13.1 单精度格式

2.13.2 双精度格式

2.13.3 扩展精度格式

2.13.4 规范化浮点值

2.13.5 非数值数据

2.13.6 MASM对浮点值的支持

2.14 BCD表示法

2.15 字符

2.15.1 ASCII字符编码

2.15.2 MASM对ASCII字符的支持

2.16 Unicode字符集

2.16.1 Unicode码位

2.16.2 Unicode码平面

2.16.3 Unicode编码

2.17 MASM对Unicode的支持

2.18 拓展阅读资料

2.19 自测题

第3章 内存的访问和组织

3.1 运行时的内存组织

3.1.1 “.code”段

3.1.2 “.data”段

3.1.3 “.const”段

3.1.4 “.data?”段

3.1.5 程序中声明段的组织方式

3.1.6 内存访问和4KB内存管理单元页

3.2 MASM如何为变量分配内存

3.3 标签声明

3.4 小端模式和大端模式的数据组织方式

3.5 内存访问

3.6 MASM对数据对齐的支持

3.7 x86-64的寻址模式

3.7.1 x86-64的寄存器寻址模式

3.7.2 x86-64的64位内存寻址模式

3.7.3 不支持大地址的应用程序

3.8 地址表达式

3.9 栈段以及push和pop指令

3.9.1 基本的push指令

3.9.2 基本的pop指令

3.9.3 使用push和pop指令保存寄存器的状态

3.10 栈

3.11 其他push和pop指令

3.12 不通过弹出栈从栈中移除数据

3.13 不通过弹出栈访问压入栈的数据

3.14 微软ABI注释

3.15 拓展阅读资料

3.16 自测题

第4章 常量、变量和数据类型

4.1 imul指令

4.2 inc和dec指令

4.3 MASM常量声明

4.3.1 常量表达式

4.3.2 this和$运算符

4.3.3 常量表达式求值

4.4 MASM typedef语句

4.5 类型强制

4.6 指针数据类型

4.6.1 在汇编语言中使用指针

4.6.2 在MASM中声明指针

4.6.3 指针常量和指针常量表达式

4.6.4 指针变量和动态内存分配

4.6.5 常见的指针问题

4.7 复合数据类型

4.8 字符串

4.8.1 以零结尾的字符串

4.8.2 带长度前缀的字符串

4.8.3 字符串描述符

4.8.4 字符串指针

4.8.5 字符串函数

4.9 数组

4.9.1 在MASM程序中声明数组

4.9.2 访问一维数组的元素

4.9.3 数组值的排序

4.10 多维数组

4.10.1 行优先顺序

4.10.2 列优先顺序

4.10.3 为多维数组分配存储空间

4.10.4 使用汇编语言访问多维数组元素

4.11 记录/结构

4.11.1 MASM的结构声明

4.11.2 访问记录/结构字段

4.11.3 嵌套MASM结构

4.11.4 初始化结构字段

4.11.5 结构的数组

4.11.6在记录中对齐字段

4.12 联合

4.12.1 匿名联合

4.12.2 可变类型

4.13 微软ABI注释

4.14 拓展阅读资料

4.15 自测题

第二部分汇编语言程序设计

第5章 过程

5.1 实现过程

5.1.1 call和ret指令

5.1.2 过程中的标签

5.2 保存机器的状态(一)

5.3 过程和栈

5.3.1 激活记录

5.3.2 汇编语言的标准进入指令序列

5.3.3 汇编语言的标准退出指令序列

5.4 局部(自动)变量

5.4.1 局部变量的低级别实现

5.4.2 MASM的local伪指令

5.4.3 自动存储分配

5.5 参数

5.5.1 按值传递

5.5.2 按引用传递

5.5.3 参数的底层实现

5.5.4 使用proc伪指令声明参数

5.5.5 访问栈中的引用参数

5.6 调用约定和微软ABI

5.7 微软ABI和微软调用约定

5.7.1 数据类型和微软ABI

5.7.2 参数位置

5.7.3 易失性和非易失性寄存器

5.7.4 栈对齐

5.7.5 参数设置和清理(“魔法”指令的作用)

5.8 函数和函数的返回结果

5.9 递归

5.10 过程指针

5.11 过程参数

5.12 保存机器的状态(二)

5.13 微软ABI注释

5.14 拓展阅读资料

5.15 自测题

第6章 算术运算

6.1 x86-64整数算术指令

6.1.1 符号扩展指令和零扩展指令

6.1.2 mul指令和imul指令

6.1.3 div指令和idiv指令

6.1.4 重温cmp指令

6.1.5 setcc指令

6.1.6 test指令

6.2 算术表达式

6.2.1 简单赋值语句

6.2.2 简单表达式

6.2.3 复杂表达式

6.2.4 可交换性运算符

6.3 逻辑(布尔)表达式

6.4 机器和算术运算的习惯用法

6.4.1 不使用mul或imul的乘法运算

6.4.2 不使用div或idiv的除法运算

6.4.3 使用AND实现模n计数器

6.5 浮点算术运算

6.5.1 x86-64上的浮点数

6.5.2 FPU寄存器

6.5.3 FPU数据类型

6.5.4 FPU指令集

6.5.5 FPU数据移动指令

6.5.6 转换指令

6.5.7 算术指令

6.5.8 比较指令

6.5.9 常量指令

6.5.10 超越函数指令

6.5.11 其他指令

6.6 将浮点数表达式转换为汇编语言

6.6.1 将算术表达式转换为后缀表示法

6.6.2 将后缀表示法转换为汇编语言

6.7 SSE浮点数算术运算

6.7.1 SSE MXCSR寄存器

6.7.2 SSE浮点移动指令

6.7.3 SSE浮点算术指令

6.7.4 SSE浮点数比较

6.7.5 SSE浮点数转换

6.8 拓展阅读资料

6.9 自测题

第7章 低级控制结构

7.1 语句标签

7.1.1 在过程中使用局部符号

7.1.2 使用标签地址初始化数组

7.2 无条件控制转移

7.2.1 寄存器间接跳转

7.2.2 内存间接跳转

7.3 条件跳转指令

7.4 “蹦床”

7.5 条件移动指令

7.6 使用汇编语言实现通用控制结构

`7.6.1 选择结构

7.6.2 if/then/else语句序列

7.6.3 使用完整布尔求值实现复杂的if语句

7.6.4 短路布尔求值

7.6.5 短路布尔求值和完整布尔求值的比较

7.6.6 使用汇编语言高效地实现if语句

7.6.7 switch/case语句

7.7 状态机和间接跳转

7.8 循环结构

7.8.1 while循环

7.8.2 repeat/until循环

7.8.3 无限循环

7.8.4 for循环

7.8.5 break和continue语句

7.8.6 寄存器和循环结构

7.9 循环结构的性能改进

7.9.1 将终止条件移动到循环的末尾

7.9.2 反向执行循环

7.9.3 使用循环不变式计算

7.9.4 循环展开

7.9.5 使用归纳变量

7.10 拓展阅读资料

7.11 自测题

第8章 高级算术运算

8.1 扩展精度运算

8.1.1 扩展精度加法

8.1.2 扩展精度减法

8.1.3 扩展精度比较

8.1.4 扩展精度乘法

8.1.5 扩展精度除法

8.1.6 扩展精度取反操作

8.1.7 扩展精度AND运算

8.1.8 扩展精度OR运算

8.1.9 扩展精度XOR运算

8.1.10 扩展精度NOT运算

8.1.11 扩展精度移位运算

8.1.12 扩展精度循环移位运算

8.2 对不同大小的操作数进行运算

8.3 十进制算术运算

8.3.1 字面BCD常量

8.3.2 使用FPU的压缩十进制算术运算

8.4 拓展阅读资料

8.5 自测题

第9章 数值转换

9.1 将数值转换为字符串

9.1.1 将数值转换为十六进制字符串

9.1.2 将扩展精度十六进制值转换为字符串

9.1.3 将无符号十进制值转换为字符串

9.1.4 将有符号整数值转换为字符串

9.1.5 将扩展精度无符号整数转换为字符串

9.1.6 将扩展精度有符号十进制值转换为字符串

9.1.7 格式化转换

9.1.8 将浮点值转换为字符串

9.2 字符串到数值的转换例程

9.2.1 将十进制字符串转换为整数

9.2.2 将十六进制字符串转换为数值形式

9.2.3 将无符号十进制字符串转换为整数

9.2.4 扩展精度字符串到无符号整数的转换

9.2.5 扩展精度有符号十进制字符串到整数的转换

9.2.6 实数字符串到浮点值的转换

9.3 拓展阅读资料

9.4 自测题

第10章 表查找

10.1 表

10.1.1 通过表查找进行函数计算

10.1.2 生成表

10.1.3 表查找的性能

10.2 拓展阅读资料

10.3 自测题

第11章 SIMD指令

11.1 SSE/AVX体系结构

11.2 流数据类型

11.3 使用cpuid区分指令集

11.4 完整的段语法和段对齐

11.5 SSE、AVX和AVX2内存操作数对齐

11.6 SIMD数据移动指令

11.6.1 (v)movd和(v)movq指令

11.6.2 (v)movaps、(v)movapd和(v)movdqa指令

11.6.3 (v)movups、(v)movupd和(v)movdqu指令

11.6.4 对齐和未对齐移动指令的性能

11.6.5 (v)movlps和(v)movlpd指令

11.6.6 movhps和movhpd指令

11.6.7 vmovhps和vmovhpd指令

11.6.8 movlhps和vmovlhps指令

11.6.9 movhlps和vmovhlps指令

11.6.10 (v)movshdup和(v)movsldup指令

11.6.11 (v)movddup指令

11.6.12 (v)lddqu指令

11.6.13 性能问题和SIMD移动指令

11.6.14 关于SIMD移动指令的一些说明

11.7 混排和解包指令

11.7.1 (v)pshufb指令

11.7.2 (v)pshufd指令

11.7.3 (v)pshuflw和(v)pshufhw指令

11.7.4 shufps和shufpd指令

11.7.5 vshufps和vshufpd指令

11.7.6 (v)unpcklps、(v)unpckhps、(v)unpcklpd和(v)unpckhpd指令

11.7.7 整数解包指令

11.7.8 (v)pextrb、(v)pextrw、(v)pextrd和(v)pextrq指令

11.7.9 (v)pinsrb、(v)pinsrw、(v)pinsrd和(v)pinsrq指令

11.7.10 (v)extractps和(v)insertps指令

11.8 SIMD算术和逻辑运算

11.9 SIMD逻辑(按位操作)指令

11.9.1 (v)ptest指令

11.9.2 字节移位指令

11.9.3 位移位指令

11.10 SIMD整数算术指令

11.10.1 SIMD整数加法

11.10.2 水平加法运算

11.10.3 双字大小的水平加法运算

11.10.4 SIMD整数减法运算

11.10.5 SIMD整数乘法运算

11.10.6 SIMD整数平均值

11.10.7 SIMD整数的最小值和最大值

11.10.8 SIMD整数的绝对值

11.10.9 SIMD整数符号调整指令

11.10.10 SIMD整数比较指令

11.10.11 整数转换

11.11 SIMD浮点算术运算

11.12 SIMD浮点比较指令

11.12.1 SSE和AVX的比较指令

11.12.2 无序比较与有序比较

11.12.3 信号比较与安静比较

11.12.4 指令的同义词

11.12.5 AVX扩展比较

11.12.6 使用SIMD比较指令

11.12.7 (v)movmskps和(v)movmskpd指令

11.13 浮点转换指令

11.14 对齐SIMD内存访问

11.15 对齐字、双字和四字对象的地址

11.16 使用相同值的几个副本填充XMM寄存器

11.17 将一些常用常量加载到XMM和YMM寄存器中

11.18 设置、清除、反转和测试SSE寄存器中的单个位

11.19 使用单个递增索引来处理两个向量

11.20 将两个地址对齐到同一个内存边界

11.21 处理长度不是SSE/AVX寄存器大小倍数的数据块

11.22 CPU功能的动态测试

11.23 MASM include伪指令

11.24 其他SIMD指令

11.25 拓展阅读资料

11.26 自测题

第12章 位操作

12.1 什么是位数据

12.2 操作位的指令

12.2.1 and指令

12.2.2 or指令

12.2.3 xor指令

12.2.4 通过逻辑指令修改标志位

12.2.5 位测试指令

12.2.6 使用移位和循环移位指令操作位

12.3 作为位累加器的进位标志位

12.4 位串的打包和解包

12.5 提取位和创建位掩码的BMI1指令

12.6 合并位集和分配位串

12.7 使用BMI2指令合并和分配位串

12.8 打包的位串数组

12.9 查找位

12.10 统计位的个数

12.11 反转位串

12.12 合并位串

12.13 提取位串

12.14 搜索位模式

12.15 拓展阅读资料

12.16 自测题

第13章 宏和MASM编译时语言

13.1 编译时语言的概述

13.2 echo和“.err”伪指令

13.3 编译时常量和变量

13.4 编译时表达式和运算符

13.4.1 MASM转义运算符(!)

13.4.2 MASM求值运算符(%)

13.4.3 catstr伪指令

13.4.4 instr伪指令

13.4.5 sizestr伪指令

13.4.6 substr伪指令

13.5 条件汇编(编译时决策)

13.6 重复汇编(编译时循环)

13.7 宏(编译时过程)

13.8 标准宏

13.9 宏参数

13.9.1 标准宏参数展开

13.9.2 可选和必需的宏参数

13.9.3 默认宏参数值

13.9.4 具有可变数量参数的宏

13.9.5 宏展开运算符(&)

13.10 宏中的局部符号

13.11 exitm伪指令

13.12 MASM宏函数语法

13.13 宏作为编译时过程和函数

13.14 编写编译时“程序”

13.14.1 在编译时构建数据表

13.14.2 展开循环

13.15 模拟高级语言的过程调用

13.15.1 模拟高级语言的调用(无参数)

13.15.2 模拟高级语言的调用(带有一个参数)

13.15.3 使用opattr确定参数类型

13.15.4 模拟高级语言的调用(带有固定数量的参数)

13.15.5 模拟高级语言的调用(带有可变参数列表)

13.16 调用宏

13.17 高级宏参数解析

13.17.1 检测字符串字面常量

13.17.2 检测实数常量

13.17.3 检测寄存器

13.17.4 编译时数组

13.18 使用宏编写宏

13.19 编译时程序的性能

13.20 拓展阅读资料

13.21 自测题

第14章 串指令

14.1 x86-64串指令

14.1.1 rep、repe、repz以及repnz和repne前缀

14.1.2 方向标志位

14.1.3 movs指令

14.1.4 cmps指令

14.1.5 scas指令

14.1.6 stos指令

14.1.7 lods指令

14.1.8 使用lods和stos构建复杂的串函数

14.2 x86-64串指令的性能

14.3 SIMD串指令

14.3.1 打包比较的操作数大小

14.3.2 比较的类型

14.3.3 结果的极性

14.3.4 输出处理

14.3.5 打包字符串比较长度

14.3.6 打包字符串比较结果

14.4 对齐和MMU页

14.5 拓展阅读资料

14.6 自测题

第15章 管理复杂的项目

15.1 include伪指令

15.2 忽略重复包含的操作

15.3 汇编单元和外部伪指令

15.4 MASM中的头文件

15.5 externdef伪指令

15.6 分离式编译

15.7 makefile简介

15.7.1 基本的makefile语法

15.7.2 make依赖项

15.7.3 clean和touch

15.8 微软链接器和库代码

15.9 对象文件和库文件对程序大小的影响

15.10 拓展阅读资料

15.11 自测题

第16章 独立的汇编语言程序

16.1 独立的“Hello,world!”程序

16.2 头文件和Windows接口

16.3 Win32 API和Windows ABI

16.4 构建独立的控制台应用程序

16.5 构建独立的GUI应用程序

16.6 Windows API的MessageBox函数概述

16.7 Windows文件I/O

16.8 Windows应用程序

16.9 拓展阅读资料

16.10 自测题

附录A 安装和使用Visual Studio

附录B 自测题参考答案

推荐阅读

累计评论(0条) 0个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部