图书目录

目  录

  

第1章  数据表示与数值运算 1

1.1  计数制 1

1.1.1  十进制(decimal) 1

1.1.2  二进制(binary) 2

1.1.3  八进制(octal) 2

1.1.4  十六进制(hexadecimal) 3

1.2  进制数间的转换 3

1.2.1  十进制转二进制 3

1.2.2  十进制转八进制和十六进制 4

1.2.3  十进制转二进制加法口算 5

1.2.4  十进制转二进制减法口算 6

1.2.5  十进制转二进制其他口算 6

1.3  计算机的性能指标 6

1.3.1  字长 7

1.3.2  存储容量 7

1.3.3  主频 7

1.3.4  运算速度 7

1.3.5  可靠性 7

1.3.6  系统可维护性 8

1.4  数值的表示 8

1.4.1  无符号整数的表示 8

1.4.2  有符号整数的表示(补码等) 10

1.4.3  移码 12

1.4.4  BCD码 13

1.4.5  浮点数 13

1.4.6*  浮点数按整数比较大小 17

1.5  字符的表示 19

1.5.1  ASCII码 19

1.5.2  机内码 19

1.5.3  Unicode 23

1.5.4  UTF-8 25

1.5.5  点阵字形码 26

1.5.6  矢量字形码 30

1.6  校验码 30

1.6.1  码距 30

1.6.2  奇偶校验码 31

1.6.3  海明校验码 32

1.6.4  循环冗余校验码 34

1.7  数值运算 38

1.7.1  定点整数加法运算 38

1.7.2  定点整数减法运算 39

1.7.3  溢出与检测方法 39

1.7.4  定点整数加减法的逻辑实现 41

1.7.5  定点整数乘法运算 43

1.7.6  定点整数除法运算 45

1.7.7  浮点数加减运算 51

1.7.8  浮点数乘除运算 56

习题1 58

第2章  汇编语言基本组成 60

2.1  程序结构 60

2.1.1  选择处理器伪指令 61

2.1.2  .MODEL伪指令 62

2.1.3  指明是否区分大小写 62

2.1.4  要引用的头文件和库文件 63

2.1.5  函数原型声明 63

2.1.6  变量的定义及使用 63

2.1.7  数据段和代码段的定义 65

2.1.8  单行注释与块注释 65

2.1.9  指令、标号、分行(\) 66

2.1.10  INVOKE伪指令调用函数 66

2.1.11  程序结束 66

2.1.12  汇编结束 67

2.2  数据类型 67

2.2.1  整数 67

2.2.2  整数常量表达式 69

2.2.3  浮点数 72

2.2.4  字符 74

2.2.5  字符串 77

2.2.6  结构体 78

习题2 80

第3章  汇编语言的编译运行 84

3.1  VC 6.0编译运行C程序 84

3.1.1  VC 6.0的安装 85

3.1.2  运行C程序 85

3.1.3  配置VC 6.0环境 87

3.1.4  在命令行中编译运行C程序 89

3.2  MASM32编译运行汇编程序 90

3.2.1  MASM32的安装 90

3.2.2  运行MASM32程序 92

3.2.3  配置MASM32环境 93

3.2.4  通过注册表配置环境 94

3.2.5  在命令行中编译运行汇编程序 95

3.3  VC 6.0编译运行汇编程序 98

3.4  VS 2022编译运行汇编程序 100

3.4.1  VS的安装 100

3.4.2  VS编译运行C程序 101

3.4.3  VS编译运行x86汇编程序 103

3.4.4  VS汇编程序调用C库文件 105

3.4.5  VS编译运行x64汇编程序 106

3.4.6  安装高亮插件 108

3.5  C/C++嵌入汇编指令 111

3.5.1  用汇编指令访问C程序整型变量 111

3.5.2  用汇编指令读C程序整型数组元素 112

3.5.3  汇编指令写入C字符数组 112

3.6  C反汇编生成汇编源程序 114

3.6.1  设置C程序生成汇编源程序 114

3.6.2  修改C反汇编源程序 114

习题3 117

第4章  CPU指令系统及控制器 120

4.1  系统结构 121

4.2  微处理器 122

4.2.1  微处理器的基本结构 122

