arm v8彙編指令

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章