新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM裸機(jī)開發(fā)bootloader匯編語言

ARM裸機(jī)開發(fā)bootloader匯編語言

作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
一、匯編語言概述

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)論


技術(shù)專區(qū)

關(guān)閉