4.2.2  80386微处理器引脚 124

4.3  CPU寄存器 126

4.3.1  16位寄存器组 126

4.3.2  32位寄存器组 127

4.3.3  64位寄存器组 127

4.3.4  标志寄存器EFlags 128

4.4  80X86处理器工作模式 131

4.5  存储器访问 131

4.5.1  主存的分类 132

4.5.2  存储器的组织 132

4.5.3  CPU与存储器的连接 134

4.5.4  数据存储 135

4.5.5  数据对齐访问 136

4.5.6  数据非对齐访问 137

4.5.7  数据访问案例分析 137

4.6  机器指令及控制器设计 141

4.6.1  机器指令格式 143

4.6.2  机器指令编码 144

4.6.3  复杂指令集计算机 146

4.6.4  精简指令集计算机 146

4.6.5  控制器设计方法 146

4.6.6  时序系统 147

4.6.7  寄存器的设置 148

4.6.8  CPU指令流程分析 148

4.6.9  控制器的设计 149

4.7  操作数寻址方式 158

4.7.1  寄存器寻址方式 158

4.7.2  立即寻址方式 159

4.7.3  直接寻址方式 159

4.7.4  寄存器间接寻址方式 159

4.7.5  寄存器相对寻址方式 160

4.7.6  基址变址寻址方式 161

4.8  数据传送类指令 163

4.8.1  通用数据传送MOV[SX|ZX] 163

4.8.2  数据交换XCHG 165

4.8.3  字节查表转换XLAT[B] 166

4.8.4*  字节反向存储BSWAP 168

4.8.5  入栈PUSH/PUSHA[D] 168

4.8.6  出栈POP/POPA[D] 168

4.8.7  取地址LEA/L[DEFGS]S 169

4.8.8  EFlags与AH传送[L|S]AHF 170

4.8.9  EFlags出入栈PUSHFD/POPFD 170

4.8.10  进位位CF操作CLC/STC/CMC 170

4.8.11  方向位DF操作CLD/STD 170

4.8.12*  中断允许位IF操作CLI/STI 171

4.9  整数算术运算指令 171

4.9.1  加法ADD/ADC/INC/XADD 171

4.9.2  减法SUB/SBB/DEC/NEG 173

4.9.3  乘法MUL/IMUL 174

4.9.4  除法DIV/IDIV 175

4.9.5  符号扩展CBW/CWD/CDQ 176

4.9.6  整数比较CMP/CMPXCHG[8B] 177

4.10*  调整指令(实现大数运算) 179

4.10.1  数字字符加法调整AAA 179

4.10.2  数字字符减法调整AAS 181

4.10.3  二进制数调整为BCD码AAM 182

4.10.4  BCD码调整为二进制数AAD 182

4.10.5  BCD码加法调整DAA 183

4.10.6  BCD码减法调整DAS 184

4.11  逻辑运算指令 185

4.11.1  逻辑与操作AND 185

4.11.2  逻辑或操作OR 186

4.11.3  逻辑非操作NOT 186

4.11.4  逻辑异或操作XOR 186

4.11.5  逻辑比较测试TEST 187

4.12  位操作指令 188

4.12.1  算术移位SAL/SAR 188

4.12.2  逻辑移位SHL/SHR 189

4.12.3*  双精度移位SHLD/SHRD 190

4.12.4*  不带进位循环移位ROL/ROR 192

4.12.5*  带进位循环移位RCL/RCR 193

4.12.6*  位扫描BSF/BSR 193

4.12.7*  第i位操作BT[CRS] 195

4.13  串操作指令 196

4.13.1  重复前缀REP[E|Z|NE|NZ] 197

4.13.2  存串操作STOS[B|W|D] 198

4.13.3  移串操作MOVS[B|W|D] 199

4.13.4  取串操作LODS[B|W|D] 201

4.13.5  串扫描操作SCAS[B|W|D] 203

4.13.6  串比较操作CMPS[B|W|D] 204

4.13.7  输入串操作INS[B|W|D] 207

4.13.8  输出串操作OUTS[B|W|D] 207

4.14*  CPU控制指令 207

4.14.1  空操作指令NOP 207

4.14.2  等待指令WAIT 207

