x64位汇编学习(一)、寄存器,虚拟地址与指令


一、通用寄存器

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

二、虚拟地址空间

 
0
用户层的有效地址范围是0x00000000 ` 00000000到 0x00007fff ` ffffffff
内核层地址分布在 0xffff8000 ` 00000000 到 0xffffffff ` ffffffff
中间的那一大堆内存都是无效内存
 

三、64位下对32位寄存器进行写操作(包括运算结果),会造成64位寄存器的高32位清零

 
0
就像图中这两条指令,我把rax赋值为0xffffffff`ffffffff 再对eax减一,按理来说结果应该是0xffffffff`fffffffe,但最后却是:
0x00000000FFFFFFFE
0
同样,我们在64位下使用 xor eax,eax会直接清零整个rax寄存器
但也仅限于32位,如果我们操作16位或8位还是我们之前预想的逻辑
0
 

四、对立即数的优化

如果我们在调试器上写下mov rax,0x1 这条汇编指令在写下后会变成mov eax , 0x1
猜测这是调试器对其的优化
 

五、不支持push 长立即数

push 0x123456789是会出错的
只能利用寄存器进行push
 

六、64位不支持的一些汇编指令

 
0
 
0
0
 

七、寻址

64位更多的使用的是相对偏移寻址,直接寻址的指令比较少
 

八、应用

当我们在64位下使用hook,返回的时候,可以这样写
0
 
 
 
一般来说,立即数的使用。优先使用32位扩展,64位立即数较少


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM