Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21624
  • 博文数量: 9
  • 博客积分: 472
  • 博客等级: 下士
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-01 15:38
文章分类
文章存档

2011年(5)

2010年(2)

2009年(2)

我的朋友

分类: LINUX

2009-11-17 21:51:56

1)立即数;可以通过一个八位的数循环右移得到的数才是合法的立即数。在使用MOV指令的时候要小心,一个非法的立即数编译会报错;使用LDR就方便一些,如果用了=,这个LDR就是伪指令了,编译器会把它翻译成两条指令,这样就可以使用任意立即数。
    LDR     r13, =0x8001000
   编译出来就是 
   [0x00000028]   ldr      r13,0x0000007c ; = #0x08001000

   [0x0000007c]   dcd      0x08001000  ....


2)后缀S;将对CPSR产生影响,典型的,在中断返回的时候,对PC操作的指令中,一定要加S,这样会把SPSR的内容恢复到CPSR中。CMP,TST这些指令不用加S,自动影响CPSR。
   SUBS PC , R14_irq , #4

3)点“.”;表示当前指令地址。与PC不同,因为流水线架构,比如三级流水线,一级执行,二级译码,三级装载。
   B      .

4)THUMB状态;指令的0位是状态位,1表示THUMB状态;
    ; switch to thumb mode       
    ADD     r0, pc, #1
    BX      r0

    CODE16
    BL      AppFiqHandler

5)SWP指令可以实现信号量操作,因为一条指令同时操作了两个寄存器;

6)没有取反指令,用XOR实现;没有位设置指令,用ORR实现;

 
————————————————————————————————————————————
    一、ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指令都可以是有条件执行的。
   
    二、ARM指令集是Load/Store型的,只能通过Load/Store指令实现对系统存储器的访问,而其他的指令都是基于处理器内部的寄存器操作完成的,这和INTEL汇编是不同的,初学者很不易理解。
  
   
三、指令的后缀:
    "S"  可选后缀,若指定S,则根据指令执行的结果更新CPSR中的条件码。很多初学着不知道怎么更新,若这条指令执行完以后,对ARM程序状态寄存器的条件码标志(N,Z,C,V)的影响。
    "! " 表示在完成数据操作以后,将更新基址寄存器,并且不消耗额外的时间。
         如:LDR R0, [R1, #4] 他相当于 R0 <- mem32[R1+4]
                                      R1 = R1+4; 
    "^"  LDMFD R13!, (R0-R3, PC)^ //"^"表示一条特殊形式的指令。(在从存储器中装入PC的同时,CPSR也得到恢复)。
 
    四、#号后面加0x或&表示十六进制:#0xFF, #&FF
        #号后面加0b表示二进制。
        #号后面加0d表示十进制。   
*******************************************************************************
 
    五、立即数寻址
    每个立即数都是采用一个8位的常数循环右移偶数位间接得到。
    初学者不易理解:一个32位的指令不可能全部用来保存32位的立即数,所以从指令的编码格式上分析,在指令编码中只分配了12位来存储立即数,其中4位用来保存右循环值,8位用来保存一个常数,所以并不是每一个32位的立即数都是合法的。
 
    六、寄存器寻址
    ADD R3,R2,R1,LSR #2 //寄存器R1的内容右移了两位,但是注意本指令执行完毕以后R1的内容并不改变
 
    七、前变址、自动变址和后变址
    1、前变址:LDR R0,[R1,#4]   //R1寄存器的内容先加4,然后执行操作,
但操作完毕以后,R1的内容不变。
    2、自动变址:上面总结指令后缀时提到"!",表示自动变址(参考上面三 )。
    3、后变址:LDR R0,[R1],#4   //先进行操作然后R1+4->R1,操作完毕后,R1 = R1+4。
不需要"!"号。
 
   
八、堆栈寻址
    一定要注意:堆栈操作总是要指定自动变址的,否则会覆盖以前保存的内容
********************************************************************************
 
    九、乘法指令
    1、乘法指令不支持第二操作数为立即数。
    2、结果寄存器不能同时作为第一源寄存器。
        32位:MUL Rd,Rm,Rs
              MUL Rd,Rm,Rs  //Rd和Rm不能为同一寄存器
        64位:MUL RdHi,RdLo,Rm,Rs //RdHi、RdLo和Rm不能为同一寄存器,RdHi和RdLo不能为同一寄存器。
 
    十、跳转指令
    1、BL和BLX跳转是硬件自动将下一条指令地址保存到LR(R14)中,不需要自己写指令。
阅读(808) | 评论(0) | 转发(0) |
0

上一篇:开博第一篇

下一篇:一个cache相关的问题

给主人留下些什么吧!~~