1、ARM處理器簡(jiǎn)介
基于RISC,采用Load/Store
數(shù)據(jù)存取指令執(zhí)行時(shí)間遠(yuǎn)大于寄存器內(nèi)部數(shù)據(jù)操作指令
-
ARM處理器工作模式
- 用戶模式(User mode)
- 速中斷模式(FIQ) ===> 高速數(shù)據(jù)傳輸及通道處理
- 外部中斷模式(IRQ)
- 特權(quán)模式(Supervisor)===> cpu上電后默認(rèn)模式
- 用途: 系統(tǒng)初始化 & 軟中斷
- 數(shù)據(jù)訪問(wèn)終止模式(Abort)
- 支持虛存或存儲(chǔ)器保護(hù)
- 訪問(wèn)非法地址時(shí)進(jìn)入該模式
- 未定義指令終止模式(Undefined)
- 識(shí)別不了指令操作時(shí)進(jìn)入該模式
- 系統(tǒng)模式(System)
- 和用戶模式共用一套寄存器
-
ARM存儲(chǔ)器
- 4字節(jié)對(duì)齊
- 大端格式: 高字節(jié)低地址馍悟,低字節(jié)高地址
- 小端格式: 高字節(jié)高地址,低字節(jié)低地址
- 數(shù)據(jù)類型: 字節(jié)型數(shù)據(jù) / 半字 / 字
2陡厘、ARM寄存器
2.1 寄存器概況
- 37個(gè)导披,31通用舵鳞,6個(gè)狀態(tài)寄存器
- 寄存器均為32位
- 修改寄存器某一位:采用“先與后或”的方式
2.2 r0-r15探入,CPSR/SPSR
各模式下公用寄存器存到堆棧中
-
r13堆棧指針寄存器(SP)
- 習(xí)慣用法狡孔,也可用其他寄存器做堆棧指針
- 每個(gè)模式都有自己的r13,指向相應(yīng)的地址空間
-
R14鏈接寄存器(LR)
- 存放子程序的返回地址
- 調(diào)用子程序時(shí)蜂嗽,將當(dāng)前r15保存到r14
- 執(zhí)行完子程序苗膝,r14的值復(fù)制回R15
-
r15程序計(jì)數(shù)器(PC)
- PC,不指向當(dāng)前正在執(zhí)行的指令
- 總是指向“正在取指”的指令
- PC值=當(dāng)前地址值+8
-
CPSR/SPSR
- 當(dāng)前/備份程序狀態(tài)寄存器
- CPSR:公用寄存器
- SPSR: 獨(dú)立寄存器
- 標(biāo)志位組成:
- 條件標(biāo)志位
- 模式控制位
- IRQ植旧、FIQ中斷響應(yīng)位
- 當(dāng)前/備份程序狀態(tài)寄存器
2.3 三級(jí)流水線: 馮諾依曼結(jié)構(gòu)
- (1)取指:
從指令存儲(chǔ)器取指令
從存儲(chǔ)器裝載一條指令 - (2)譯碼:
識(shí)別將要被執(zhí)行的指令 - (3)執(zhí)行:
產(chǎn)生ALU運(yùn)算結(jié)果或產(chǎn)生存儲(chǔ)器地址
2.4 五級(jí)流水線: 哈佛結(jié)構(gòu)
- (4)訪存:
訪問(wèn)數(shù)據(jù)存儲(chǔ)器 - (5)回寫:
完成結(jié)果寫寄存器
3辱揭、ARM指令集
3.1 ARM指令
- 存儲(chǔ)器訪問(wèn)指令
- 數(shù)據(jù)處理指令
- 跳轉(zhuǎn)指令
- 程序狀態(tài)寄存器訪問(wèn)指令
- 協(xié)處理器訪問(wèn)指令
3.2 存儲(chǔ)器訪問(wèn)指令
3.2.1 LDR/STR
- ldr r0, 0x12345678
- 把0x12345678這個(gè)地址中的值存放到r0中
- mov不能實(shí)現(xiàn)這個(gè)功能
- mov只能在寄存器之間移動(dòng)數(shù)據(jù),或者把立即數(shù)移動(dòng)到寄存器中
- ldr r0, =0x12345678
- 把0x12345678這個(gè)值寫到r0中
- 類似MOV病附,但mov長(zhǎng)度不能超過(guò)8位
3.2.2 LDM/STM
- IA ----> Increment After
每次傳送后地址加4 - IB---->Increment Before
每次傳送前地址加4 - DA ----> Decrement After
每次傳送后地址減4 - DB ---->Decrement Before
每次傳送前地址減4 - FA ----> Full Ascending 滿遞增堆棧
- FD ----> Full Descending 滿遞減堆棧
- EA ----> Empty Ascending 空遞增堆棧
- ED ----> Empty Descending 空遞減堆棧
3.3 數(shù)據(jù)處理指令
- MOV
- ADD/SUB/BIC/CMP/ORR
- BIC:位清除
- ORR:邏輯或
- swp:內(nèi)存和寄存器之間字?jǐn)?shù)據(jù)交換指令
3.4 跳轉(zhuǎn)指令
- b
- bl
3.5 程序狀態(tài)寄存器訪問(wèn)指令
- MSR:寫狀態(tài)寄存器指令
- MRS:讀~
3.6 協(xié)處理器訪問(wèn)指令
- MRC: 協(xié)處理器中寄存器的數(shù)據(jù)傳送到arm處理器寄存器中
- MCR: 反之
3.7 ARM偽操作
- GET
- 包含定義常量的源文件
- 相當(dāng)于C的“include”
- GET 2440addr.inc
- AREA/ENTRY/END
- EXPORT/IMPORT
- E:聲明外部標(biāo)號(hào)
- I:引用其他文件定義的標(biāo)號(hào)
- EQU/LTORG/ALIGN
- MACRO/MEND
- MAP/FIELD
- ADRL/LDR
4问窃、ARM宏指令
5、ARM尋址方式
-
立即尋址:
數(shù)據(jù)在指令中 -
寄存器尋址:
操作數(shù)在寄存器中完沪,指令給出寄存器編號(hào) -
寄存器移位尋址:
取寄存器的值域庇,做移位運(yùn)算 -
寄存器間接尋:
寄存器存操作數(shù)的內(nèi)存地址 -
基址尋址:
操作數(shù)地址=基址寄存器的值+指令給出的偏移量 - 多寄存器尋址
- 堆棧尋址
6、相關(guān)細(xì)節(jié)
- JTAG: 系統(tǒng)仿真丽焊、調(diào)試
- 串口: 數(shù)據(jù)一位一位地順序傳送
- 并口: 同時(shí)傳送8位數(shù)據(jù)
- RISC
- Reduced Instruction Set Computer
- 簡(jiǎn)單指令硬件實(shí)現(xiàn)
- 復(fù)雜指令軟件實(shí)現(xiàn)
- CISC
Complex Instruction Set Computer
7较剃、ARM C 語(yǔ)言基礎(chǔ)
7.1 typedef &#define
- T:編譯階段處理
- D:預(yù)處理階段處理
7.2 volatile:
每次讀寫數(shù)據(jù)咕别,都到內(nèi)存單元處讀取技健,而非寄存器
7.3 C語(yǔ)言源程序處理過(guò)程
- 預(yù)處理
- 編譯
- 匯編
- 鏈接
7.4 arm C擴(kuò)展關(guān)鍵字
- __irq: 定義中斷處理函數(shù)
- __swi: 定義軟中斷
- __asm: 嵌入?yún)R編代碼 & 完成c代碼無(wú)法完成的工作
- __inline: 內(nèi)聯(lián)函數(shù) & 解決函數(shù)調(diào)用開(kāi)銷太大的問(wèn)題
- sizeof: 是一個(gè)關(guān)鍵字,非函數(shù)
8. 匯編&C混合編程
8.1 APCS: ARM Process Call Standard
- r0-r3:傳遞函數(shù)參數(shù)
- R4-R11:保存函數(shù)的局部變量
- 子程序參數(shù)大于4時(shí)惰拱,借助堆棧傳遞參數(shù)
- 函數(shù)返回值用R0傳遞(4字節(jié))雌贱,8字節(jié)用r0和r1傳遞
- 浮點(diǎn)數(shù)參數(shù)可以通過(guò)寄存器傳遞,也可以通過(guò)數(shù)據(jù)棧傳遞
8.2 在c程序中嵌入?yún)R編代碼的原因
- c代碼無(wú)法操作寄存器
- 嵌入?yún)R編代碼提高效率
PS:
FP寄存器
- 浮點(diǎn)參數(shù)會(huì)用到
- 幀指針寄存器啊送,r11
- 函數(shù)局部變量被分配在連續(xù)存儲(chǔ)區(qū)中,它是通過(guò)一個(gè)指針訪問(wèn)的
- 該連續(xù)存儲(chǔ)區(qū)稱為這個(gè)函數(shù)的存儲(chǔ)“幀”