附录A x86

A.1 数据类型

16位(8086/80286)、32位(80386等)和64位系统常用的数据类型有:

byte(字节):8位数据。声明字节型数组和变量的汇编伪指令是DB。计算机使用寄存器的低8位空间存储字节型数据。也就是说,字节型数据通常存储在(寄存器助记符)AL/BL/CL/DL/AH/BH/ CH/DH/SIL/DIL/R*L里。

word(字):16位数据。声明字型数组和变量的汇编伪指令是DW。计算机使用寄存器的16位空间存储word型数据。也就是说,字型数据通常存储在(寄存器助记符)AX/BX/CX/DX/SI/DI/R*W里。

dword/double word:32位数据。声明DWord型数组和变量的汇编伪指令是DD。x86 CPU的标准寄存器及x64 CPU寄存器的32位空间都可存储DWord型数据。16位应用程序则用寄存器对来存储DWord型数据。

qword/quad word:64位数据。声明QWord型数组和变量的汇编伪指令是DQ。32位系统使用一对寄存器来存储QWord型数据。

tbyte(10字节型):80位,即10字节数据。符合IEEE 754标准的FPU寄存器都采用这种类型的数据。

paragraph(16字节型):这种类型的数据主要出现在MS-DOS操作系统的程序里。

Windows API所定义的各种同名的数据类型(包括BYTE WORD DWORD)及其数据存储空间,同样遵循上述标准。

A.2 通用寄存器

x86-64的CPU可以直接调用多数通用寄存器的8位(byte)和16位(word)存储空间。通用寄存器有前向兼容的特性(可兼容最早的8080CPU)。早期的8位CPU(例如8080)可以用一对8位寄存器存储一个16位数据。如此一来,面向早期8080平台的程序就可以照常访问16位寄存器的低8位空间、高8位空间,还能够把这两个寄存器的数据当作一个整体的16位寄存器使用。x86平台的这种前向兼容的特性,或许是为了方便人们在不同平台上移植程序。而采用RISC精简指令集的CPU则通常没有这种特性。

此外,x86-64 CPU上有R开头的寄存器,而80386以后的CPU都有E开头的寄存器。可见,R-寄存器属于64位寄存器,而E-寄存器属于32位寄存器。

x86-64 CPU还比x86 CPU多了8个通用寄存器,即R8~R15寄存器。

在Intel官方手册中,这些寄存器的低8位空间(byte)的助记符带有“L”后缀(例如R8L),而IDA程序则给它们加上了后缀“B”(例如R8B)。

A.2.1 RAX/EAX/AX/AL
7
6
5
4
3
2
1
0
RAXx64
EAX
AX
AH
AL

又称累加寄存器(Accumulator)。函数的返回值通常保存在这个寄存器里。

A.2.2 RBX/EBX/BX/BL
7
6
5
4
3
2
1
0
RBXx64
EBX
BX
BH
BL
A.2.3 RCX/ECX/CX/CL
7
6
5
4
3
2
1
0
RCXx64
ECX
CX
CH
CL

又称计数器(Counter)。“REP”开头的指令、位移运算(SHL/SHR/RxL/RxR)通常都会影响这个寄存器的状态。

A.2.4 RDX/EDX/DX/DL
7
6
5
4
3
2
1
0
RDXx64
EDX
DX
DH
DL
A.2.5 RSI/ESI/SI/SIL
7
6
5
4
3
2
1
0
RSIx64
ESI
SI
SILx64

又称源寄存器(Source),是REP MOVSx和REP CMPSx指令默认的数据源。

A.2.6 RDI/EDI/DI/DIL
7
6
5
4
3
2
1
0
RDIx64
EDI
DI
DILx64

又称目标寄存器(Destination),是REP MOVSx、REP STOSx指令默认的目标寄存器。

A.2.7 R8/R8D/R8W/R8L
7
6
5
4
3
2
1
0
R8
R8D
R8W
R8L
A.2.8 R9/R9D/R9W/R9L
7
6
5
4
3
2
1
0
R9
R9D
R9W
R9L
A.2.9 R10/R10D/R10W/R10L
7
6
5
4
3
2
1
0
R10
R10D
R10W
R10L
A.2.10 R11/R11D/R11W/R11L
7
6
5
4
3
2
1
0
R11
R11D
R11W
R11L
A.2.11 R12/R12D/R12W/R12L
7
6
5
4
3
2
1
0
R12
R12D
R12W
R12L
A.2.12 R13/R13D/R13W/R13L
7
6
5
4
3
2
1
0
R13
R13D
R13W
R13L
A.2.13 R14/R14D/R14W/R14L
7
6
5
4
3
2
1
0
R14
R14D
R14W
R14L
A.2.14 R15/R15D/R15W/R15L
7
6
5
4
3
2
1
0
R15
R15D
R15W
R15L
A.2.15 RSP/ESP/SP/SPL
7
6
5
4
3
2
1
0
RSP
ESP
SP
SPL