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