一、通用寄存器
64位下的通用寄存器

其中 rflag高32位一直为0,因为现在还用不到
xmm0~xmm15是浮点寄存器,128位的
对比32位下的通用寄存器


ST0到ST7这些是32位下的浮点寄存器
二、虚拟地址空间

用户层的有效地址范围是0x00000000 ` 00000000到 0x00007fff ` ffffffff
内核层地址分布在 0xffff8000 ` 00000000 到 0xffffffff ` ffffffff
中间的那一大堆内存都是无效内存
三、64位下对32位寄存器进行写操作(包括运算结果),会造成64位寄存器的高32位清零

就像图中这两条指令,我把rax赋值为0xffffffff`ffffffff 再对eax减一,按理来说结果应该是0xffffffff`fffffffe,但最后却是:
0x00000000FFFFFFFE

同样,我们在64位下使用 xor eax,eax会直接清零整个rax寄存器
但也仅限于32位,如果我们操作16位或8位还是我们之前预想的逻辑

四、对立即数的优化
如果我们在调试器上写下mov rax,0x1 这条汇编指令在写下后会变成mov eax , 0x1
猜测这是调试器对其的优化
五、不支持push 长立即数
push 0x123456789是会出错的
只能利用寄存器进行push
六、64位不支持的一些汇编指令



七、寻址
64位更多的使用的是相对偏移寻址,直接寻址的指令比较少
八、应用
当我们在64位下使用hook,返回的时候,可以这样写

一般来说,立即数的使用。优先使用32位扩展,64位立即数较少