1. 程式人生 > >arm64-v8a彙編指令

arm64-v8a彙編指令

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-指令/