一、简介
X86:32位系统,是指操作系统一次性可以处理的位数是32。x86指的是一种cpu的架构,x86架构的特点是cpu的寄存器是32位的。
X64:也可写作X86-64,64位系统,指操作系统一次性可以处理的位数是64。x64架构的特点是cpu的寄存器是64位的。
二、数据类型长度
不同位数OS下的变量类型的长度如下:
32位平台
char 1个字节8位
short 2个字节16位
int 4个字节32位
long 4个字节
long long 8个字节
指针 4个字节
64位平台
char 1个字节
short 2个字节
int 4个字节
long 8个字节(区别)
long long 8个字节
指针 8个字节(区别)
三、寄存器
32位系统的寄存器如下:
64位系统的寄存器如下:
在64位模式下,有16个64位宽通用寄存器(32位模式是8个通用寄存器),默认的操作数宽度是32位(注:与32位模式相同)。但是,通用寄存器保存32位或64位的操作数。如果指定了32位操作数,则可以使用EAX/EBX/ECX/EDX/EBP/ESP/ESI/EDI和新增的R8D~R15D(注:这里D表示Doubledord,32比特宽)。
如果是64位的操作数,则可以使用RAX/RBX/RCX/RDX/RBP/RSP/RSI/RDI和新增的R8~R15。所有的这些寄存器都可以按字节/单字/双字/四字/八字为单位访问。REX指令前缀用来生成64位的操作数,或者用于访问寄存器R8~R15。
当从64位模式切换到兼容模式,再返回到64位模式后,仅存在于64位模式下的寄存器(R8~R15和XMM8~XMM15)中的值会保持不变。但是如果从64位模式切换到兼容模式,再切换到传统模式(注:即32位保护模式或SMM模式)或实模式,最后通过兼容模式返回到64位模式后,R8~R15和XMM8~XMM15寄存器中的值是未定义的(undefined)。
区别有:
- 64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。
- 32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值
- 64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用
- 64位支持一些形式的以PC相关的寻址,而32位只有在jmp的时候才会用到这种寻址方式。