一、汇编言语概述
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