A64指令 提供同A32和T32指令類似的功能, 也提供如下新功能
1)一個清晰的,固定長度的指令集: 指令是32位寬度, 寄存器字段(fields)是 在固定位置的 連續的位, 立即數 通常也是佔用連續的位
2) 更多通用寄存器(r0-r30), 每個寄存器長度擴展爲64位。 通用寄存器 編碼在 5個位域
寄存器r31是一個特殊的寄存器:
Zero Register: 在大多數情況下,作爲源寄存器使用時, r31讀出來的值 是0; 作爲目標寄存器使用時, 丟棄結果。 WZR(word zero rigiser)或者XZR(64位)
Stack Register: 當 用作load/store 的base register時, 或者 一些算術指令中, r31提供當前的stack pointer WSP或者 SP
3) PC寄存器 不能直接讀寫。用來指明當前程序執行的位置
4)過程調用 鏈接寄存器(LR) 是 r30
異常處理 有個 ELR系統寄存器
PC不是通用寄存器的一部分,不能通過寄存器號 來引用, 所以 不能作爲 算術指令的源地址或者目標地址。
也不能作爲 內存存取的 基礎(base), 索引(index)或者傳輸(transfer)寄存器。
能夠讀取PC寄存器內容的 指令是 PC相對尋址 指令(ADR, ADRP, 常量加載, 直接跳轉等指令)
跳轉和鏈接指令,將PC保存到鏈接寄存器(BL和BLR)
能夠修改PC的唯一的方式,使用 隱式的控制流指令(條件跳轉,無條件跳轉,異常生成,異常返回)
值得注意的是:PC 被這些指令 讀出來時,其值 就是
該指令所在的地址,而不像
A32和T32中,要加上4或者8的偏移(歷史上的原因,兩級流水
向後兩條指令,如果是16位長度的thumb指令, 那就是PC+4;32位長的arm指令,就是PC+8)
內存數據存取
A32和T32中的LDM,STM, PUSH和POP指令,在A64中並不存在
又有一對新的指令LDP和 STP 用來從內存中存取數據到寄存器。
地址生成
ADRP Xd, lable
(Address Page)
符號擴展一個21位的offset, 向左移動12位
PC的值的低12位 清零, 然後 把 這兩者相加, 結果寫入到Xd寄存器
用來得到一塊含有 lable的4KB對齊 內存區域的base地址 (也就是說lable所在的地址,一定落在這個4KB的內存區域裏, 指令助記符裏Page也就是這個意思), 可用來尋址 +/- 4GB的範圍
ADR X
(Address)
將有符號的21位的偏移,加上PC, 結果寫入到Xd寄存器
可用來計算 +/- 1MB範圍的 任意字節粒度的有效地址
轉自:http://zhiwei.li/text/2014/05/arm64-指令/