新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第2課:ARM匯編學習

        第2課:ARM匯編學習

        作者: 時間:2016-11-11 來源:網絡 收藏
        首先要明確這節課要學的是什么:

        1通過學習ARM匯編語言從而了解ARM處理器的工作原理。

        本文引用地址:http://www.104case.com/article/201611/316805.htm

        2用匯編寫Bootloader

        在這里匯編的基本語法在《ARM嵌入式系統開發》里面已經寫過了。這里就寫一點需要特別注意的地方

        我們學匯編,并不是要求用匯編寫很多復雜的程序。那樣不切實際,那些可以用更高一層的C來寫。

        7種尋址方式:

        1立即數尋址 ADD r0,r0,#1

        2寄存器尋址 ADD r0,r0,r1

        3寄存器間接尋址 LDR r0,[r1]

        4寄存器變址尋址 :前變址,自動變址,后變址

        LDR r0,[r1,#4]

        LDR r0,[r1,#4]!

        LDR r0,[r1],#4

        5堆棧尋址 我們一般用FD 滿遞減 LDM {sp}!,{r1-r4}

        只用于堆棧

        6塊拷貝尋址

        LDMIA LDMIB LDMDA LDMDB

        7相對尋址

        BL label 相對地址的尋址

        LDR pc,label 或 MOV pc,label 絕對地址的尋址

        具體指令不再做介紹了。補充一些:

        1在例如 LDMFD sp?。鹯1-r5,pc}^

        在加了pc的情況下 再加^表示把spsr拷貝到cpsr中。

        2乘法指令一般不太用,效率低。即使要用也用位移來代替。

        3AND與 用來志零 ORR或用來志1 EOR異或用來取反 BIC用來清位(BIC是比較數的哪一位是1哪一位就變0與AND相反)

        而TST是沒有結果寄存器的AND 并且改變cpsr TEQ是異或 CMP是減法。

        接下來說本課的重點 armlinux的編譯器gcc

        在win下面用的是armcc,而我們的用gcc

        1任何以冒號結尾的標識符都認為是一個標號,當標號為0到9的數字時是局部標號。在局部標號后加f表示引用標號的地方向前的標號

        而加b則表示向后

        例如: subs r0,r0,#1

        bne 1f

        2 。section偽操作來定義一個段,后加段名

        匯編系統有預定義的段名 。text 代碼段 。data初始化數據段 。bss未初始化數據段 (。bss要在text之前)

        3定義入口點,默認下是start標號,也可以在連接腳本中用ENTRY(標志)來指示入口標志。連接腳本之后介紹。

        .section .data

        <...>

        .section .bss

        <...>

        .section.text

        .globl _start _start是全局的

        _start:代碼從這開始執行。

        4. .align 2(4,8,16) 對齊方式

        .end 結束符 不加也不報錯

        .include 包含頭文件

        .global 定義一個全局符號

        編譯器 5大工具

        arm-linux-as

        arm-linux-gcc

        arm-linux-ld

        arm-linux-objcopy

        arm-linux-objdump

        介紹下一個ARM程序誕生的步驟。

        1寫程序

        2編譯成.o文件  用arm-linux-gcc -c link.s -o link.o

        如果使用-S選項 對用C寫的程序表示編譯生成匯編文件

        3編寫連接腳本,編譯成elf格式的文件:首先明確為什么要連接:有2點,1地址重定向。2寫符號表。在gcc編譯器中有內置的缺省的連接腳本,不過它是基于有操作系統的前提下的才能應用加載的。因為他是應用操作系統中內存的映射地址來連接的。而gnu編譯器目標文件的個是是elf格式。它由若干的section組成。里面有。text段。data段。bss段。連接器的任務就是把多個目標文件的。text段。data段。bss段連接在一起。而連接腳本是告訴連接器從什么地址開始放至這些段。

        如link。lds

        ENTRY(begin)

        SECTION

        {

        .=0x30000000; 表示目標代碼開始的地址為0x30000000

        .text :{*(.text)}

        .data :{*(.data)}

        .bss :{*(.bss)}

        }

        然后通過arm-linux-ld -nostadlib -o link.elf -Tlink.lds link.o main.o 生成elf格式的文件。其中nostadlib表示不連接系統的庫,-T表示采用連接腳本。也可以使用-Ttext address;address表示執行區地址。

        4生成2進制文件。2進制文件才可以在內存中加載

        arm-linux-objcopy -o link.bin link.elf

        5反匯編

        還可以用objdump來實現反匯編

        arm-linux-objdump -D link.elf > a.dis

        arm-linux-objdump -D -b binary-m arm link.bin >a.dis



        關鍵詞: ARM匯編學

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 湟源县| 吴旗县| 福海县| 依安县| 抚远县| 兴和县| 武陟县| 瑞丽市| 宜川县| 鸡泽县| 邳州市| 长春市| 康平县| 鄂托克旗| 沂源县| 无为县| 厦门市| 阿拉善盟| 顺义区| 徐闻县| 依兰县| 桃园市| 武定县| 保靖县| 宁蒗| 凌源市| 云安县| 屏边| 安乡县| 柏乡县| 郎溪县| 堆龙德庆县| 丰台区| 克山县| 遂平县| 乐昌市| 得荣县| 安塞县| 紫阳县| 九龙坡区| 外汇|