新聞中心

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

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

作者: 時間:2016-11-19 來源:網絡 收藏
一、匯編語言概述

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


評論


技術專區(qū)

關閉