Keil MDK中的Code, RO-data , RW-data, ZI-data分別代表什麼意思?(轉)

轉自http://anlx27.iteye.com/blog/1575848

一 基礎知識

字節  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


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