<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

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

2用匯編寫(xiě)Bootloader

在這里匯編的基本語(yǔ)法在《ARM嵌入式系統開(kāi)發(fā)》里面已經(jīng)寫(xiě)過(guò)了。這里就寫(xiě)一點(diǎn)需要特別注意的地方

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

7種尋址方式:

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

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

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

4寄存器變址尋址 :前變址,自動(dòng)變址,后變址

LDR r0,[r1,#4]

LDR r0,[r1,#4]!

LDR r0,[r1],#4

5堆棧尋址 我們一般用FD 滿(mǎn)遞減 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的情況下 再加^(guān)表示把spsr拷貝到cpsr中。

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

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

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

接下來(lái)說(shuō)本課的重點(diǎn) armlinux的編譯器gcc

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

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

而加b則表示向后

例如: subs r0,r0,#1

bne 1f

2 。section偽操作來(lái)定義一個(gè)段,后加段名

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

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

.section .data

<...>

.section .bss

<...>

.section.text

.globl _start _start是全局的

_start:代碼從這開(kāi)始執行。

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

.end 結束符 不加也不報錯

.include 包含頭文件

.global 定義一個(gè)全局符號

編譯器 5大工具

arm-linux-as

arm-linux-gcc

arm-linux-ld

arm-linux-objcopy

arm-linux-objdump

介紹下一個(gè)ARM程序誕生的步驟。

1寫(xiě)程序

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

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

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

如link。lds

ENTRY(begin)

SECTION

{

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

.text :{*(.text)}

.data :{*(.data)}

.bss :{*(.bss)}

}

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

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

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

5反匯編

還可以用objdump來(lái)實(shí)現反匯編

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ù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>