4.14.3  暂停指令HLT 208

4.14.4  封锁数据指令LOCK 208

4.14.5  获得CPU信息CPUID 208

4.14.6  读时间戳计数器RDTSC 209

习题4 210

第5章  FPU指令系统 221

5.1  FPU寄存器 221

5.1.1  浮点数据寄存器 221

5.1.2  浮点标记寄存器 222

5.1.3  浮点状态寄存器 222

5.1.4  浮点控制寄存器 224

5.2  FPU指令系统的约定 225

5.3  实数传送指令 226

5.3.1  实数加载FLD Src 227

5.3.2  整数加载FILD Src 227

5.3.3  BCD数加载FBLD Src 227

5.3.4  实数保存FST Dst 227

5.3.5  实数保存且出栈FSTP Dst 227

5.3.6  实数保存整数FIST Dst 227

5.3.7  保存整数且出栈FISTP Dst 227

5.3.8  保存BCD且出栈FBSTP Dst 229

5.3.9  实数交换FXCH[st(i)] 230

5.4  实数常量加载指令 230

5.4.1  实数0.0加载FLDZ 230

5.4.2  实数1.0加载FLD1 230

5.4.3  实数π加载FLDPI 230

5.4.4  实数log210加载FLDL2T 230

5.4.5  实数log2e加载FLDL2E 230

5.4.6  实数log102加载FLDLG2 231

5.4.7  实数loge2加载FLDLN2 231

5.5  实数比较指令 231

5.5.1  实数比较FCOM[P/PP] 231

5.5.2  实数与整数比较FICOM[P] 231

5.5.3  无序比较FUCOM[P/PP] 232

5.5.4  实数零检测FTST 232

5.5.5  存CPU比较F[U]COMI[P] 232

5.5.6  检测栈顶实数特征FXAM 233

5.6  实数加法指令 237

5.6.1  实数加FADD 238

5.6.2  实数加且出栈FADDP 238

5.6.3  实数加整数FIADD 238

5.7  实数减法指令 239

5.7.1  实数减FSUB 239

5.7.2  实数减且出栈FSUBP 239

5.7.3  实数减整数FISUB 239

5.7.4  反向减FSUBR 239

5.7.5  反向减且出栈FSUBRP 239

5.7.6  实数反向减整数FISUBR 239

5.8  实数乘法指令 240

5.8.1  实数乘FMUL 240

5.8.2  实数乘且出栈FMULP 241

5.8.3  实数乘以整数FIMUL 241

5.9  实数除法指令 241

5.9.1  实数除FDIV 242

5.9.2  实数除且出栈FDIVP 242

5.9.3  实数除以整数FIDIV 242

5.9.4  实数反向除FDIVR 242

5.9.5  反向除且出栈FDIVRP 242

5.9.6  实数反向除整数FIDIVR 242

5.10  浮点超越函数指令 243

5.10.1  正弦函数FSIN 243

5.10.2  余弦函数FCOS 244

5.10.3  正弦余弦函数FSINCOS 245

5.10.4  正切函数FPTAN 245

5.10.5  反正切函数FPATAN 246

5.10.6  实数平方根FSQRT 247

5.10.7  绝对值FABS 248

5.10.8  负数FCHS 249

5.10.9  取实数尾数和阶码FXTRACT 250

5.10.10  以2为底的对数FYL2X[P1] 251

5.10.11  就近舍入取整FRNDINT 252

5.10.12  取余FPREM/FPREM1 253

5.10.13  2的指数FSCALE/F2XM1 254

5.11*  FPU控制指令 257

5.11.1  初始化FPU操作F[N]INIT 257

5.11.2  保存状态字F[N]STSW 257

5.11.3  保存控制字F[N]STCW 257

5.11.4  加载控制字FLDCW 257

5.11.5  保存环境F[N]STENV 257

5.11.6  加载环境FLDENV 259

5.11.7  存环境与数据F[N]SAVE 259

5.11.8  读环境与数据FRSTOR 261

5.11.9  增加FPU栈指针FINCSTP 261

5.11.10  减少FPU栈指针FDECSTP 262

5.11.11  st(i)清空FFREE st(i) 263

5.11.12  清除异常F[N]CLEX 264

