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)及其数据存储空间,同样遵循上述标准。
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)。
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
RAXx64
|
|||||||
EAX
|
|||||||
AX
|
|||||||
AH
|
AL
|
又称累加寄存器(Accumulator)。函数的返回值通常保存在这个寄存器里。
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
RBXx64
|
|||||||
EBX
|
|||||||
BX
|
|||||||
BH
|
BL
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
RCXx64
|
|||||||
ECX
|
|||||||
CX
|
|||||||
CH
|
CL
|
又称计数器(Counter)。“REP”开头的指令、位移运算(SHL/SHR/RxL/RxR)通常都会影响这个寄存器的状态。
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
RDXx64
|
|||||||
EDX
|
|||||||
DX
|
|||||||
DH
|
DL
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
RSIx64
|
|||||||
ESI
|
|||||||
SI
|
|||||||
SILx64
|
又称源寄存器(Source),是REP MOVSx和REP CMPSx指令默认的数据源。
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
RDIx64
|
|||||||
EDI
|
|||||||
DI
|
|||||||
DILx64
|
又称目标寄存器(Destination),是REP MOVSx、REP STOSx指令默认的目标寄存器。
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
R8
|
|||||||
R8D
|
|||||||
R8W
|
|||||||
R8L
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
R9
|
||||||||
R9D
|
||||||||
R9W
|
||||||||
R9L
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
R10
|
||||||||
R10D
|
||||||||
R10W
|
||||||||
R10L
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
R11
|
||||||||
R11D
|
||||||||
R11W
|
||||||||
R11L
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
R12
|
||||||||
R12D
|
||||||||
R12W
|
||||||||
R12L
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
R13
|
||||||||
R13D
|
||||||||
R13W
|
||||||||
R13L
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
R14
|
||||||||
R14D
|
||||||||
R14W
|
||||||||
R14L
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
R15
|
||||||||
R15D
|
||||||||
R15W
|
||||||||
R15L
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
RSP
|
||||||||
ESP
|
||||||||
SP
|
||||||||
SPL
|