ARM Cortex-M3 学习笔记(4-4)
无条件跳转指令
跳转指令分为无条件跳转和有条件跳转两大类。无条件跳转类指令非常简单,常见的就四种形式。
B Label ;跳转到Label处对应的地址, 无条件跳转指令
BX reg ;跳转到由寄存器reg给出的地址, 无条件跳转指令
BL Label ;跳转到Label对应的地址,并且把跳转前的下条指令地址保存到LR
BLX reg ;跳转到由寄存器reg给出的地址,并根据REG的LSB切换处理器状态,还要把转移前的下条指令地址保存到LR
标志位与条件转移指令
在讲解条件跳转指令之前。先要讲讲APSR中的四个四个标志位:N, Z, C, V。
实际上,Cortex-M3中的APSR的标志位共有5个,但只有NZCV这四个可以用于条件跳转指令。下图中先给出Cortex-M3中的程序状态寄存器(xPSR)的位图。
图 1 Cortex-M3中的程序状态寄存器(xPSR)
可以看出,NZCV这四位位于xPSR 的最高四位。这四位的作用分别如下:
标志位 | 作用 |
N | 负数(上一次操作的结果是个负数)。N=操作结果的MSB |
Z | 零(上次操作的结果是0)。当数据操作指令的结果为0,或者比较/测试的结果为0时,Z置位。 |
C | 进位(上次操作导致了进位)。C用于无符号数据处理,最常见的就是当加法进位及减法无借位时C被置位。此外,C还充当移位指令的中介(详见v7M参考手册的指令介绍节)。 |
V | 溢出(上次操作结果导致了数据的溢出)。该标志用于带符号的数据处理。比如,在两个正数上执行ADD运算后,和的MSB为1(视作负数),则V置位。 |
关于C和V这两位我要多说几句。Cortex-M3中的进位标志与其他一些单片机有些不同。对加法运算它表示的是结果有进位,这与其他单片机中的含义是相同的。对减法运算,它表示的是结果无借位,与有一些单片机(比如Freescale 的68HC11/12系列)中的含义正好相反。之所以这里这样定义进位标志,我想是这样考虑的。整数的减法运算A-B实际是转化为了A+(-B),-B用补码表示。进位标志C指示的是A与(-B)相加时是否有进位。A-B无进位等价于A+(-B)有进位。当然,后来我发现有个特例,就是当B=0时,(-B)=0,A-0 是没有进位的,但A+(-0)也没有进位。这时可以这样理解,对0取反操作时,也就是得到-0时已经产生的进位(取反加1,加1时进位了)。所以结果也认为是进位了。
溢出位(V)置位有四种情况:
1.两个整数相加结果为负数时
2.两个负数相加结果为正数时
3.一个正数减一个负数结果为负数时
4.一个负数减一个正数结果为正数时
这四种情况与我们的直观是一致的,因此不需要特殊记忆。
担任条件跳转及条件执行的判据时,这4个标志位既可单独使用,又可组合使用,以产生共15种跳转判据,如下表所示。
符号 | 条件 | 关系到的标志位 |
EQ | 相等(EQual) | Z==1 |
NE | 不等(NotEqual) | Z==0 |
CS/HS | 进位(CarrySet) 无符号数大于等于 | C==1 |
CC/LO | 未进位(CarryClear) 无符号数小于 | C==0 |
MI | 负数(MInus) | N==1 |
PL | 非负数 | N==0 |
VS | 溢出 | V==1 |
VC | 未溢出 | V==0 |
HI | 无符号数大于 | C==1 && Z==0 |
LS | 无符号数小于等于 | C==0 || Z==1 |
GE | 带符号数大于等于 | N==V |
LT | 带符号数小于 | N!=V |
GT | 带符号数大于 | Z==0 && N==V |
LE | 带符号数小于等于 | Z==1 || N!=V |
AL | 总是 | - |
上面的表格将各种情况都罗列的很清楚,但为什么是这样还是值得详细地说说的。
EQ、NE、MI、PL、VS、VC和AL 很好理解,不用多说。
值得细说的是CS/HS、CC/LO、HI、LS、GE、LT、GT、LE。
首先,我们知道在计算机中,整数分为有符号型和无符号型。这两种类型的判别是不同的。先说无符号数。假设有两个无符号整数A和B。他们之间的关系可以为:
A==B、A!=B、A>B、A>=B、A
判断的方法就是两数字相减A-B=D,然后看标志位。
A==B、A!=B 看 Z 位就可以了,这里不详述。
对于A>B,首先Z==0(表明两数不相等),然后得到的结果必须满足D<=A,也就是进位标志C==1(表示减法时没有产生借位),合起来就是Z==0&& C==1,这时用后缀HI。这里啰嗦一句,进位标志置1的含义是加法时产生了进位或减法时没有产生借位。
对于A>=B,只用进位标志C==1(没有产生借位)就可以了,用后缀HS或CS。
对于A
对于A<=B,要么就是Z==1(两数相等),要么C==0(A
假设A和B是有符号整数。他们之间的关系同样可以为:
A==B、A!=B、A>B、A>=B、A
A==B、A!=B 看 Z 位就可以了。
其他的比较稍微困难一些,我们要用到溢出位V。
对于A>B,有三种可能的情况
A、B都是正数,结果D是正数。Z==0 && V==0 && N==0
A、B都是负数,结果D是正数。Z==0 && V==0 && N==0
A是正数、B是负数,结果D可能是正数(Z==0 && V==0 && N==0)也可能是负数(V==1 && N==1)
对于A
A、B都是正数,结果D是负数。V==0 && N==1,不用考虑Z,因为N==1决定了Z==0
A、B都是负数,结果D是负数。V==0 && N==1,不用考虑Z,因为N==1决定了Z==0
A是负
ARMCortex-M 相关文章:
- 让ARM Cortex-M7再想一一会儿(11-26)
- ARM CORTEX-M3 内核架构理解归纳(11-21)
- ARM Cortex-M3 内核介绍(11-21)
- ARM Cortex-M3 学习笔记(4-5)(11-20)
- ARM Cortex-M3 学习笔记(4-6)(11-20)
- ARM Cortex-M3 学习笔记(6)(11-20)