版权所有,转载必须说明转自 http://my.csdn.net/weiqing1981127
原创作者:南京邮电大学 通信与信息系统专业 研二 魏清
ARM寄存器
普通寄存器R0-R15,状态寄存器CPSR和SPSR。其中R15别名PC,中文名程序计数器;R14别名LR,中文名链接寄存器;R13别名SP,中文名栈指针寄存器。
CPU执行一条指令时主要有三个步骤:取指、译码和执行。流水线操作的本质是利用指令运行的不同阶段使用的CPU硬件资源互不相同,并发的运行多条指令,从而提高时间效率。
无论几级流水线,指令执行时,PC值=当前正在执行指令在内存中的地址+8,理由是PC永远指向取指处。
ARM基本寻址方式
1.寄存器寻址如MOV PC,LR
2.立即数寻址 MOV PC,#64
3.寄存器间接寻址 LDR R0,[R2]
4.基址寻址:
LRD R0,[R1,#0X04] ; 说明[R1+4]->R0 R1+4->R1
LDR R0,[R1],#0X04 ; 说明[R1]->R0 R1+4->R1
LDR R0,lable ; 说明等价于LDR R0,[PC+#常数]
5.多寄存器寻址
LDMIA R1!,{R2-R3,R6} ;说明[R1]->R2 [R1+4]->R3 [R1+8]->R6
其他后缀包括IA,IB,DA和DB;前缀包括STR
6.堆栈寻址
以STM完成入栈操作,以LDM完成出栈操作。另外栈可以分为递增或递减和空或满堆栈,出现的后缀组合就是EA.ED,FA和FD。
STMFD R13!,{R4,R14} ;说明把R4和R14压人满递减堆栈SP中
7.寄存器移位寻址
移位方式有LSL,LSR,ASR,ROR和RRX。
MOV R0,R2,LSL,#3 ; 说明R2*8->R0
8.相对寻址
由程序计数器OC提供基准地址,指令中的地址码字段作为偏移量,两者相加形成地址。
B LOOP ; 说明LOOP为标号
ARM指令部分:基本指令、伪操作、伪指令
1.基本指令
1.1单寄存器加载指令 LDR R0,[R1]
1.2单寄存器存储指令 STR R0,[R1]
1.3分支指令 B/BL/BX
1.4数据处理指令
MOV R0,R1
ADD(SUB) R0,R1,R2 ;说明R1+R2->R0
AND(ORR/EOR) R0,R1,R2 ;说明R1&R2->R0
CMP R1,R2 ;说明比较完后用带EQ,GE,LE,GT,LT等后缀的指令
1.5其他指令包括访存指令、数据处理指令和乘法指令等,例如BIC/TEST/ADC/MVN….
2.伪操作
汇编伪操作是给编译器看的,而不是给CPU看的,这是伪操作和指令的区别。伪操作主要包括符号定义、数据定义、汇编控制和信息报告等,下面是常见伪操作
2.1定义全局算术变量 GBLA VAL
2.2对全局变量进行赋值 VAL SETA 1
2.3分配存储空间 DCD 0X12345678 或DCB ‘a’
2.4条件编译IF ELSE ENDIF
2.5循环WHILE和WEND
2.6宏MACRO/MEND/MEXIT
2.7其他如EQU/IMPORT/EXPORT
3.伪指令
伪操作不会被编译器编译成机器指令,而伪指令会被编译器编译成一条或多条机器指令。伪指令主要包括LDR/ADR/ADRL/NOP,下面是伪指令的实例
LDR R0,[R1] ;说明指令,把R1指向的内存地址里存放的内容加载到R0中
LDR R0,label ;说明指令,把标号lable代表的内存地址里存放的内容加载到R0中
LDR R0,=10000 ;说明伪指令,把常数10000赋给R0
LCD R0,=lable ;说明伪指令,把标号lable代表的内存地址赋给R0
ARM中汇编和C混合编程
对于C和ARM汇编的混合编写,必须遵循ATPCS(ARM和Thumb程序中子程序调用规则)。主要内容包括规定数据栈为FD类型;参数传递时,前四个整数参数通过寄存器R0-R3传递。
混合编程主要掌握在C中调用汇编子程序;在汇编中调用C的子程序;在C中访问汇编的全局变量;在汇编中访问C的全局变量;C和汇编的嵌套编程,主要涉及IMPORT和EXPORT伪操作。
ARM系统时钟
对于Mini2440开发板有一个12M晶振,通过时钟控制锁相环PLL来提供主频,ARM920T内核的S3C2440的最高正常工作频率是FCLK=400MHZ/HCLK=100MHZ/PCLK=50MHZ,其中FCLK是为ARM920T内核提供工作频率;HCLK主要是为AHB总线上挂接内存、NAND、LCD控制器等硬件提供工作频率;PCLK主要为APB总线上挂接UART串口、Watchdog等硬件控制器提供工作频率。
ARM处理器的工作模式
对于ARM处理器,总共有7种工作模式,分别是用户模式、系统模式、一般中断(IRQ)模式、快中断(FIQ)模式、管理模式、中止模式和未定义模式。除了用户模式外,其他都属于特权模式,特权模式中除了系统模式之外,其他五种模式又统称异常模式。
用户模式下想要访问硬件资源或者切换到其他模式只能通过软件中断或产生异常;系统模式和用户模式共用一套寄存器;快速中断模式是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道中处理;管理模式是CPU上电后默认模式,因此在该模式下主要是用来做系统的初始化,软中断处理也在该模式下;中止模式是当用户访问非常地址时便会抛出segmnet fault信息。
除了用户模式和系统模式,其余模式下都有一个私有SPSR保存状态寄存器,用来保存切换到该模式之前的执行状态,使用MRS指令可以对CPSR/SPSR读操作,使用MSR指令可以对CPSR/SPSR写操作。
ARM处理器的异常
对于ARM处理器的异常,其主要包括复位异常;一般/快中断请求、预取指令中止异常、未定义指令异常、软件中断指令异常和数据中断访问异常。需要说明的是预取指令中止异常是指在CPU取指阶段,如果目标指令地址非法,则进入预取指令中止异常;未定义指令异常是发生在流水线的译码阶段,如果当前指令不能被识别为有效指令,就会进入未定义指令异常;软件中断指令异常发生在诸如printf时候;数据中止访问异常发生在要访问的数据地址不存在或非法的时候。
另外,异常发生时,ARM内核会自动保存执行状态,然后模式切换,接着保存返回地址,最后跳入异常向量表。
重定向问题
Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。