参考

《x86_x64体系探索及编程》

《Intel 开发手册》

x64与x86指令架构的区别

1.寄存器区别

在x86中通用寄存器:

image-20250407232330992

在x64中的通用寄存器:
新增加了R8R15:64位(Rxx)、32位(RxxD)、16位(RxxW)、8位(RxxB
新增加的8位寄存器:spl,bpl,sil,dil
新增加的9个128位的浮点寄存器:XMM0
XMM8。多用于多媒体。
x64位没有pushad/aq这些指令,因此x64想要保存堆栈只能依次PUSH来保存堆栈和寄存器环境。

2.地址差别

x64中,线性地址中只有48位有效:0x0~0xFFFFFFFFFFFF

其中,0x0-0x700000000000是UserAddress(用户地址),而0x700000000000-0xFFFFFFFFFFFF是内核空间。

image-20250407232302366

高16位必须要么全是0,要么全是1,这种形式的地址被称为canonical地址
然而,在x64 体系里只实现了48.位的 virtual address,高 16 位被用做符号扩展。
与canonical地址形式相对的是 non-canoncial地址形式,如下所示。在64位模式下
non-canonical地址形式是不合法的。(符号扩展位出现了问题)