ARM裸機開發bootloader彙編語言

2021-01-18 電子產品世界
一、彙編語言概述

1、為什麼要使用彙編

本文引用地址:http://www.eepw.com.cn/article/201611/318213.htm

一般情況下我們不會用到彙編,但有兩種情況下,我們要用到彙編。

1、啟動代碼。編寫bootloader和內核時使用,主要是對cpu和內存進行初始化時使用,因為這個時候還沒有c語言的環境(堆棧還沒有建立),所以不能用c語言。

2、高效率的特殊需求。因為彙編語言的執行效率要高於c語言,所以對某些對效率要求高的程序要用到彙編,可以是彙編與c語言的混合編程。

2、彙編分類

1、ARM標準彙編,適用於windows平臺下ARM公司開發的彙編器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、程序狀態字訪問指令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]@ 程序狀態字訪問指令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偽指令沒有對應的機器碼,只有在編譯過程中起作用,或者轉化成其他實際執行的指令來進行操作。

任何的CPU執行的都是機器碼,也就是二進位映像文件。

2、偽指令的學習方法

對elf文件進行反彙編,查看反彙編文件中偽指令是如何轉化為其他指令執行的。

arm-linux-objdump -D -S

ARM的機器碼是32位的整數,被分為幾個段,每個段都有自己的意義。機器碼與每條指令是一一對應的。

3、偽指令定義

.global全局

.data數據

.ascii字符串

.byte字節

.word字

.align對齊

.equ

.equ DA,0x89mov r0,#DA.align 4


4、操作類偽指令

nop 空指令,等效於 mov ro, ro 可以用於延時,保證時序要求。

ldr

mov ro, 0x1ff 這樣定義就會出錯,因為mov的操作數最多只有8位,另外4位是左右移動表示位。

解決方案:

