ARM數據類型

基礎知識:

字節(bytes): 8位(bit) 字(word): 4字節: 32位 半字(half word): 2字節: 16位html

ARM中表示:

字節用-b-sb表示 半字用-h-sh表示 沒有字的表示 其中 無符號類型與有符號類型 的差異是:java

符號數據類型能夠包含正負數因此數值範圍上更低些 無符號數據類型能夠放得下很大的正數可是放不了負數jsp

使用對應數據類型作存取操做的彙編指令示例:函數

ldr: 加載字,寬度四字節 ldrh: 加載無符號的半字,寬度兩字節 ldrsh: 加載有符號的半字,寬度兩字節 ldrb: 加載無符號的字節 ldrsb: 加載有符號的字節ui

str: 存儲字,寬度四字節 strh: 存儲無符號的半字,寬度兩字節 strsh: 存儲有符號的半字,寬度兩字節 strb: 存儲無符號的字節 strsb: 存儲有符號的字節加密

字節序

主要理解內存中字節排序:大端(big endian)、小端(little endian),還記得加密解密第4版第一章1.2.2結講的就是這個,書中講了endian的來歷:《格列佛遊記》小說中的小人國居民爲了吃雞蛋是從雞蛋大的一端(big endian)仍是從小的一端(little endian)剝開而爭論。因此字節傳送順序的大端小端的由來就是這裏。指針

大端(big endian): 高位字節存入低地址,低位字節存入高地址; 小端(little endian): 低位字節存入低地址,高位字節存入高地址;code

下面以數據 0x12345678 爲例,掩飾內存中大端小端存入方式:htm

存放順序 1001h 1001h 1002h 1003h
大端 12h 34h 56h 78h
小端 78h 56h 34h 12h

在ARMv3以前使用的是小端排序,以後使用的都是大端排序,但也容許切換回小端排序。例如在ARMv6中,指令固定使用的是小端排序,數據訪問可使用小端也可使用大端排序,由程序寄存器(CPSR)的第9位(E位)控制。排序

ARM 寄存器

根據 ARM參考手冊 能夠了解,在 ARMv6-M 與 ARMv7-M 的處理器中均有30個32位寬度的通用寄存器 (General-purpose registers)。前16個寄存器是用戶層可訪問控制的,其餘的寄存器在高權限進程中能夠訪問(但ARMv6-M與ARMv7-M除外)。這16個寄存器分爲兩組:通用寄存器與有特殊含義的寄存器:

# 別名 用途
R0 - 通用寄存器
R2 - 通用寄存器
R3 - 通用寄存器
R4 - 通用寄存器
R5 - 通用寄存器
R6 - 通用寄存器
R7 - 通用寄存器
R8 - 通用寄存器
R9 - 通用寄存器
R10 - 通用寄存器
R11 FP 棧幀指針
特殊寄存器
R12 IP 內部程序調用
R13 SP 棧指針
R14 LR 連接寄存器(通常存放函數返回地址)
R15 PC 程序計數寄存器
CPSR - 當前程序狀態寄存器

其中:

R0-R12: 用來在操做中存儲臨時的值、指針等;其中 R0 用來存儲函數調用的返回值,R7 常常被用做存儲系統調用號,R11 存放着幫助咱們找到棧幀邊界的指針。以及在函數的調用約定中,前四個參數按順序存放在 R0-R3 寄存器中。

R13: 別名SP(棧指針)。棧指針寄存器用來指向當前的棧頂。堆棧是用於函數特定存儲的內存區域,函數返回時將對其進行回收。能夠經過在棧指針中減去咱們須要分配的值 (以字節爲單位) 來在堆棧中分配空間。換句話說,若是咱們想分配一個32位的值,那就用棧指針減去4,而後將這個值從減去前棧指針所指向的位置纔是存放;

Q: 爲何減去4? A: 由於棧指針所減的值是字節類型,一個字節等於8位,咱們要存的是32位的值,因此是32/8=4字節 最後的意思打個比方來解釋:好比如今棧指針指向0x12345678,存放32位值,減去4後等於0x12345674,而後從0x12345678開始存放那個32位值,直到0x12345674

R14: 別名LR(連接寄存器)。當一個函數調用發生時,連接寄存器 就被用來記錄函數調用發生所在位置的下一條指針的所在地址。這麼作容許咱們快速的從子函數回到父函數。

R15: 別名PC(程序計數器)。程序計數器是一個在程序指令執行時自增的計數器。它的大小在ARM模式下老是4字節對齊,在Thumb模式下老是兩字節對齊。當執行一個分支指令時,PC存儲目的地址。在程序執行中,ARM模式下的PC存儲着當前指令加8(兩條ARM指令後)的位置,Thumb(v1)模式下的PC存儲着當前指令加4(兩條Thumb指令後)的位置。這也是X86與ARM在PC上的主要不一樣之處。

CPSR: 別名程序狀態寄存器。別名及其含義以下表:

標記 說明
N(Negative) 指令操做結果爲負值時置1
Z(Zero) 指令操做結果爲零值時置1
C(Carry) 能夠有4種方法設置C的值:
-加法運算(包括CMP):當運算結果產生了進位時(無符號數溢出),C=1,不然C=0。
-減法運算(包括CMP):當運算時產生了借位時(無符號數溢出),C=0,不然C=1。
-對於包含移位操做的非加/減運算指令,C爲移出值的最後一位。
-對於其它的非加/減運算指令,C的值一般不會改變。
V(Overflow) 指令結果不能用32位的二進制補碼存儲,即發生了溢出時置1
E(Endian) 小端序置0,大端序置1
T(Thumb) 當爲Thumb模式時置1,ARM模式置0
M(Mode) 當前的權限模式(用戶態,內核態)
J(Jazelle) 容許ARM處理器去以硬件執行java字節碼的狀態標示
相關文章
相關標籤/搜索