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.S
start.S
.text
.global _start
_start:
mov r1 #1
mov r2 #2
mov r3 #3
makefile文件
all:start.o
arm-linux-ld -Ttext 0x50000000 -o start.elf $^
start.o:start.S
arm-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, #0xf mov r1, #0xff @str r0, [r1] @ldr r2, [r1] @ 程序状态字访问指令 mrs r0, cpsr orr r0, r0, #0b100 msr cpsr, r0 @移位指令 mov r1, #0b110000 mov r1, r1, lsl#2 mov r1, r1, ror#4 @跳转指令 mov r1, #6 mov r2, #5 cmp r1, r2 bgt branch1 b end branch1: sub r3, r1, r2 end: nop bl func1 mov r1, r2 func1: mov r1, r2 mov pc, lr @比较指令 mov r1, #2 cmp r1, #1 mov r1, #1 cmp r1, #2 mov r1, #1 cmp r1, #1 mov r1, #0b1011 tst r1, #0b01 mov r1, #0b1011 tst r1, #0b100 @算术与逻辑指令 mov r1, #8 mov r2, r1 mov r3, #10 mvn r1, #0b11 mvn r2, #5 mvn r3, r1 mov r1, #9 sub r2, r1, #4 sub r3, r1, r2 mov r1, #1 mov r2, #2 add r3, r1, #44 add r3, r1, r2 mov r1, #0b1011 and r2, r1, #0b11 mov r1, #0b1011 bic 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,0x89 mov 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, 0 nop
上一篇:ARM裸机开发bootloader交叉工具链
下一篇:ARM裸机开发bootloader内存初始化
推荐阅读最新更新时间:2024-03-16 14:56