汇编语言编程艺术
图书信息
作者:(美)Randall Hyde 著;陈曙晖 译,清华大学 | 分类:科学技术,计算机/网络,软件与程序设计,汇编语言/编译原理
作者简介
作者简介 暂缺《汇编语言编程艺术》作者简介
内容简介
内容简介 译者简介:陈曙晖,国防科技大学计算机专业博士,老师。1998年参加工作,在国防科技大学网络与信息安全研究所从事银河超级计算机网络系统和核心路由器的开发工作,担任核心路由器配置管理分系统的开发负责人,曾获得军队科技进步奖一等奖一项(银河超级计算机网络系统)、二等奖一项(核心路由器系统)。审校者简介:毛希平,博士,清华大学计算机系老师,主讲“汇编语言程序设计”课程,并在清华大学计算机系高性能计算研究所从事研究工作,主要研究方向:并行计算和网格计算。查看本书序言(作者:清华大学教授温冬婵)相信很多人都看过该书的网络版,它浓缩了网络版的精华,特别是对HLA的讲解,可谓入木三分。——CherryLam(高级程序员,印度)我一直认为,只有经过多年的学习和实际演练,才能掌握汇编语言程序设计,这本书改变了我的看法。——JamesBrodin(软件公司技术总监,美国)对于想快速成为汇编语言开发人员的学习者来说,本书是多年难遇的好书。——ConnyMeilin(大学教授,瑞典)作者将多年来的开发和教学经验融合在大量的编程实例中,读者通过本书能快速地学会汇编语言程序设计,掌握其中的编程技巧——温冬婵(清华大学教授,中国)本书以X86系列微机为背景,从简单的Hello程序开始,系统而详细地阐述了X86微机汇编语言编程的各种基础知识和编程技巧,内容涉及到数据表示、存储器管理、各种数据类型、过程、与汇编语言相关的体系结构、控制结构、文件、宏指令、位处理指令、字符串指令、MMX指令、类和对象,以及混合语言编程等,尤其是在高级汇编语言(HLA)方面,该书给予了细致深入的讲解。对于有意学习X86汇编语言编程的程序员来说,这是一本难得的好书。本书的作者RandallHyde在大学中教授汇编语言十多年,并且开发了好几个商用软件,具有丰富的汇编语言开发经验。该书的英文电子版受到了成千上万的网站和高级程序员的高度评价,已经成为了高级汇编语言编程方面的一本经典之作。虽然该书的出版时间不长,但在Amazon上为该书作出评价的人很多,而且几乎所有的人都给予5星的评价,可见其内容之好。笔者相信,随着时间的推移,它在程序员中的影响回越来越大。
目录
图书目录第1章 进入汇编语言的世界 11.1 本章概述 11.2 HLA程序的结构 11.3 运行第一个HLA程序 31.4 基本的HLA数据声明 41.5 布尔值 61.6 字符值 61.7 Intel 80x86处理器简介 71.8 基本的机器指令 111.9 基本的HLA控制结构 151.9.1 HLA语句中的布尔表达式 151.9.2 HLA的IF..THEN..ELSEIF..ELSE..ENDIF语句 171.9.3 布尔表达式中的逻辑与、逻辑或以及逻辑非 191.9.4 WHILE..ENDWHILE语句 211.9.5 FOR..ENDFOR语句 211.9.6 REPEAT..UNTIL语句 221.9.7 BREAK和BREAKIF语句 231.9.8 FOREVER..ENDFOR语句 231.9.9 TRY..EXCEPTION..ENDTRY语句 241.10 HLA标准库入门 271.10.1 STDIO模块中的预定义常量 281.10.2 标准输入与标准输出 291.10.3 stdout.newln例程 291.10.4 stdout.putiX例程 291.10.5 stdout.putiXSize例程 301.10.6 stdout.put例程 311.10.7 stdin.getc例程 321.10.8 stdin.getiX例程 341.10.9 stdin.readLn与stdin.flushInput例程 351.10.10 stdin.get例程 361.11 关于TRY..ENDTRY的其他细节 361.11.1 TRY..ENDTRY嵌套语句 371.11.2 TRY..ENDTRY语句中不受保护的子句 391.11.3 TRY..ENDTRY语句中的ANYEXCEPTION子句 421.11.4 寄存器与TRY..ENDTRY语句 421.12 高级汇编语言与低级汇编语言的比较 441.13 更多信息 45第2章 数据表示 462.1 本章概述 462.2 数字系统 462.2.1 回顾十进制系统 462.2.2 二进制数字系统 472.2.3 二进制格式 482.3 十六进制数字系统 492.4 数据结构 512.4.1 位 512.4.2 半字节 512.4.3 字节 522.4.4 字 532.4.5 双字 542.4.6 四字与长字 552.5 二进制数与十六进制数的算术运算 562.6 关于数字及其表示法 562.7 位逻辑运算 592.8 二进制数和位串的逻辑运算 612.9 有符号数和无符号数 632.10 符号扩展、零扩展、压缩和饱和 672.11 移位和循环移位 712.12 位域和压缩数据 752.13 浮点运算简介 792.13.1 IEEE浮点格式 822.13.2 HLA为浮点数值提供的支持 852.14 BCD数据表示 882.15 字符 892.15.1 ASCII字符译码 892.15.2 HLA对ASCII字符提供的支持 922.16 Unicode字符集 962.17 更多信息 96第3章 存储器的访问与结构 973.1 本章概述 973.2 80x86的寻址方式 973.2.1 80x86寄存器寻址方式 973.2.2 80x86的32位存储器寻址方式 983.3 运行时存储器的结构 1043.3.1 代码段 1053.3.2 静态段 1063.3.3 只读数据段 1073.3.4 存储段 1083.3.5 @NOSTORAGE属性 1083.3.6 Var段 1093.3.7 程序中声明段的结构 1103.4 HLA如何为变量分配内存 1113.5 HLA对数据对齐的支持 1123.6 地址表达式 1153.7 类型强制转换 1173.8 寄存器类型强制转换 1193.9 栈段与PUSH及POP指令 1203.9.1 基本的PUSH指令 1203.9.2 基本的POP指令 1213.9.3 用PUSH和POP指令来保护寄存器 1233.9.4 栈的LIFO数据结构 1233.9.5 其他的PUSH和POP指令 1253.9.6 不使用出栈而从栈内移除数据 1273.9.7 访问已入栈而未出栈的数据 1293.10 动态内存分配和堆段 1303.11 INC和DEC指令 1343.12 获取存储器对象的地址 1343.13 更多信息 135第4章 常量、变量与数据类型 1364.1 本章概述 1364.2 一些额外的指令:INTMUL、BOUND、INTO 1364.3 TBYTE数据类型 1414.4 HLA常量和数值声明 1414.4.1 常量类型 1454.4.2 字符串和字符字面常量 1454.4.3 CONST段中的字符串常量与文本常量 1474.4.4 常量表达式 1494.4.5 HLA程序中的多个CONST段以及它们的顺序 1514.4.6 HLA的VAL段 1514.4.7 在程序中的任意位置修改VAL对象 1524.5 HLA的TYPE段 1534.6 ENUM 和HLA枚举数据类型 1544.7 指针数据类型 1554.7.1 在汇编语言中使用指针 1564.7.2 在HLA中声明指针 1574.7.3 指针常量和指针常量表达式 1584.7.4 指针变量和动态内存分配 1594.7.5 指针的常见问题 1604.8 HLA标准库CHARS.HHF模型 1644.9 复合数据类型 1664.10 字符串 1674.11 HLA字符串 1694.12 访问字符串中的某个字符 1754.13 HLA字符串模块和其他与字符串相关的例程 1774.14 存储器内转换 1884.15 字符集 1904.16 在HLA中实现字符集 1904.17 HLA字符集常量和字符集表达式 1924.18 HLA HLL布尔表达式中的IN操作符 1934.19 HLA标准库对字符集的支持 1944.20 在HLA程序中使用字符集 1974.21 数组 1984.22 在HLA程序中声明数组 1994.23 HLA数组常量 2004.24 访问一维数组的元素 2014.25 多维数组 2044.25.1 以行为主排列 2054.25.2 以列为主排列 2084.26 多维数组的存储空间分配 2094.27 汇编语言中多维数组元素的访问 2114.28 大数组和MASM(只适用于Windows程序员) 2124.29 记录 2124.30 记录常量 2154.31 记录数组 2164.32 数组/记录作为记录字段 2174.33 控制记录中的字段偏移量 2204.34 对齐记录中的字段 2214.35 记录指针 2234.36 联合 2244.37 匿名联合 2264.38 变量类型 2274.39 联合常量 2284.40 命名空间 2294.41 汇编语言中的动态数组 2324.42 HLA标准库数组支持 2344.43 更多信息 237第5章 过程与单元 2385.1 本章概述 2385.2 过程 2385.3 机器状态的保存 2405.4 过程的提前返回 2445.5 局部变量 2455.6 其他局部和全局符号类型 2505.7 参数 2505.7.1 值传递 2515.7.2 引用传递 2545.8 函数和函数的结果 2575.8.1 返回函数结果 2575.8.2 HLA的指令合成 2585.8.3 HLA过程的@RETURNS选项 2605.9 递归 2625.10 过程的向前引用 2665.11 过程的底层实现与CALL指令 2675.12 过程与堆栈 2695.13 活动记录 2725.14 标准入口序列 2755.15 标准出口序列 2765.16 自动(局部)变量的底层实现 2775.17 参数的底层实现 2795.17.1 在寄存器中传递参数 2795.17.2 在代码流中传递参数 2815.17.3 在堆栈中传递参数 2845.18 过程指针 3045.19 过程参数 3075.20 无类型的引用参数 3085.21 管理大型程序 3095.22 #INCLUDE伪指令 3105.23 忽略重复的#INCLUDE操作 3115.24 单元与EXTERNAL伪指令 3125.24.1 伪指令EXTERNAL的行为 3165.24.2 HLA中的头文件 3175.25 命名空间的污染 3195.26 更多信息 321第6章 算术运算 3226.1 本章概述 3226.2 80x86的整数运算指令 3226.2.1 MUL和IMUL指令 3226.2.2 DIV和IDIV指令 3256.2.3 CMP指令 3276.2.4 SETcc指令 3316.2.5 TEST指令 3336.3 算术表达式 3346.3.1 简单赋值语句 3356.3.2 简单表达式 3366.3.3 复杂表达式 3386.3.4 可交换运算符 3426.4 逻辑(布尔)表达式 3436.5 机器特征与运算技巧 3456.5.1 不使用MUL、IMUL或INTMUL的乘法 3466.5.2 不使用DIV或IDIV的除法 3476.5.3 使用AND实现模N计数器 3476.5.4 疏忽使用机器特性 3486.6 浮点运算 3486.6.1 FPU寄存器 3486.6.2 FPU的数据类型 3556.6.3 FPU的指令集 3566.6.4 FPU的数据转移指令 3566.6.5 换算指令 3586.6.6 算术运算指令 3606.6.7 比较指令 3656.6.8 常量指令 3676.6.9 超越指令 3676.6.10 其他指令 3696.6.11 整数操作 3706.7 浮点表达式到汇编语言的转换 3706.7.1 算术表达式到后缀表示法的转换 3726.7.2 把后缀表达式转换成汇编语言 3736.8 HLA标准库对浮点算术运算的支持 3756.8.1 函数stdin.getf和fileio.getf 3756.8.2 HLA数学库中的三角函数 3756.8.3 HLA数学库中的指数函数和对数函数 3766.9 算术运算小结 377第7章 低级控制结构 3787.1 本章概述 3787.2 低级控制结构 3787.3 语句标号 3787.4 无条件控制转移(JMP) 3807.5 条件跳转指令 3837.6 “中级”控制结构:JT和JF 3867.7 使用汇编语言实现通用控制结构 3867.8 选择 3867.8.1 IF..THEN..ELSE序列 3887.8.2 将HLA的IF语句翻译成纯汇编语言语句 3917.8.3 使用完全布尔求值实现复杂的IF语句 3967.8.4 “短路”布尔求值 3977.8.5 “短路”布尔求值与完全布尔求值 3997.8.6 汇编语言中IF语句的高效实现 4017.8.7 SWITCH/CASE语句 4057.9 状态机和间接跳转 4157.10 “面条式”代码 4187.11 循环 4187.11.1 WHILE循环 4197.11.2 REPEAT..UNTIL循环 4207.11.3 FOREVER..ENDFOR循环 4217.11.4 FOR循环 4227.11.5 BREAK和CONTINUE语句 4237.11.6 寄存器的使用与循环 4277.12 性能提高 4287.12.1 将结束条件判断放在循环结尾 4297.12.2 反向执行循环 4317.12.3 循环不变计算 4327.12.4 循环展开 4337.12.5 归纳变量 4347.13 HLA中的混合控制结构 4357.14 更多信息 437第8章 文件 4388.1 本章概述 4388.2 文件组织 4388.2.1 作为记录列表的文件 4388.2.2 二进制文件与文本文件的比较 4408.3 顺序文件 4428.4 随机访问文件 4498.5 ISAM文件 4538.6 截断文件 4568.7 更多信息 458第9章 高级算术运算 4599.1 本章概述 4599.2 多精度操作 4599.2.1 扩充精度操作的HLA标准库支持 4599.2.2 多精度加法操作 4629.2.3 多精度减法操作 4649.2.4 扩充精度比较操作 4659.2.5 扩充精度乘法操作 4709.2.6 扩充精度除法操作 4739.2.7 扩充精度NEG操作 4829.2.8 扩充精度AND操作 4839.2.9 扩充精度OR操作 4849.2.10 扩充精度XOR操作 4849.2.11 扩充精度NOT操作 4859.2.12 扩充精度移位操作 4859.2.13 扩充精度循环操作 4889.2.14 扩充精度I/O 4899.3 对不同长度的操作数进行操作 5099.4 十进制算术运算 5109.4.1 文字BCD常量 5129.4.2 80x86的DAA指令和DAS指令 5129.4.3 80x86 AAA、AAS、AAM和AAD指令 5149.4.4 使用FPU的压缩十进制算术操作 5159.5 表 5179.5.1 通过表查找进行函数计算 5179.5.2 域调节 5219.5.3 产生表 5229.5.4 表查找的性能 5269.6 更多信息 526第10章 宏与HLA编译时语言 52710.1 本章概述 52710.2 编译时语言 52710.3 #PRINT和#ERROR语句 52810.4 编译时常量和变量 53010.5 编译时表达式和操作符 53010.6 编译时函数 53310.6.1 类型转换编译时函数 53310.6.2 数字编译时函数 53510.6.3 字符分类编译时函数 53510.6.4 编译时字符串函数 53510.6.5 编译时模式匹配函数 53610.6.6 编译时符号信息 53710.6.7 其他编译时函数 53810.6.8 编译时TEXT对象的类型转换 53910.7 条件编译(编译时决定) 54010.8 重复编译(编译时循环) 54410.9 宏(编译时过程) 54710.9.1 标准宏 54810.9.2 宏的参数 55010.9.3 宏中的局部符号 55610.9.4 作为编译时过程的宏 55910.9.5 使用宏模拟函数重载 55910.10 编写编译时“程序” 56510.10.1 在编译时构造数据表 56510.10.2 循环展开 57010.11 在不同的源文件中使用宏 57110.12 更多信息 571第11章 位操作 57311.1 本章概述 57311.2 位数据 57311.3 位操作指令 57411.4 作为位累加器的进位标志位 58111.5 位串的压缩与解压缩 58111.6 接合位组与分布位串 58411.7 压缩的位串数组 58611.8 搜索位 58811.9 位的计数 59011.10 倒置位串 59311.11 合并位串 59511.12 提取位串 59611.13 搜索位模式 59811.14 HLA标准库的位模块 59911.15 更多信息 600第12章 字符串指令 60212.1 本章概述 60212.2 80x86字符串指令 60212.2.1 字符串指令的操作过程 60312.2.2 REP/REPE/REPZ和REPNZ/REPNE前缀 60312.2.3 方向标志位 60412.2.4 MOVS指令 60612.2.5 CMPS指令 61112.2.6 SCAS指令 61412.2.7 STOS指令 61512.2.8 LODS指令 61512.2.9 从LODS和STOS构建复杂的字符串函数 61612.3 80x86字符串指令的性能 61712.4 更多信息 617第13章 MMX指令集 61813.1 本章概述 61813.2 判断CPU是否支持MMX指令集 61813.3 MMX编程环境 61913.3.1 MMX寄存器 61913.3.2 MMX数据类型 62113.4 设计MMX指令集的目的 62213.5 饱和算法和回转模式 62213.6 MMX指令操作数 62313.7 MMX技术指令 62513.7.1 MMX数据传递指令 62513.7.2 MMX转换指令 62513.7.3 MMX压缩算术指令 63013.7.4 MMX逻辑指令 63213.7.5 MMX比较指令 63413.7.6 MMX移位指令 63713.7.7 EMMS指令 63913.8 MMX编程方案 64013.9 更多信息 650第14章 类与对象 65114.1 本章概述 65114.2 通用原则 65114.3 HLA中的类 65314.4 对象 65614.5 继承 65714.6 重载 65814.7 虚拟方法与静态过程 65914.8 编写类方法和过程 66114.9 对象实现 66514.9.1 虚拟方法表 66814.9.2 带继承的对象表达式 66914.10 构造函数和对象初始化 67314.10.1 构造函数中的动态对象分配 67414.10.2 构造函数和继承 67614.10.3 构造函数的参数和过程重载 68014.11 析构函数 68014.12 HLA的“_initialize_”和“_finalize_”字符串 68114.13 抽象方法 68714.14 运行时类型信息(RTTI) 69014.15 调用基类的方法 69114.16 更多信息 692第15章 混合语言编程 69315.1 本章概述 69315.2 在同一程序中混合使用HLA和MASM/Gas代码 69315.2.1 在HLA程序中内嵌(MASM/Gas)汇编代码 69315.2.2 链接MASM/Gas汇编模块和HLA模块 69615.3 使用Delphi/Kylix和HLA编程 70015.3.1 链接HLA模块与Delphi/Kylix程序 70115.3.2 寄存器保存 70415.3.3 函数的结果 70515.3.4 调用惯例 71115.3.5 Kylix中的值传递、引用传递、CONST参数和OUT参数 71715.3.6 Delphi/Kylix和HLA之间对应的标量数据类型 71815.3.7 在Delphi/Kylix和HLA代码之间传递字符串数据 72015.3.8 在HLA和Kylix之间传递记录数据 72215.3.9 在Delphi/Kylix和HLA之间传递集合数据 72615.3.10 在HLA和Delphi/Kylix之间传递数组数据 72715.3.11 从HLA代码中引用Delphi/Kylix对象 72715.4 使用C/C++和HLA编程 73015.4.1 链接HLA模块和C/C++程序 73115.4.2 寄存器保存 73415.4.3 函数结果 73415.4.4 调用惯例 73415.4.5 C/C++中的值传递和引用传递 73815.4.6 C/C++和HLA之间的标量数据类型一致性 73815.4.7 在C/C++和HLA代码之间传递字符串数据 74015.4.8 在HLA和C/C++之间传递记录/结构数据 74015.4.9 在HLA和C/C++之间传递数组数据 74215.5 更多信息 742附录A ASCII字符集 743附录B 80x86指令集 747
- 战争风云:第二次世界大战新史(精装)(安德鲁·罗伯茨[英] 著)
- 一个行者的传奇:分文不带走美国(麦金太尔(Mclntyre.M.) 著,向晓红,)
- 一带一路与中国对外开放新格局(毛新雅,焦永利 编著,人民)
- 大维均值向量和协方差矩阵的检验(张秋妍 著,中国统计)
- 日本中老年时装(白锡尧编译,浙江人民)
- 现代测试技术原理与应用(何广军 著 何广军 编,国防工业)
- 兽医病毒学((美)S.B.莫汉蒂(Sashi B.Mohan)
- 中国战争诗歌(汪守德 著,解放军文艺)
