轉載:”http://www.cnblogs.com/shirishiqi/p/5545085.html
一 基礎知識
位元組 8位
半字 16位
字 32位
二 解惑
Code, RO-data,RW-data,ZI-data
Code為程式程式碼部分
RO-data 表示 程式定義的常量const temp;
RW-data 表示 已初始化的全域性變數
ZI-data 表示 未初始化的全域性變數
Program Size: Code="18248" RO-data=320 RW-data=260 ZI-data=3952
Code, RO-data,RW-data ............flash
RW-data, ZIdata...................RAM
三 詳細分析
初始化時RW-data從flash拷貝到RAM
生成的map檔案位於list資料夾下 (KEIL)
Total RO Size (Code + RO Data) 18568 ( 18.13kB)
Total RW Size (RW Data + ZI Data) 4212 ( 4.11kB)
Total ROM Size (Code + RO Data + RW Data) 18828 ( 18.39kB)
ARM指令的長度剛好是1個字(分配為佔用4個位元組),Thumb指令的長度剛好是半字(佔用2個位元組)
R0-R15 (R15-PC,R14-LR,R13-SP) 32位
每個異常模式還帶有一個程式狀態儲存暫存器 (SPSR),它用於儲存在異常事件發生之前的CPSR
LDMIA R1!,{R2-R7, R12} ;將R1單兀中的資料讀出到R2-R7,R12, R1自動加1
STMIA RO!,{R3-R6,R10} ;將R3-R6,R10中的資料儲存到RO指向的地址,RO自動加1
在資料傳送之前,將偏移量加到Rn中,其結果作為傳送資料的儲存地址.若使用字尾“!”,則結果寫回到Rn中,且Rn值不允許為R15.指令舉例如下:
LDR Rd, [Rn, #Ox4]!
LDMFD SP!,{R0-R3,PC}^ ;中斷返回
“^”符號表示這是一條特殊形式的指令。這條指令在從儲存器中裝載PC的同時(PC是最後恢復的),CPSR也得到恢復
大端格式(Big-endian)
小端格式(Little-endian)
資料0x12345678儲存格式
大端格式
低地址<----0x12|0x34|0x56|0x78---->高地址
小端格式
低地址<----0x78|0x56|0x34|0x12---->高地址
ARM微處理器支援7種執行模式,分別為: CPSR M[4:0]
1.使用者模式(usr):ARM處理器正常的程式執行狀態。 10000
2.快速中斷模式(fiq):用於高速資料傳輸或通道處理。 10001
3.外部中斷模式(irq):用於通用的中斷處理。 10010
4.管理模式(svc):作業系統使用的保護模式。 10011
5.資料訪問終止模式(abt):當資料或指令預取終止時進入該模式,可用於虛擬儲存及儲存保護。10111
6.系統模式(sys):執行具有特權的作業系統任務。 11111
7.定義指令中止模式(und):當未定義的指令執行時進入該模式,可用於支援硬體協處理器的軟體模擬。 11011
ARM正常工作一般工作在使用者模式和系統模式,復位的時候進入管理模式。
對於ARM指令集來說,PC指向當前指令的下兩條指令的地址,
注意pc,在除錯的時候顯示的是當前指令地址,而用mov lr,pc的時候lr儲存的是此指令向後數兩條指令的地址
假設反彙編程式碼: 0x000001 : mov lr pc
(此時檢視PC暫存器的值是0x000001,但實際PC值是0x000003, lr裡面儲存的就是0x000003)
fields 指定傳送的區域(psr CPSR或SPSR)
c 控制域遮蔽位元組(psr[7..0])
x 擴充套件域遮蔽位元組(psr[15..8])
s 狀態域遮蔽位元組(psr[23..16])
f 標誌域遮蔽位元組(psr[31..24])
例如:MSR cpsr_c, #0xD3 ; CPSR[7...0] = 0xD3