ARM裸機(jī)開發(fā)bootloader匯編語言
1、為什么要使用匯編
本文引用地址:http://m.butianyuan.cn/article/201611/318213.htm一般情況下我們不會(huì)用到匯編,但有兩種情況下,我們要用到匯編。
1、啟動(dòng)代碼。編寫bootloader和內(nèi)核時(shí)使用,主要是對(duì)cpu和內(nèi)存進(jìn)行初始化時(shí)使用,因?yàn)檫@個(gè)時(shí)候還沒有c語言的環(huán)境(堆棧還沒有建立),所以不能用c語言。
2、高效率的特殊需求。因?yàn)閰R編語言的執(zhí)行效率要高于c語言,所以對(duì)某些對(duì)效率要求高的程序要用到匯編,可以是匯編與c語言的混合編程。
2、匯編分類
1、ARM標(biāo)準(zhǔn)匯編,適用于windows平臺(tái)下ARM公司開發(fā)的匯編器ADS。
2、GNU匯編,linux平臺(tái)下GNU交叉編譯工具鏈中的匯編器。它與ARM標(biāo)準(zhǔn)的一點(diǎn)不同是GNU匯編要在段標(biāo)記符前加點(diǎn),例如 .text。而ARM標(biāo)準(zhǔn)則不需要這個(gè)點(diǎn)。
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匯編和調(diào)試
調(diào)試之前要對(duì)調(diào)試進(jìn)行設(shè)置,調(diào)試的對(duì)象是elf文件。還要輸入初始化腳本,目的是對(duì)處理器進(jìn)行初始化。
終止用Run-Terminate
二、匯編指令分類學(xué)習(xí)
1、算術(shù)與邏輯指令mov mvn add sub and bic
2、比較指令cmp tst
3、跳轉(zhuǎn)指令b bl
4、移位指令lsl ror
5、程序狀態(tài)字訪問指令msr mrs
6、存儲(chǔ)器訪問指令ldr str
http://blog.csdn.net/quyang0602/article/details/7527496
http://yxmyifeng.blog.163.com/blog/static/12978978220100194272529/
.text.global _start_start:@存儲(chǔ)器訪問指令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@跳轉(zhuǎn)指令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@算術(shù)與邏輯指令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偽指令沒有對(duì)應(yīng)的機(jī)器碼,只有在編譯過程中起作用,或者轉(zhuǎn)化成其他實(shí)際執(zhí)行的指令來進(jìn)行操作。
任何的CPU執(zhí)行的都是機(jī)器碼,也就是二進(jìn)制映像文件。
2、偽指令的學(xué)習(xí)方法
對(duì)elf文件進(jìn)行反匯編,查看反匯編文件中偽指令是如何轉(zhuǎn)化為其他指令執(zhí)行的。
arm-linux-objdump -D -S
ARM的機(jī)器碼是32位的整數(shù),被分為幾個(gè)段,每個(gè)段都有自己的意義。機(jī)器碼與每條指令是一一對(duì)應(yīng)的。
3、偽指令定義
.global全局
.data數(shù)據(jù)
.ascii字符串
.byte字節(jié)
.word字
.align對(duì)齊
.equ宏
.equ DA,0x89mov r0,#DA.align 4
4、操作類偽指令
nop 空指令,等效于 mov ro, ro 可以用于延時(shí),保證時(shí)序要求。
ldr
mov ro, 0x1ff 這樣定義就會(huì)出錯(cuò),因?yàn)閙ov的操作數(shù)最多只有8位,另外4位是左右移動(dòng)表示位。
解決方案:
ldr ro, =0x1ff 等效于ldr r0, [pc, #-4]
四、ARM協(xié)處理器訪問指令
1、什么是協(xié)處理器
協(xié)處理器顧名思義就是助手的意思,協(xié)處理器可以幫助中央處理器處理一些特定的事務(wù),例如數(shù)學(xué)協(xié)處理器,就可以處理一些數(shù)學(xué)方面的運(yùn)算。協(xié)處理器有自己的寄存器,cpu通過訪問協(xié)處理器的寄存器實(shí)現(xiàn)與協(xié)處理器的協(xié)同工作。
2、ARM的CP15
ARM最多達(dá)16個(gè)協(xié)處理器,CP15共提供了16組寄存器,下面是一段來自ARM11手冊(cè)的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)緊耦合內(nèi)存,性能類似cache
4、Memory Management Unit(MMU) configuration and management
5、DMA control
6、system performance monitoring.
3、協(xié)處理器的訪問指令
mcr和mrc,mcr實(shí)現(xiàn)通用寄存器數(shù)據(jù)向協(xié)處理器傳送。mrc實(shí)現(xiàn)了協(xié)寄存器向通用寄存器的傳送。
下面是一個(gè)例子(參考ARM11手冊(cè)編寫)
.text.global _start_start:mrc p15, 0, r0, c0, c0, 0nop
評(píng)論