ARM指令系統概述

摘譯自Matteo Franchin的PPT《ARMv8-A A64 ISA Overview》。

寄存器

ARM共有31個通用寄存器和2個特殊寄存器,都是64位。31個通用寄存器用X0到X30來表示,兩個特殊寄存器是SP和ZR。
SP是棧指針,其內容是棧底的地址,必須滿足16字節對齊的條件,否則無法使用。例如:
ADD SP, SP, #8
這種用法是錯誤的,因爲所得到的SP不滿足16字節對齊的條件,造成之後的SP不可用。
ZR是0寄存器。當用作源寄存器的時候,其值恆爲0,當用作目的寄存器的時候,值被拋棄,不能保存任何值。
向量和浮點寄存器。32個寄存器,向量和浮點共用,每個128位,用V0到V31來表示。不同的記號可以表示不同的長度,B表示字節,H表示半字,S表示單字,D表示雙字,Q表示四字,如圖1所示。


圖1 不同長度數值的描述方式

系統寄存器。系統寄存器定義了處理器的上下文,通常帶有後綴_ELx,表示能訪問該寄存器的最低異常級別。分別對應有讀(MRS)和寫(MSR)系統寄存器的指令。
MRS X0, SCTLR_EL1
MSR SCTLR_EL1, X0

Load/Store指令

指令的使用

LDR和STR分別從地址中讀入內容到寄存器和向地址中寫入寄存器的內容。默認情況下,內容的大小由寄存器的名字決定,也可以使用後綴來指定讀寫較小的內容。後綴B表示字節,H表示半字,W表示單字。當寫入較小的內容時,默認情況下,會對內容進行0擴展,也可以使用S來進行符號位擴展。圖2中,第一條指令是把內容爲8A的一個字節裝入X4(64位)中,並進行符號位的擴展。第二條指令是把內容爲8A的一個字節裝入W4(32位)中,並進行0擴展。


圖2 load指令示例

指定Load/Store指令的地址

按照從簡單到複雜的分類方法,可以通過以下方式來指定訪存指令的地址:從寄存器中獲取地址;通過寄存器內容再加上偏移來獲取地址;對偏移進行擴展、移位等運算之後,再與寄存器內容相加,獲得地址。
LDR X0, [X1]                                ; 直接從寄存器X1的內容中獲取地址。
LDR X0, [X1, #-8]                        ; X1的內容加上-8的偏移,得到地址。
LDR X0, [X1, X2]                         ; X!的內容和X2的內容相加得到地址。
LDR X0, [X1, W2, SXTW]          ; 對W2的內容做符號擴展,再與X1的內容相加,作爲地址。
LDR X0, [X1, X2, LSL #2]          ; 把X2的內容左移2位,再與X1的內容相加,作爲地址。

尋址模式

簡單模式:X1的內容不會被改變,例如。
LDR X0, [X1]
LDR X0, [X1, #4]

前變址模式,X1的內容在load之前變化,例如。
LDR X0, [X1, #4]!  
等價於  
ADD X1, X1, #4
LDR X0, [X1]

後變址模式,X1的內容在load之後變化,例如。
LDR X0, [X1], #4
等價於
LDR X0, [X1]
ADD X1, X1, #4

浮點的Load/Store

浮點寄存器的Load/Store操作,通過寄存器的名稱來指定寫入寄存器內容的大小。B、H、S、D和Q分別代表字節、半字、單字、雙字和四字。指令中不再有大小和符號擴展之類的內容,例如。
LDR  D1, [X0]           ; 從地址[X0]中取64位數值到D1寄存器中。
STR  Q0, [X0, X1]    ; 存128位的內容到地址[X0 + X1]。

Load/Store一個寄存器對

支持對整型、浮點標量和向量,要求源寄存器和目的寄存器必須具有相同的寬度,例如。
LDP W3, W7, [X0]        ; [X0] => W3, [X0 + 4 bytes] =>W7
STP Q0, Q1, [X4]        ; Q0 => [X4], Q1=>[X4 + 16 bytes]

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