1. 程式人生 > >x86-64指令系統

x86-64指令系統

很多 超過 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指令系統