您的位置 首页 编程

第2课:ARM汇编学习

首先要明确这节课要学的是什么:1通过学习ARM汇编语言从而了解ARM处理器的工作原理。2用汇编写Bootloader在这里汇编的基本语法在《ARM嵌入…

首要要清晰这节课要学的是什么:

1经过学习ARM汇编语言然后了解ARM处理器的作业原理。

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!{r1-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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/274787.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部