ARM裸机开发-bootloader-汇编语言

来源:互联网 发布:图像识别算法原理 编辑:程序博客网 时间:2024/05/16 09:50

详细的汇编指令可以参考:http://blog.chinaunix.net/uid-25100840-id-340479.html

一、汇编语言概述

1、为什么要使用汇编

一般情况下我们不会用到汇编,但有两种情况下,我们要用到汇编。

1、启动代码。编写bootloader和内核时使用,主要是对cpu和内存进行初始化时使用,因为这个时候还没有c语言的环境(堆栈还没有建立),所以不能用c语言。

2、高效率的特殊需求。因为汇编语言的执行效率要高于c语言,所以对某些对效率要求高的程序要用到汇编,可以是汇编与c语言的混合编程。

2、汇编分类

1、ARM标准汇编,适用于windows平台下ARM公司开发的汇编器ADS。

2、GNU汇编,linux平台下GNU交叉编译工具链中的汇编器。它与ARM标准的一点不同是GNU汇编要在段标记符前加点,例如 .text。而ARM标准则不需要这个点。

3、汇编程序框架

<span style="color:#333333;">(.section).text.global _start_start:<TAB><汇编代码>例子start.Sstart.S.text.global _start_start:mov r1 #1mov r2 #2mov r3 #3</span>
<span style="color:#333333;">makefile文件all:start.oarm-linux-ld -Ttext 0x50000000 -o start.elf $^start.o:start.Sarm-linux-gcc -g -c -o $@ $^clean:rm *.o *.elf</span>

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


0 0
原创粉丝点击