ldr ro, =0x1ff 等效於ldr r0, [pc, #-4]

四、ARM協處理器訪問指令

1、什麼是協處理器

協處理器顧名思義就是助手的意思,協處理器可以幫助中央處理器處理一些特定的事務,例如數學協處理器,就可以處理一些數學方面的運算。協處理器有自己的寄存器,cpu通過訪問協處理器的寄存器實現與協處理器的協同工作。

2、ARM的CP15

ARM最多達16個協處理器,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、協處理器的訪問指令

mcr和mrc,mcr實現通用寄存器數據向協處理器傳送。mrc實現了協寄存器向通用寄存器的傳送。

下面是一個例子(參考ARM11手冊編寫)

.text.global _start_start:mrc p15, 0, r0, c0, c0, 0nop

相關焦點

  • ARM裸機開發bootloader我是bootloader設計師
    一、bootloader設計藍圖1、什麼是bootloader本文引用地址:http://www.eepw.com.cn/article/201611/318211.htm如果說系統內核是太空梭的話,那麼bootloader就是助推器,它帶動了內核。在內核啟動之前它要做許多硬體的初始化操作,來適合系統的安全啟動。
  • 基於Android的ARM彙編語言系列之三:ARM彙編語言程序結構
    章節列表之一:ARM彙編語言開篇之二:C/C++程序生成ARM彙編程序的過程分析之三:ARM彙編語言程序結構之四:ARM處理器的尋址方式之五:ARM指令集與Thumb指令集之六:NEON指令集與VFP指令集本文引用地址:http://www.eepw.com.cn
  • 淺析gcc、arm-linux-gcc和arm-elf-gcc的關係
    The GNU Compiler Collection,通常簡稱 GCC,是一套由 GNU 開發的編譯器集,為什麼是編輯器集而不是編譯器呢?那是因為它不僅支持 C 語言編譯,還支持 C++, Ada,Objective C 等許多語言。
  • ARM-Linux開發與MCU開發的差別是什麼
    今天我們來看看ARM-Linux開發和MCU開發的不同點,以及ARM-Linux的基本開發環境。 1. ARM-Linux應用開發和單片機開發的不同 這裡先要做一個說明,對於ARM的應用開發主要有兩種方式:一種是直接在ARM晶片上進行應用開發,不採用作業系統,也稱為裸機編程,這種開發方式主要應用於一些低端的ARM晶片上,其開發過程非常類似單片機,這裡不多敘述。
  • 基於Android的ARM彙編語言系列之二:C/C++程序生成ARM彙編程序
    章節列表之一:ARM彙編語言開篇之二:C/C++程序生成ARM彙編程序的過程分析之三:ARM彙編語言程序結構之四:ARM處理器的尋址方式之五:ARM指令集與Thumb指令集之六:NEON指令集與VFP指令集本文引用地址:http://www.eepw.com.cn
  • 詳解bootloader的執行流程與ARM Linux啟動過程分析
    本文以S3C2410 ARM處理器為例,詳細分析了系統上電後 bootloader的執行流程及 ARM Linux的啟動過程。 1、引 言 Linux 最初是由瑞典赫爾辛基大學的學生 Linus Torvalds在1991 年開發出來的,之後在 GNU的支持下,Linux 獲得了巨大的發展。
  • iOS ARM彙編
    其實都是GNU的彙編,只是架構不一樣,彙編是嚴重依賴機器的,機器架構不一樣,所以對應的彙編指令也就不一樣。所以,就不用去了解模擬器上的彙編,作用並不大。真機上的彙編模擬器上的彙編從上兩圖來看,二者彙編語言差別還是蠻大的。
  • ARM GNU常用彙編語言介紹
    ARM GNU常用彙編語言介紹ARM彙編語言源程序語句,一般由指令,偽操作,宏指令和偽指令組成.ARM彙編語言的設計基礎是彙編偽指令,彙編偽操作和宏指令。偽操作,是ARM彙編語言程序裡的一些特殊的指令助記符,其作用主要是為完成彙編程序做各種準備工作,在源程序運行彙編程序時處理,而在計算機運行期間沒有有機器執行.也就是說,這些偽操作只是彙編過程中起作用,一旦彙編結束,偽操作的使命也就隨之消失.宏指令,是一段獨立的程序代碼,可以插在程序中,它通過偽操作來定義。
  • 引用ARM開發,對entry point的含義
    本文引用地址:http://www.eepw.com.cn/article/201611/317248.htm從事了這麼久的ARM開發,對entry point的含義一知半解,今日再次拿出一本寫得還算不錯的ARM教材來翻,書中這一段僅僅是把英文手冊單純翻譯成中文,並沒有講到真正的實質
  • 單片機開發與Linux開發有何不同?
    ARM-Linux應用開發和單片機開發的不同這裡先要做一個說明,對於ARM的應用開發主要有兩種方式:一種是直接在ARM晶片上進行應用開發,不採用作業系統,也稱為裸機編程,這種開發方式主要應用於一些低端的ARM晶片上,其開發過程非常類似單片機,這裡不多敘述。
  • ARM彙編 MOV PC,LR
    另外注意pc,在調試的時候顯示的是當前指令地址,而用mov lr,pc的時候lr保存的是此指令向後數兩條指令的地址,大家可以試一下用mov pc,pc,結果得到的是跳轉兩條指令,這個原因是由於arm的流水線造成的,預取兩條指令的結果.
  • ARM彙編語言(4) 指令、偽操作、偽指令學習
    IF,ELSE,ENDIF:根據條件將一段原始碼包括在彙編語言程序中或者將其排除在程序之外;IF logical expressioninstructions or directivesELSEinstructions or directivesENDIF
  • 嵌入式arm開發學習第三天
    arm開發學習第三天交叉編譯裸板程序:1.arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o xxx.o xxx.c-c: 只編譯不連結-nostdlib: 不允許使用標準c庫內容2.arm-cortex_a9-linux-gnueabi-ld -nostartfiles
  • LiteOS Studio零成本學習ARM彙編 二 初識謝娘
    0x01 簡介GNU toolchain 工具鏈是是ARM嵌入式開發必備工具,安裝LiteOS Studio時,需按照教程完成安裝工具鏈。https://gitee.com/huawei_liteos_studio/arm_assembly/tree/master/HelloArm0x04 ARM 彙編調試演示點擊工具欄上的編譯圖標,可以實現一鍵編譯:
  • 「正點原子FPGA連載」附錄A2 ARM彙編基礎
    由於本書著重於嵌入式Linux驅動的開發,對於彙編指令簡要介紹,滿足我們學習即可。領航者使用的是Xilinx的ZYNQ晶片,這是一款帶有雙核Cortex-A9內核的晶片,所以我們主要講的是Cortex-A的彙編指令。
  • 有關arm彙編中的align
    經常會看到arm-linux彙編中有如下的指令:.arm-linu是按照2^n的方案對齊的,需要說明的是這個對齊和ld-script裡的對齊不同,不是一會事。For other systems, including the i386 using a.out format, and the arm and strongarm,it is the number of low-order zero bits the location counter must have after advancement.
  • ARM中ADS環境下C語言和彙編語言混合編程及示例
    另外在一些對性能非常敏感的代碼塊,基於彙編與機器碼一一對應的關係,這時不能依靠C編譯器的生成代碼,而要手工編寫彙編,從而達到優化的目的。彙編語言是和CPU的指令集緊密相連的,作為涉及底層的嵌入式系統開發,熟練對應彙編語言的使用也是必須的。這裡主要討論C和彙編的混合編程,包括相互之間的函數調用。下面分四種情況來進行討論,不涉及C++語言。
  • 入門級ARM彙編指令
    無論是體系結構還是指令集,大家或多或少都應該對X86彙編有些了解,而對於嵌入式領域已被廣泛採用的ARM 處理器,了解的可能並不多。如果你有興趣從事嵌入式方面的開發,那麼了解一些RISC 體系結構和ARM彙編的知識還是有必要的。
  • ARM 彙編的mov操作立即數的疑問
    因為對arm彙編有些指令還不能理解,特別是一些相似功能指令間的區別。偶然在網上搜到「faq ARM assembly」,其中描述的幾個問題還是值得好好研究一下。2. 慢慢的發現自己也不再害怕英文的文檔了,耐心看至少也能懂個大概。
  • ARM彙編語言常用指令
    上次說到彙編語言十分重要,所以又為了避免忘記,貼上一些常用彙編指令@mov 指令範例mov r1, #8mov r2, r1mov r3, #10@mvn 傳送取反賦值mvn r1, #0b10mvn