ARM笔记

                                                           寄存器

普通寄存

R0-R15为普通寄存器,特别要提出来的是R13、R14、R15。

R15 别名PC(program counter),中文称为程序计数器,它的值是当前正在执行的指令在内存中的位置(不考虑流水线的影响,参见“流水线对PC值的影响”),而当指令执行结束后,CPU硬件会自动将PC的值加上一个单位,从而使得PC的值为下一条即将执行的指令在内存中的位置,这样CPU硬件就可以根据PC的值自动完成取指的操作。正是由于有PC的存在,以及CPU硬件会自动增加PC的值,并根据PC的值完成取指操作,才使得CPU一旦上电就永不停歇地运转,由此可见PC寄存器对于计算机的重要性。对于我们进行汇编程序编写而言,PC寄存器亦是十分重要,因为当程序员通过汇编指令完成了对PC寄存器的赋值操作的时候,其实就是完成了一次无条件跳转,这一点非常重要,请务必要牢记。

R14别名LR(linked register),中文称为链接寄存器,它与子程序调用密切相关,用于存放子程序的返回地址,它是ARM程序实现子程序调用的关键所在。

状态寄存器CPSR与SPSR

1.CPSR

(1)条件代码标志位。它们是ARM指令条件执行的依据。

       N:运算结果的最高位反映在该标志位。对于有符号二进制补码,结果为负数时N=1,结果为正数或零时N=0;

       Z:指令结果为0时Z=1(通常表示比较结果“相等”),否则Z=0;

       C:当进行加法运算(包括CMN指令),并且最高位产生进位时C=1,否则C=0。当进行减法运算(包括CMP 指令),并且最高位产生借位时C=0,否则C=1。对于结合移位操作的非加法/减法指令,C为从最高位最后移出的值,其它指令C通常不变。

       V:当进行加/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变

(2)控制位。它们将控制CPU是否响应中断。

        I:中断禁止位,当I位置位时,IRQ中断被禁止。

        F:快中断禁止位,当F位置位时,FIQ中断被禁止。

       T:反映了CPU当前的状态。当T位置位时,处理器正在Thumb状态下运行;当T位清零时,处理器正在ARM状态下运行。

(3)模式位

包括M4、M3、M2、M1和M0,这些位决定了处理器的模式。

总共有7种模式:用户、快中断、中断、管理、中止、未定义、系统,分别会用于不同的情况和异常。由此可见,不是所有模式位的组合都定义了有效的处理器模式,如果使用了错误的设置,将引起一个无法恢复的错误。

2. SPSR(saved program status register)

中文名称:保存的程序状态寄存器

该寄存器的结构与CPSR完全一样,在异常发生时(关于异常,请参见“ARM处理器模式与异常初步”),由硬件自动将异常发生前的CPSR的值存放到SPSR中,以便将来在异常处理结束后,程序能恢复原来CPSR的值。

 

 

 

 

指令

1. 单寄存器加载指令。主要有

加载字指令:LDR r0, [r1],将内存中的一个字(4个字节)加载到寄存器r0中

加载字节指令:LDRB r0, [r1],将内存中的一个字节加载到寄存器r0中

有符号数加载字节指令:LDRSB r0, [r1],这条指令与上一条指令的不同之处在于,由于加载的是一个字节,而不是一个字,所以需要确定寄存器r0的高24bit是什么。对于上一条指令,r0的高24bit补0,而本条指令,r0的高24bit补符号位,也就是补r0的bit7

2. 单寄存器存储指令。主要有

存储字指令:STR r0, [r1],将r0中的值存储到内存的4个字节中

存储字节指令:STRB r0, [r1],将r0的低8bit存储到内存的1个字节中

3. 分支指令,共3条:B、BL、BX

B label :跳转到标号label处,也就是说在该条b指令执行后,下一条执行的指令是标号label处的指令。

BL label :与B指令的功能相同,也实现跳转,不同之处在于,bl在跳转的同时还要将返回地址(bl指令的下一条指令的地址)保存到lr中

BX r0 :将r0的值作为地址,跳转到该地址处,并根据r0的值决定是否在ARM和thumb态之间进行切换。

特别说明:

B和BL指令,其跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。

4. 数据处理指令

MOV r0, r1:将r1的值赋给r0

ADD(SUB) r0, r1, r2:将r1的值加上(减去)r2的值,结果存放到r0中

AND(ORR, EOR) r0, r1, r2:将r1的值与(或、异或)r2的值,结果存放到r0中

CMP r1, r2:比较r1与r2值的大小

特别需要说明的问题:

指令CMP r1,r2,其运行细节是:执行r1 - r2的操作,如果结果为负数,则置位CPSR的N位,清零Z位;结果为0,则清零CPSR的N位,置位Z位;结果为正,则清零CPSR的N位,清零Z位。但r1 - r2的结果并不保存。CMP指令通常用于分支跳转。例如,如下的C程序

int i,j;

if (i = = j) {

i++;

} else {

j++;

}

如果使用汇编语句改写的话,就应该写为:

使用ldr指令将变量i的值放入r0

使用ldr指令将变量j的值放入r1

cmp r0, r1

addeq r0, r0, #1

使用streq指令将r0的值放入变量i中

beq label

add r1, r1, #1

使用str指令将r1的值放入变量j中

label   其它代码

……

其中addeq, streq, beq这几条指令,是add, str, b指令的条件执行版本。讲到这里就不得不讲解一下什么是条件执行了。ARM指令集的所有指令均支持条件执行,条件执行指的是,指令可以根据自己即将被执行时的情况(CPSR的条件代码标志位)决定自身是否被执行。eq表示如果CPSR的Z位为1(对于本程序,实际上就是r0的值与r1的值相等,因为cmp会根据 r0与r1的值设置Z位)的情况下,该指令要执行,否则不执行。

 

转载于:https://my.oschina.net/phybrain/blog/1557936

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值