新闻  |   论坛  |   博客  |   在线研讨会
嵌入式系统基础----常用的arm汇编指令
lionwq | 2008-01-05 17:02:20    阅读:8885   发布文章

###################嵌入式体系结构基础###############
一、指令集:

1.数据传输指令--
 mvn r0,r2 ;r0 = ~r2
 mvns r0,r2 ;影响cpsr

2.逻辑指令--
 add r0,r1,r2 ;r0 = r1 & r2
 orr r0,r1,r2 ;r0 = r1 | r2
 eor r0,r1,r2 ;r0 = r1 ^ r2
 bic r0,r1,r2 ;r0 = r1 & ~r2

3.比较指令--主要用于循环;用完它,下面就要bne了,有点循环的测试条件部分;
 cmp r1,r2
 tst r1,r2 ;根据r1&r2的结果设置cpsr
 teq r1,r2 ;根据r1^r2...

4.算术指令--
 adc r0,r1,r2 ;r0 = r1 + r2 + carry//??????????????

5.程序状态访问指令--当需要修改cpsr/spsr的内容时,
首先要读它的值到一个通用寄存器,-- mrs r0,cpsr
然后修改某些位后,在将数据写回状态寄存器;--msr cpsr,r0

6.单数据访存指令--
 ldr r0,[r1,#0xfff] ;将内存r1+0xfff地址的内容读到r0中。
 str r0,[r1,-r2,LSL#31] ;将r0的内容写到r1-(r2<<31)的内存单元中去。

7.多数据访存,和模拟栈--
 1)stmdb == stmfd ;压栈PUSH
 stmfd sp!,{r0-r12,lr} ;将所有寄存器包括返回地址压栈

 2)ldmia == ldmfd ;出栈POP
 ldmfd sp!,{r0-r12,pc} ;恢复所有寄存器包括PC

二、异常、中断
1.ARM模式分类:
########################################################
usr/system  |  SVC   | Abort   | Undef   |  IRQ  |    FIQ
r0  r0     r0  
r1  r1  r1
r2  r2  r2
r3  r3  r3
r4  r4  r4
r5  r5  r5
r6  r6  r6
r7  r7  r7
r8  r8  r8      r8_FIQ
r9  r9  r9
r10  r10  r10
r11  r11  r11
r12  r12  r12

r13  r13_SVC  r13_ABORT r13_UNDEF r13_IRQ
r14  r14_SVC  r14_ABORT r14_UNDEF r14_IRQ

PC  PC  PC

CPSR  CPSR  CPSR
  SPSR_SVC SPSR_ABORT


######################################################


2.CPSR/SPSR
1)条件标志
-N = ALU计算结果为负
-Z = ALU计算结果为零
-C = ALU计算结果进位
-V = ALU计算结果溢出

2)中断禁止位
-I = 1 ;关IRQ
-F = 1 ;关FIQ
-T:
T = 0 ;处理器当前处于ARM状态
T = 1 ;处理器当前处于THUMB状态

 

3.异常和异常向量表
1)异常向量表 -- 0x18是IRQ;

2)优先级:
-RESET ;
-DATA ABORT ;
-FIQ
-IRQ
-Prefetch
-SWI/Undef

异常的产生:
1)外部异常:复位,FIQ,IRQ
2)间接异常:数据终止(在LOAD和STORE数据访存时的存储器故障)
3)直接异常:软件中断,未定义指令和预取指令


3.异常时的模式切换
异常发生后
################在跳到异常向量表前硬件做得事情###################
-将CPSR拷贝到SPSR_<MODE>

-设置将要用在异常模式的CPSR中的适当位
 清除CPSR中的Thumb位(异常进入后就均为ARM STATUS,不可能是Thumb);
 修改相应的模式位;
 关中断(如果是RESET OR FIQ异常,还要关FIQ)

-映射相应模式寄存器;

-将PC保存LR_<MODE>,用于返回;

-将PC指向异常向量表的某个地址;

##################处理异常中...#################################
......
...
..
.
.

#########异常处理结束,异常返回##################################

-从SPSR_<MODE>中恢复CPSR

-用LR_<MODE>恢复PC /* 注意流水线的影响 */
SO,我们讨论一下在各种异常返回时,因为流水线的原因,对返回地址的调整;
-SWI/UND:             movs pc,r14_swi/und
- FIQ/IRQ/Prefetch:  subs pc,r14_<mode>,#4
- DataABR:              subs pc,r14_ABORT,#8

###############################END###########################

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
Nancy  2008-01-11 17:03:18 

bu cuo!

淡泊以明志 宁静以致远
推荐文章
最近访客