5.11.13  FPU空操作FNOP 264

5.11.14  FPU与CPU同步[F]WAIT 264

习题5 264

第6章  选择结构程序设计 268

6.1  .IF伪指令实现双分支选择 268

6.2  .IF….ELSEIF实现多分支选择 274

6.3  JMP和Jcc转移指令 276

6.4*  测试条件转存指令SETcc 285

6.5  浮点数的大小比较 287

6.6  散转程序设计 289

习题6 295

第7章  循环结构程序设计 300

7.1  当循环伪指令.WHILE 300

7.2  重复伪指令.REPEAT 302

7.3  数组的使用 304

7.3.1  一维数组的使用 304

7.3.2  二维数组的使用 307

7.4  .BREAK和.CONTINUE伪指令 309

7.5  循环指令LOOP[N][EZ][WD] 310

7.5.1  循环指令LOOP 311

7.5.2  相等或为零循环LOOP[EZ] 313

7.5.3  不为零循环LOOPN[EZ] 314

7.6  ECX为零转移指令JECXZ 316

7.7  LOOP/JECXZ循环指令存在的问题 317

习题7 320

第8章  模块化程序设计 329

8.1  子程序的定义 329

8.1.1  子程序定义的基本语法 329

8.1.2  子程序定义的完整语法 331

8.1.3  变参VARARG的使用 331

8.1.4  USES的使用 332

8.1.5  局部变量的定义 334

8.2  子程序的调用与返回 335

8.2.1  子程序用CALL调用 335

8.2.2  子程序用INVOKE调用 338

8.2.3  函数原型PROTO声明 338

8.2.4  函数EXTRN声明 340

8.2.5  返回指令RET 340

8.2.6  堆栈保护与恢复 341

8.3  不同数据类型作为形参的传递方法 344

8.3.1  整数参数的传递 344

8.3.2  字符参数的传递 345

8.3.3  整型数组参数的传递 346

8.3.4  字符串参数的传递 348

8.3.5  双精度浮点数参数的传递 349

8.4  递归程序设计 351

8.4.1  用C语言的递归方法求累加和 351

8.4.2  用汇编语言的递归方法求累加和 352

8.4.3  递归案例 353

8.5  C程序调用汇编子程序 359

8.5.1  C程序调用汇编子程序的方式 359

8.5.2  将C程序中的整型参数传入汇编程序 360

8.5.3  将C程序中的整型数组参数传入汇编程序 363

8.5.4  将C程序中的字符数组参数传入汇编程序 364

8.5.5  用C程序调用汇编函数重载 364

8.6  汇编程序调用C/C++函数 365

8.7  汇编程序引用C程序中的数组 368

8.8  C程序引用汇编程序中的数组 369

8.9  C程序与汇编程序混合编程俄罗斯方块 371

习题8 377

第9章  调试器使用简介 381

9.1  32位程序调试器Ollydbg 381

9.2  如何用Ollydbg逆向工程 382

9.3  用Ollydbg修改并保存 384

9.4  64位程序调试器x64dbg 385

9.5  32/64位程序调试器IDA 386

习题9 387

第10章  I/O系统 388

10.1  I/O系统概述 388

10.1.1  I/O系统的组成 388

10.1.2  I/O设备编址 388

10.2  I/O接口 389

10.2.1  I/O接口的基本功能 389

10.2.2  I/O接口的分类 389

10.2.3  总线结构 390

10.2.4  常用系统总线 391

10.3  I/O数据传输控制方式 393

10.3.1  程序直接控制方式 393

10.3.2  中断方式 394

10.3.3  直接存储器访问方式 397

10.3.4  I/O通道方式 398

10.3.5  I/O处理机和外围处理机 400

习题10 400

参考文献 402

附录A 403

附录A.1  ASCII值为00H~1FH的控制字符 403

附录A.2  ASCII值为20H~7FH的西文字符 403

附录A.3  用C程序输出GB 2312汉字 404

附录A.4  用C程序输出GB 2312特殊符号 404

附录A.5  用C程序输出Unicode汉字 405

附录A.6  Unicode转UTF-8 406

附录A.7  将矢量字体解析为位图 406

  

  

 

  

·XIV·

  

·XIII·