《汇编语言编程艺术》是2005年清华大学出版社出版的图书,作者是海德。
- 书名 汇编语言编程艺术
- 作者 海德(Hyde,R.)
- 译者 陈曙晖
- 出版社 清华大学出版社
- 出版时间 2005年01月01日
内容简介
本书以X86系列微机为背景,从简单的Hello程低胡主伟宜充序开始,系统而详细地阐述了X86微机汇编语言编程的行种基础知识和编程技巧展,内容涉及到数据表示、存储器管理、各种数据类型、过程、与汇编语言相关的体系结构、控制结构、文件、宏指令、位处理指令、字符串指令、MMX指令、类和对象,以及混合语言编程来自等,尤其是在高级汇编语言(HLA)方面,该书给予了细致深入的讲解。对于有意学习X86汇编语言编程的程序员来说,这是一本难得的好书。\r\n 本书的作者Randall Hyde拥有十多年的汇编语言教学经验,并且开发了多个商用软件,具有实际的汇编语言但据罪开发经验。该书的英文网络版受到全球成千上万的网站和高级程序员集程木史菜跟石注的高度评价,被大家公推为高级汇编语言编程的经典之作。
目录
目录
第1章进360百科入汇编语言的世界 1
1审征.1本章概述 1
1.2HLA程序的结构 1
1.3运行第一个HLA程序 3
1.4基本的HL前衡氢子头A数据声明 4
1.5布尔值 6
1.6字符值 6
1.7Intel80x86处理器简介 7
1.8基本的机器指令 11
1.9基本的HLA控制结构 15
1.9.1HLA语句中的布尔表达式 15
1.9.2HLA的IF..THEN..ELSEIF..ELSE欢表笔..ENDIF语句 17
1.9.3布尔表达式中的逻辑与、逻辑或以及逻辑非 19
1.9.4WHILE..ENDWHILE语句 21
1.9.5FOR..EN医居势打DFOR语句 21
1.散9.6REPEAT..UNTIL语句 22
1.9.7BREAK和BREAKIF语句 23
1.9.8FOREVER..ENDFOR语句 23
1.9.9TRY..EXCEPTION..ENDTRY语句 24
1.10HLA标准库入门 27
不举府广深地孔案1.10.1STDIO模块中的预定义常量 28
1.10.2标准输入与标语准输出 29
1.10.3stdout.ne那句应子左系又wln例程 29
1.10.4stdout.情限娘putiX例程 29
1.10.5stdout.putiXSize例程 30
切件但尔看胡 1.10.6stdout.白布苗put例程 31
1.10.7stdin.getc例程 32
1.10.8st界左政写待记永测din.getiX例程 34
1.10.9stdin.readLn与stdin.flushInput例程 35
1.10.10stdin.get例程 36
1.11关于TRY..E台岁困安搞诉NDTRY的其他细节 36
1.11.1TRY..ENDTRY嵌套语句 37
1.11.2TRY..E错衣谁哥流宜苗玉NDTRY语句中不受保护的子句 39
1.11.3TRY..ENDTRY语句中的ANYEXCEPTION子句 42
1.11.4寄存器与TRY..ENDTRY语句 42
1.12高级汇编语言与低级汇编语言的比较 44
1.13更多信息 45
第2章数据表示 46
2.1本章概述 46
2.2数字系统 46
2.2.1回顾十进制系统 46
2.2.2二进制数字系统 47
2.2.3二进制格式 48
2.3十六进制数字系统 49
2.4数据结构 51
2.4.1位 51
2.4.2半字节 51
2.4.3字节 52
2.4.4字 53
2.4.5双字 54
2.4.6四字与长字 55
2.5二进制数与十六进制数的算术运算 56
2.6关于数字及其表示法 56
2.7位逻辑运算 59
2.8二进制数和位串的逻辑运算 61
2.9有符号数和无符号数 63
2.10符号扩展、零扩展、压缩和饱和 67
2.11移位和循环移位 71
2.12位域和压缩数据 75
2.13浮点运算简介 79
2.13.1IEEE浮点格式 82
2.13.2HLA为浮点数值提供的支持 85
2.14BCD数据表示 88
2.15字符 89
2.15.1ASCII字符译码 89
2.15.2HLA对ASCII字符提供的支持 92
2.16Unicode字符集 96
2.17更多信息 96
第3章存储器的访问与结构 97
3.1本章概述 97
3.280x86的寻址方式 97
3.2.180x86寄存器寻址方式 97
3.2.280x86的32位存储器寻址方式 98
3.3运行时存储器的结构 104
3.3.1代码段 105
3.3.2静态段 106
3.3.3只读数据段 107
3.3.4存储段 108
3.3.5@NOSTORAGE属性 108
3.3.6Var段 109
3.3.7程序中声明段的结构 110
3.4HLA如何为变量分配内存 111
3.5HLA对数据对齐的支持 112
3.6地址表达式 115
3.7类型强制转换 117
3.8寄存器类型强制转换 119
3.9栈段与PUSH及POP指令 120
3.9.1基本的PUSH指令 120
3.9.2基本的POP指令 121
3.9.3用PUSH和POP指令来保护寄存器 123
3.9.4栈的LIFO数据结构 123
3.9.5其他的PUSH和POP指令 125
3.9.6不使用出栈而从栈内移除数据 127
3.9.7访问已入栈而未出栈的数据 129
3.10动态内存分配和堆段 130
3.11INC和DEC指令 134
3.12获取存储器对象的地址 134
3.13更多信息 135
第4章常量、变量与数据类型 136
4.1本章概述 136
4.2一些额外的指令:INTMUL、BOUND、INTO 136
4.3TBYTE数据类型 141
4.4HLA常量和数值声明 141
4.4.1常量类型 145
4.4.2字符串和字符字面常量 145
4.4.3CONST段中的字符串常量与文本常量 147
4.4.4常量表达式 149
4.4.5HLA程序中的多个CONST段以及它们的顺序 151
4.4.6HLA的VAL段 151
4.4.7在程序中的任意位置修改VAL对象 152
4.5HLA的TYPE段 153
4.6ENUM和HLA枚举数据类型 154
4.7指针数据类型 155
4.7.1在汇编语言中使用指针 156
4.7.2在HLA中声明指针 157
4.7.3指针常量和指针常量表达式 158
4.7.4指针变量和动态内存分配 159
4.7.5指针的常见问题 160
4.8HLA标准库CHARS.HHF模型 164
4.9复合数据类型 166
4.10字符串 167
4.11HLA字符串 169
4.12访问字符串中的某个字符 175
4.13HLA字符串模块和其他与字符串相关的例程 177
4.14存储器内转换 188
4.15字符集 190
4.16在HLA中实现字符集 190
4.17HLA字符集常量和字符集表达式 192
4.18HLAHLL布尔表达式中的IN操作符 193
4.19HLA标准库对字符集的支持 194
4.20在HLA程序中使用字符集 197
4.21数组 198
4.22在HLA程序中声明数组 199
4.23HLA数组常量 200
4.24访问一维数组的元素 201
4.25多维数组 204
4.25.1以行为主排列 205
4.25.2以列为主排列 208
4.26多维数组的存储空间分配 209
4.27汇编语言中多维数组元素的访问 211
4.28大数组和MASM(只适用于Windows程序员) 212
4.29记录 212
4.30记录常量 215
4.31记录数组 216
4.32数组/记录作为记录字段 217
4.33控制记录中的字段偏移量 220
4.34对齐记录中的字段 221
4.35记录指针 223
4.36联合 224
4.37匿名联合 226
4.38变量类型 227
4.39联合常量 228
4.40命名空间 229
4.41汇编语言中的动态数组 232
4.42HLA标准库数组支持 234
4.43更多信息 237
第5章过程与单元 238
5.1本章概述 238
5.2过程 238
5.3机器状态的保存 240
5.4过程的提前返回 244
5.5局部变量 245
5.6其他局部和全局符号类型 250
5.7参数 250
5.7.1值传递 251
5.7.2引用传递 254
5.8函数和函数的结果 257
5.8.1返回函数结果 257
5.8.2HLA的指令合成 258
5.8.3HLA过程的@RETURNS选项 260
5.9递归 262
5.10过程的向前引用 266
5.11过程的底层实现与CALL指令 267
5.12过程与堆栈 269
5.13活动记录 272
5.14标准入口序列 275
5.15标准出口序列 276
5.16自动(局部)变量的底层实现 277
5.17参数的底层实现 279
5.17.1在寄存器中传递参数 279
5.17.2在代码流中传递参数 281
5.17.3在堆栈中传递参数 284
5.18过程指针 304
5.19过程参数 307
5.20无类型的引用参数 308
5.21管理大型程序 309
5.22#INCLUDE伪指令 310
5.23忽略重复的#INCLUDE操作 311
5.24单元与EXTERNAL伪指令 312
5.24.1伪指令EXTERNAL的行为 316
5.24.2HLA中的头文件 317
5.25命名空间的污染 319
5.26更多信息 321
第6章算术运算 322
6.1本章概述 322
6.280x86的整数运算指令 322
6.2.1MUL和IMUL指令 322
6.2.2DIV和IDIV指令 325
6.2.3CMP指令 327
6.2.4SETcc指令 331
6.2.5TEST指令 333
6.3算术表达式 334
6.3.1简单赋值语句 335
6.3.2简单表达式 336
6.3.3复杂表达式 338
6.3.4可交换运算符 342
6.4逻辑(布尔)表达式 343
6.5机器特征与运算技巧 345
6.5.1不使用MUL、IMUL或INTMUL的乘法 346
6.5.2不使用DIV或IDIV的除法 347
6.5.3使用AND实现模N计数器 347
6.5.4疏忽使用机器特性 348
6.6浮点运算 348
6.6.1FPU寄存器 348
6.6.2FPU的数据类型 355
6.6.3FPU的指令集 356
6.6.4FPU的数据转移指令 356
6.6.5换算指令 358
6.6.6算术运算指令 360
6.6.7比较指令 365
6.6.8常量指令 367
6.6.9超越指令 367
6.6.10其他指令 369
6.6.11整数操作 370
6.7浮点表达式到汇编语言的转换 370
6.7.1算术表达式到后缀表示法的转换 372
6.7.2把后缀表达式转换成汇编语言 373
6.8HLA标准库对浮点算术运算的支持 375
6.8.1函数stdin.getf和fileio.getf 375
6.8.2HLA数学库中的三角函数 375
6.8.3HLA数学库中的指数函数和对数函数 376
6.9算术运算小结 377
第7章低级控制结构 378
7.1本章概述 378
7.2低级控制结构 378
7.3语句标号 378
7.4无条件控制转移(JMP) 380
7.5条件跳转指令 383
7.6"中级"控制结构:JT和JF 386
7.7使用汇编语言实现通用控制结构 386
7.8选择 386
7.8.1IF..THEN..ELSE序列 388
7.8.2将HLA的IF语句翻译成纯汇编语言语句 391
7.8.3使用完全布尔求值实现复杂的IF语句 396
7.8.4"短路"布尔求值 397
7.8.5"短路"布尔求值与完全布尔求值 399
7.8.6汇编语言中IF语句的高效实现 401
7.8.7SWITCH/CASE语句 405
7.9状态机和间接跳转 415
7.10"面条式"代码 418
7.11循环 418
7.11.1WHILE循环 419
7.11.2REPEAT..UNTIL循环 420
7.11.3FOREVER..ENDFOR循环 421
7.11.4FOR循环 422
7.11.5BREAK和CONTINUE语句 423
7.11.6寄存器的使用与循环 427
7.12性能提高 428
7.12.1将结束条件判断放在循环结尾 429
7.12.2反向执行循环 431
7.12.3循环不变计算 432
7.12.4循环展开 433
7.12.5归纳变量 434
7.13HLA中的混合控制结构 435
7.14更多信息 437
第8章文件 438
8.1本章概述 438
8.2文件组织 438
8.2.1作为记录列表的文件 438
8.2.2二进制文件与文本文件的比较 440
8.3顺序文件 442
8.4随机访问文件 449
8.5ISAM文件 453
8.6截断文件 456
8.7更多信息 458
第9章高级算术运算 459
9.1本章概述 459
9.2多精度操作 459
9.2.1扩充精度操作的HLA标准库支持 459
9.2.2多精度加法操作 462
9.2.3多精度减法操作 464
9.2.4扩充精度比较操作 465
9.2.5扩充精度乘法操作 470
9.2.6扩充精度除法操作 473
9.2.7扩充精度NEG操作 482
9.2.8扩充精度AND操作 483
9.2.9扩充精度OR操作 484
9.2.10扩充精度XOR操作 484
9.2.11扩充精度NOT操作 485
9.2.12扩充精度移位操作 485
9.2.13扩充精度循环操作 488
9.2.14扩充精度I/O 489
9.3对不同长度的操作数进行操作 509
9.4十进制算术运算 510
9.4.1文字BCD常量 512
9.4.280x86的DAA指令和DAS指令 512
9.4.380x86AAA、AAS、AAM和AAD指令 514
9.4.4使用FPU的压缩十进制算术操作 515
9.5表 517
9.5.1通过表查找进行函数计算 517
9.5.2域调节 521
9.5.3产生表 522
9.5.4表查找的性能 526
9.6更多信息 526
第10章宏与HLA编译时语言 527
10.1本章概述 527
10.2编译时语言 527
10.3#PRINT和#ERROR语句 528
10.4编译时常量和变量 530
10.5编译时表达式和操作符 530
10.6编译时函数 533
10.6.1类型转换编译时函数 533
10.6.2数字编译时函数 535
10.6.3字符分类编译时函数 535
10.6.4编译时字符串函数 535
10.6.5编译时模式匹配函数 536
10.6.6编译时符号信息 537
10.6.7其他编译时函数 538
10.6.8编译时TEXT对象的类型转换 539
10.7条件编译(编译时决定) 540
10.8重复编译(编译时循环) 544
10.9宏(编译时过程) 547
10.9.1标准宏 548
10.9.2宏的参数 550
10.9.3宏中的局部符号 556
10.9.4作为编译时过程的宏 559
10.9.5使用宏模拟函数重载 559
10.10编写编译时"程序" 565
10.10.1在编译时构造数据表 565
10.10.2循环展开 570
10.11在不同的源文件中使用宏 571
10.12更多信息 571
第11章位操作 573
11.1本章概述 573
11.2位数据 573
11.3位操作指令 574
11.4作为位累加器的进位标志位 581
11.5位串的压缩与解压缩 581
11.6接合位组与分布位串 584
11.7压缩的位串数组 586
11.8搜索位 588
11.9位的计数 590
11.10倒置位串 593
11.11合并位串 595
11.12提取位串 596
11.13搜索位模式 598
11.14HLA标准库的位模块 599
11.15更多信息 600
第12章字符串指令 602
12.1本章概述 602
12.280x86字符串指令 602
12.2.1字符串指令的操作过程 603
12.2.2REP/REPE/REPZ和REPNZ/REPNE前缀 603
12.2.3方向标志位 604
12.2.4MOVS指令 606
12.2.5CMPS指令 611
12.2.6SCAS指令 614
12.2.7STOS指令 615
12.2.8LODS指令 615
12.2.9从LODS和STOS构建复杂的字符串函数 616
12.380x86字符串指令的性能 617
12.4更多信息 617
第13章MMX指令集 618
13.1本章概述 618
13.2判断CPU是否支持MMX指令集 618
13.3MMX编程环境 619
13.3.1MMX寄存器 619
13.3.2MMX数据类型 621
13.4设计MMX指令集的目的 622
13.5饱和算法和回转模式 622
13.6MMX指令操作数 623
13.7MMX技术指令 625
13.7.1MMX数据传递指令 625
13.7.2MMX转换指令 625
13.7.3MMX压缩算术指令 630
13.7.4MMX逻辑指令 632
13.7.5MMX比较指令 634
13.7.6MMX移位指令 637
13.7.7EMMS指令 639
13.8MMX编程方案 640
13.9更多信息 650
第14章类与对象 651
14.1本章概述 651
14.2通用原则 651
14.3HLA中的类 653
14.4对象 656
14.5继承 657
14.6重载 658
14.7虚拟方法与静态过程 659
14.8编写类方法和过程 661
14.9对象实现 665
14.9.1虚拟方法表 668
14.9.2带继承的对象表达式 669
14.10构造函数和对象初始化 673
14.10.1构造函数中的动态对象分配 674
14.10.2构造函数和继承 676
14.10.3构造函数的参数和过程重载 680
14.11析构函数 680
14.12HLA的"_initialize_"和"_finalize_"字符串 681
14.13抽象方法 687
14.14运行时类型信息(RTTI) 690
14.15调用基类的方法 691
14.16更多信息 692
第15章混合语言编程 693
15.1本章概述 693
15.2在同一程序中混合使用HLA和MASM/Gas代码 693
15.2.1在HLA程序中内嵌(MASM/Gas)汇编代码 693
15.2.2链接MASM/Gas汇编模块和HLA模块 696
15.3使用Delphi/Kylix和HLA编程 700
15.3.1链接HLA模块与Delphi/Kylix程序 701
15.3.2寄存器保存 704
15.3.3函数的结果 705
15.3.4调用惯例 711
15.3.5Kylix中的值传递、引用传递、CONST参数和OUT参数 717
15.3.6Delphi/Kylix和HLA之间对应的标量数据类型 718
15.3.7在Delphi/Kylix和HLA代码之间传递字符串数据 720
15.3.8在HLA和Kylix之间传递记录数据 722
15.3.9在Delphi/Kylix和HLA之间传递集合数据 726
15.3.10在HLA和Delphi/Kylix之间传递数组数据 727
15.3.11从HLA代码中引用Delphi/Kylix对象 727
15.4使用C/C++和HLA编程 730
15.4.1链接HLA模块和C/C++程序 731
15.4.2寄存器保存 734
15.4.3函数结果 734
15.4.4调用惯例 734
15.4.5C/C++中的值传递和引用传递 738
15.4.6C/C++和HLA之间的标量数据类型一致性 738
15.4.7在C/C++和HLA代码之间传递字符串数据 740
15.4.8在HLA和C/C++之间传递记录/结构数据 740
15.4.9在HLA和C/C++之间传递数组数据 742
15.5更多信息 742
附录AASCII字符集 743
附录B80x86指令集 747