首要要清晰这节课要学的是什么:
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