在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 第2課:ARM匯編學(xué)習(xí)

            第2課:ARM匯編學(xué)習(xí)

            作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
            首先要明確這節(jié)課要學(xué)的是什么:

            1通過學(xué)習(xí)ARM匯編語言從而了解ARM處理器的工作原理。

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

            2用匯編寫B(tài)ootloader

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

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

            7種尋址方式:

            1立即數(shù)尋址 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是比較數(shù)的哪一位是1哪一位就變0與AND相反)

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

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

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

            1任何以冒號結(jié)尾的標(biāo)識符都認(rèn)為是一個標(biāo)號,當(dāng)標(biāo)號為0到9的數(shù)字時是局部標(biāo)號。在局部標(biāo)號后加f表示引用標(biāo)號的地方向前的標(biāo)號

            而加b則表示向后

            例如: subs r0,r0,#1

            bne 1f

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

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

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

            .section .data

            <...>

            .section .bss

            <...>

            .section.text

            .globl _start _start是全局的

            _start:代碼從這開始執(zhí)行。

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

            .end 結(jié)束符 不加也不報錯

            .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編譯器中有內(nèi)置的缺省的連接腳本,不過它是基于有操作系統(tǒng)的前提下的才能應(yīng)用加載的。因為他是應(yīng)用操作系統(tǒng)中內(nèi)存的映射地址來連接的。而gnu編譯器目標(biāo)文件的個是是elf格式。它由若干的section組成。里面有。text段。data段。bss段。連接器的任務(wù)就是把多個目標(biāo)文件的。text段。data段。bss段連接在一起。而連接腳本是告訴連接器從什么地址開始放至這些段。

            如link。lds

            ENTRY(begin)

            SECTION

            {

            .=0x30000000; 表示目標(biāo)代碼開始的地址為0x30000000

            .text :{*(.text)}

            .data :{*(.data)}

            .bss :{*(.bss)}

            }

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

            4生成2進(jìn)制文件。2進(jìn)制文件才可以在內(nèi)存中加載

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

            5反匯編

            還可以用objdump來實現(xiàn)反匯編

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

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



            關(guān)鍵詞: ARM匯編學(xué)

            評論


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

            關(guān)閉