ARM裸機開發(fā)bootloader匯編語言
1、為什么要使用匯編
本文引用地址:http://2s4d.com/article/201611/318213.htm一般情況下我們不會用到匯編,但有兩種情況下,我們要用到匯編。
1、啟動代碼。編寫bootloader和內核時使用,主要是對cpu和內存進行初始化時使用,因為這個時候還沒有c語言的環(huán)境(堆棧還沒有建立),所以不能用c語言。
2、高效率的特殊需求。因為匯編語言的執(zhí)行效率要高于c語言,所以對某些對效率要求高的程序要用到匯編,可以是匯編與c語言的混合編程。
2、匯編分類
1、ARM標準匯編,適用于windows平臺下ARM公司開發(fā)的匯編器ADS。
2、GNU匯編,linux平臺下GNU交叉編譯工具鏈中的匯編器。它與ARM標準的一點不同是GNU匯編要在段標記符前加點,例如 .text。而ARM標準則不需要這個點。
3、匯編程序框架
(.section).text.global _start_start:<匯編代碼>例子start.Sstart.S.text.global _start_start:mov r1 #1mov r2 #2mov r3 #3
makefile文件all:start.oarm-linux-ld -Ttext 0x50000000 -o start.elf $^start.o:start.Sarm-linux-gcc -g -c -o $@ $^clean:rm *.o *.elf
4、eclipse匯編和調試
調試之前要對調試進行設置,調試的對象是elf文件。還要輸入初始化腳本,目的是對處理器進行初始化。
終止用Run-Terminate
二、匯編指令分類學習
1、算術與邏輯指令mov mvn add sub and bic
2、比較指令cmp tst
3、跳轉指令b bl
4、移位指令lsl ror
5、程序狀態(tài)字訪問指令msr mrs
6、存儲器訪問指令ldr str
http://blog.csdn.net/quyang0602/article/details/7527496
http://yxmyifeng.blog.163.com/blog/static/12978978220100194272529/
.text.global _start_start:@存儲器訪問指令mov r0, #0xfmov r1, #0xff@str r0, [r1]@ldr r2, [r1]@ 程序狀態(tài)字訪問指令mrs r0, cpsrorr r0, r0, #0b100msr cpsr, r0@移位指令mov r1, #0b110000mov r1, r1, lsl#2mov r1, r1, ror#4@跳轉指令mov r1, #6mov r2, #5cmp r1, r2bgt branch1b endbranch1:sub r3, r1, r2end:nopbl func1mov r1, r2func1:mov r1, r2mov pc, lr@比較指令mov r1, #2cmp r1, #1mov r1, #1cmp r1, #2mov r1, #1cmp r1, #1mov r1, #0b1011tst r1, #0b01mov r1, #0b1011tst r1, #0b100@算術與邏輯指令mov r1, #8mov r2, r1mov r3, #10mvn r1, #0b11mvn r2, #5mvn r3, r1mov r1, #9sub r2, r1, #4sub r3, r1, r2mov r1, #1mov r2, #2add r3, r1, #44add r3, r1, r2mov r1, #0b1011and r2, r1, #0b11mov r1, #0b1011bic r2, r1, #0b101
三、偽指令
1、ARM偽指令怎么定義
ARM偽指令沒有對應的機器碼,只有在編譯過程中起作用,或者轉化成其他實際執(zhí)行的指令來進行操作。
任何的CPU執(zhí)行的都是機器碼,也就是二進制映像文件。
2、偽指令的學習方法
對elf文件進行反匯編,查看反匯編文件中偽指令是如何轉化為其他指令執(zhí)行的。
arm-linux-objdump -D -S
ARM的機器碼是32位的整數(shù),被分為幾個段,每個段都有自己的意義。機器碼與每條指令是一一對應的。
3、偽指令定義
.global全局
.data數(shù)據
.ascii字符串
.byte字節(jié)
.word字
.align對齊
.equ宏
.equ DA,0x89mov r0,#DA.align 4
4、操作類偽指令
nop 空指令,等效于 mov ro, ro 可以用于延時,保證時序要求。
ldr
mov ro, 0x1ff 這樣定義就會出錯,因為mov的操作數(shù)最多只有8位,另外4位是左右移動表示位。
解決方案:
ldr ro, =0x1ff 等效于ldr r0, [pc, #-4]
四、ARM協(xié)處理器訪問指令
1、什么是協(xié)處理器
協(xié)處理器顧名思義就是助手的意思,協(xié)處理器可以幫助中央處理器處理一些特定的事務,例如數(shù)學協(xié)處理器,就可以處理一些數(shù)學方面的運算。協(xié)處理器有自己的寄存器,cpu通過訪問協(xié)處理器的寄存器實現(xiàn)與協(xié)處理器的協(xié)同工作。
2、ARM的CP15
ARM最多達16個協(xié)處理器,CP15共提供了16組寄存器,下面是一段來自ARM11手冊的CP15的原文介紹
The purpose of the system control coprocessor, CP15, is to control and provide status information for the functions implemented in the ARM1176JZF-S processor. The main functions of the system control coprocessor are:
1、overall system control and configuration
2、cache configuration and management
3、Tightly-Coupled Memory(TCM)緊耦合內存,性能類似cache
4、Memory Management Unit(MMU) configuration and management
5、DMA control
6、system performance monitoring.
3、協(xié)處理器的訪問指令
mcr和mrc,mcr實現(xiàn)通用寄存器數(shù)據向協(xié)處理器傳送。mrc實現(xiàn)了協(xié)寄存器向通用寄存器的傳送。
下面是一個例子(參考ARM11手冊編寫)
.text.global _start_start:mrc p15, 0, r0, c0, c0, 0nop
評論