x64保护模式-指令架构

一、寄存器架构

(1)在x86中,存在8个通用寄存器 eax,ebx,edx,ecx,esi,edi,esp,ebp。而在x64中新增了r8-r15这些通用寄存器。并且新增了8位寄存器 spl bpl sil dil。

```
Examle:
mov spl,0x0 //影响寄存器的最后2字节
```

(2)对r8-r15进行拆分,例如,r8w是16位的, r8d 是32位的。同样,增加了9个128位的浮点寄存器,XMM0-XMM8,是用于多媒体。
(3)x64没有pushad/aq这些指令。因此x64想要保存堆栈只能依次push来保存堆栈和寄存器环境。

二、与x86的地址区别

1、x64中,线性地址只有48位有效,可以理解为从0x0-0xffffffffffff。0-700000000000是UserAddress,800000000000-ffffffffffff是内核空间

(1)其中高16位是地址符号扩展,要么全1,要么全0。
(2)canonical和non-canonical地址的区别是高16位若全为0;1则是canonical(规范地址)

注意事项:

假设存在地址0xFFFF800000000000
但是要注意的是微软的内核地址会在高位补上一个F,也就是0xfffff80000000000,从80000000000开始,只用了44位的地址。

三、全局变量寻址

(1)x86架构下,全局变量的寻址直接是ds:[consant],但是x64下不是这样,是RIP+offset偏移。也就是说x64在编译的时候就确定了变量的地址,
Example:

这个全局变量的地址计算==RIP+7+0xA81B=17F60C000。