ARM裸机开发bootloader汇编语言
1、为什么要使用汇编
一般情况下我们不会用到汇编,但有两种情况下,我们要用到汇编。
1、启动代码。编写bootloader和内核时使用,主要是对cpu和内存进行初始化时使用,因为这个时候还没有c语言的环境(堆栈还没有建立),所以不能用c语言。
2、高效率的特殊需求。因为汇编语言的执行效率要高于c语言,所以对某些对效率要求高的程序要用到汇编,可以是汇编与c语言的混合编程。
2、汇编分类
1、ARM标准汇编,适用于windows平台下ARM公司开发的汇编器ADS。
2、GNU汇编,linux平台下GNU交叉编译工具链中的汇编器。它与ARM标准的一点不同是GNU汇编要在段标记符前加点,例如 .text。而ARM标准则不需要这个点。
3、汇编程序框架
(.section).text.global _start_start:<汇编代码>例子start.Sstart.S.text.global _start_start:mov r1 #1mov r2 #2mov r3 #3
makefile文件all:start.oarm-linux-ld -Ttext 0x50000000 -o start.elf $^start.o:start.Sarm-linux-gcc -g -c -o $@ $^clean:rm *.o *.elf
4、eclipse汇编和调试
调试之前要对调试进行设置,调试的对象是elf文件。还要输入初始化脚本,目的是对处理器进行初始化。
终止用Run-Terminate
二、汇编指令分类学习
1、算术与逻辑指令mov mvn add sub and bic
2、比较指令cmp tst
3、跳转指令b bl
4、移位指令lsl ror
5、程序状态字访问指令msr mrs
6、存储器访问指令ldr str
http://blog.csdn.net/quyang0602/article/details/7527496
http://yxmyifeng.blog.163.com/blog/static/12978978220100194272529/
.text.global _start_start:@存储器访问指令mov r0, #0xfmov r1, #0xff@str r0, [r1]@ldr r2, [r1]@ 程序状态字访问指令mrs r0, cpsrorr r0, r0, #0b100msr cpsr, r0@移位指令mov r1, #0b110000mov r1, r1, lsl#2mov r1, r1, ror#4@跳转指令mov r1, #6mov r2, #5cmp r1, r2bgt branch1b endbranch1:sub r3, r1, r2end:nopbl func1mov r1, r2func1:mov r1, r2mov pc, lr@比较指令mov r1, #2cmp r1, #1mov r1, #1cmp r1, #2mov r1, #1cmp r1, #1mov r1, #0b1011tst r1, #0b01mov r1, #0b1011tst r1, #0b100@算术与逻辑指令mov r1, #8mov r2, r1mov r3, #10mvn r1, #0b11mvn r2, #5mvn r3, r1mov r1, #9sub r2, r1, #4sub r3, r1, r2mov r1, #1mov r2, #2add r3, r1, #44add r3, r1, r2mov r1, #0b1011and r2, r1, #0b11mov r1, #0b1011bic r2, r1, #0b101
三、伪指令
1、ARM伪指令怎么定义
ARM伪指令没有对应的机器码,只有在编译过程中起作用,或者转化成其他实际执行的指令来进行操作。
任何的CPU执行的都是机器码,也就是二进制映像文件。
2、伪指令的学习方法
对elf文件进行反汇编,查看反汇编文件中伪指令是如何转化为其他指令执行的。
arm-linux-objdump -D -S
ARM的机器码是32位的整数,被分为几个段,每个段都有自己的意义。机器码与每条指令是一一对应的。
3、伪指令定义
.global全局
.data数据
.ascii字符串
.byte字节
.word字
.align对齐
.equ宏
.equ DA,0x89mov r0,#DA.align 4
4、操作类伪指令
nop 空指令,等效于 mov ro, ro 可以用于延时,保证时序要求。
ldr
mov ro, 0x1ff 这样定义就会出错,因为mov的操作数最多只有8位,另外4位是左右移动表示位。
解决方案:
ldr ro, =0x1ff 等效于ldr r0, [pc, #-4]
四、ARM协处理器访问指令
1、什么是协处理器
协处理器顾名思义就是助手的意思,协处理器可以帮助中央处理器处理一些特定的事务,例如数学协处理器,就可以处理一些数学方面的运算。协处理器有自己的寄存器,cpu通过访问协处理器的寄存器实现与协处理器的协同工作。
2、ARM的CP15
ARM最多达16个协处理器,CP15共提供了16组寄存器,下面是一段来自ARM11手册的CP15的原文介绍
The purpose of the system control coprocessor, CP15, is to control and provide status information for the functions implemented in the ARM1176JZF-S processor. The main functions of the system control coprocessor are:
1、overall system control and configuration
2、cache configuration and management
3、Tightly-Coupled Memory(TCM)紧耦合内存,性能类似cache
4、Memory Management Unit(MMU) configuration and management
5、DMA control
6、system performance monitoring.
3、协处理器的访问指令
mcr和mrc,mcr实现通用寄存器数据向协处理器传送。mrc实现了协寄存器向通用寄存器的传送。
下面是一个例子(参考ARM11手册编写)
.text.global _start_start:mrc p15, 0, r0, c0, c0, 0nop
ARM裸机开发bootloader汇编语 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)