最近在学ARM Cortex-M3,找了本声称很经典的书“An Definitive Guide to The ARM Cortex-M3”在看。这个系列学习笔记其实便是在学习这本书的过程中做的读书笔记。
无条件跳转指令
跳转指令分为无条件跳转和有条件跳转两大类。无条件跳转类指令十分简略,常见的就四种方式。
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是负数、B是正数,成果D或许是正数(V==1 && N==0)也或许是负数(V==0&& N==1),与上面的状况相似,V假如等于1了,Z必定等于0,所以仍是不必考虑Z。
归纳上面六种状况,咱们可以得到:
A>B 等价于 Z==0 && V==N
A
有了上面的剖析,下面两种状况就很简单得到答案了。
关于A>=B,V==N 就足够了
关于A<=B,Z==1 || V!= N
IF-THEN 指令块
IF-THEN(IT)指令块在其他的单片机中没有见过,这儿值得讲一讲。
IF-THEN(IT)指令围起一个块,晒干最多有4条指令,它晒干的指令可以条件碑文。
IT的运用方式如下:
IT
IT
IT
IT
其间
要完成如下的功用:
if (R0==R1)
{
R3 = R4 + R5;
R3 = R3 / 2;
}
else
{
R3 = R6 + R7;
R3 = R3 / 2;
}
可以写作:
CMP R0, R1 ; 比较R0和R1
ITTEE
ADDEQ R3, R4, R5 ; 持平时加法EQ ; 假如R0 == R1,Then-Then-Else-Else
ASREQ R3, R3, #1 ; 持平时算术右移
ADDNE R3, R6, R7 ; 不等时加法
ASRNE R3, R3, #1 ; 不等时算术右移
IT指令块的初衷应该是避免了在碑文搬运指令时,对流水线的清洗和从头指令预取的开支,可是最多只能有四条指令,使它的运用范围也很受限。或许也便是C言语中用到“:?”运算符的当地比较简单汇编为IT指令块了。还有个边很矮小的if判别,可以被这么优化。