x86-64指令系統
阿新 • • 發佈:2018-09-22
很多 超過 com 傳遞 地址 編譯器 64位 大小 程序計數器
x86-64指令系統概述
x86-64中各類數據的長度
x86-64的通用寄存器
新增8個64位通用寄存器(整數寄存器) • R8、R9、R10、R11、R12、R13、R14和R15。 • 可作為8位(R8B~R15B)、16位(R8W~R15W)或 32位寄存器(R8D~R15D)使用 – 所有GPRs都從32位擴充到64位 • 8個32位通用寄存器EAX、EBX、ECX、EDX、EBP、 ESP、ESI和 EDI對應擴展寄存器分別為RAX、RBX、 RCX、RDX、RBP、RSP、RSI和RDI • EBP、ESP、ESI和 EDI的低8位寄存器分別是BPL、SPL 、SIL和DIL • 可兼容使用原AH、BH、CH和DH寄存器 ( 使原來IA-32中的每個通用寄存器都可以是8位、16位、 32位和64位,如:SIL、SI、ESI、RSI) #################################### 指令可直接訪問16個64位寄存器:RAX、RBX、RCX、RDX、 RBP、RSP、RSI、RDI,以及R8~R15 – 指令可直接訪問16個32位寄存器:EAX、EBX、ECX、EDX、EBP 、ESP、ESI、EDI,以及R8D~R15D – 指令可直接訪問16個16位寄存器:AX、BX、CX、DX、BP、SP、 SI、DI,以及R8W~R15W – 指令可直接訪問16個8位寄存器:AL、BL、CL、DL、BPL、SPL 、SIL、DIL,以及R8B~R15B – 為向後兼容,指令也可直接訪問AH、BH、CH、DH – 通過寄存器傳送參數,因而很多過程不用訪問棧,因此,與IA-32 不同,x86-64不需要幀指針寄存器,即RBP可用作普通寄存器使用 – 程序計數器為64位寄存器RIP
x86-64的地址和尋址空間
字長從32位變為64位,64位(8B)數據被稱為一個四字(qw: quadword) – 邏輯地址最長可達為64位,即理論上可訪問的存儲空 間達264字節或16EB(ExaByte) – 編譯器為指針變量分配64位(8B) – 基址寄存器和變址寄存器都應使用64位寄存器 – 但實際上,AMD和Intel的x86-64僅支持48位虛擬地 址,因此,程序的虛擬地址空間大小為248=256TB
x86-64中數據的對齊
各類型數據遵循一定的對齊規則,而且更嚴格
– 存儲器訪問接口被設計成按8字節或16字節為單位進行
存取,其對齊規則是,任何K字節寬的基本數據類型和
指針類型數據的起始地址一定是K的倍數。
• short型數據必須按2字節邊界對齊
• int、float等類型數據必須按4字節邊界對齊
• long、double、指針型變量必須按8字節邊界對齊
• long double型數據必須按16字節邊界對齊
x86-64的基本指令
數據傳送指令(助記符“q”表示操作數長度為四字(即64位)) movabsq I, R:將64位立即數送64位通用寄存器 movq:傳送一個64位的四字 movsbq、movswq、movslq:將源操作數進行符號擴展並傳送 到一個64位寄存器或存儲單元中 movzbq、movzwq:將源操作數進行零擴展後傳送到一個64位寄 存器或存儲單元中 movl:的功能相當於movzlq指令 pushq S:R[rsp]←R[rsp]-8; M[R[rsp]] ←S popq D: D← M[R[rsp]]; R[rsp]←R[rsp]-8 ########### 常規的算術邏輯運算指令 只要將原來IA-32中的指令擴展到64位即可。例如: – addq(四字相加) – subq(四字相減) – incq(四字加1) – decq(四字減1) – imulq(帶符號整數四字相乘) – orq(64位相或) – salq(64位算術左移) – leaq(有效地址加載到64位寄存器)
算術邏輯指令
x86-64的過程調用
看一個簡單的例子
x86-64過程調用的參數傳遞
– 通過通用寄存器傳送參數,很多過程不用訪問棧,故執行時間 比IA-32代碼更短 – 最多可有6個整型或指針型參數通過寄存器傳遞 – 超過6個入口參數時,後面的通過棧來傳遞 – 在棧中傳遞的參數若是基本類型,則都被分配8個字節 – call(或callq)將64位返址保存在棧中之前,執行R[rsp]←R[rsp]-8 – ret從棧中取出64位返回地址後,執行R[rsp]←R[rsp]+8
x86-64過程調用舉例
x86-64指令系統