字節(bytes): 8位(bit) 字(word): 4字節: 32位 半字(half word): 2字節: 16位html
字節用-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參考手冊 能夠了解,在 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字節碼的狀態標示 |