打印
[其他ST产品]

STM32 xPSR影响的条件指令

[复制链接]
200|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kqh11a|  楼主 | 2022-8-30 23:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ST, ps

最近在学ARM Cortex-M3,找了本号称很经典的书“An Definitive Guide to The ARM Cortex-M3”在看。这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。

无条件跳转指令

跳转指令分为无条件跳转和有条件跳转两大类。无条件跳转类指令非常简单,常见的就四种形式。


使用特权

评论回复
沙发
kqh11a|  楼主 | 2022-8-30 23:27 | 只看该作者
B Label ;跳转到Label处对应的地址, 无条件跳转指令

BX reg ;跳转到由寄存器reg给出的地址, 无条件跳转指令

BL Label ;跳转到Label对应的地址,并且把跳转前的下条指令地址保存到LR

BLX reg ;跳转到由寄存器reg给出的地址,并根据REG的LSB切换处理器状态,还要把转移前的下条指令地址保存到LR

使用特权

评论回复
板凳
kqh11a|  楼主 | 2022-8-30 23:29 | 只看该作者

使用特权

评论回复
评论
kqh11a 2022-8-30 23:30 回复TA
图 1 Cortex-M3中的程序状态寄存器(xPSR) 
地板
kqh11a|  楼主 | 2022-8-30 23:30 | 只看该作者
可以看出,NZCV这四位位于xPSR 的最高四位。这四位的作用分别如下:

关于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时进位了)。所以结果也认为是进位了。

使用特权

评论回复
5
kqh11a|  楼主 | 2022-8-30 23:31 | 只看该作者
溢出位(V)置位有四种情况:

1.        两个整数相加结果为负数时

2.        两个负数相加结果为正数时

3.        一个正数减一个负数结果为负数时

4.        一个负数减一个正数结果为正数时

这四种情况与我们的直观是一致的,因此不需要特殊**。

使用特权

评论回复
6
kqh11a|  楼主 | 2022-8-30 23:32 | 只看该作者
担任条件跳转及条件执行的判据时,这4个标志位既可单独使用,又可组合使用,以产生共15种跳转判据,如下表所示。

使用特权

评论回复
7
kqh11a|  楼主 | 2022-8-30 23:33 | 只看该作者

使用特权

评论回复
8
kqh11a|  楼主 | 2022-8-30 23:35 | 只看该作者
上面的表格将各种情况都罗列的很清楚,但为什么是这样还是值得详细地说说的。

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<B、A<=B

判断的方法就是两数字相减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<B,只要进位标志C==0(产生借位了肯定就是A<B),用后缀LO。

对于A<=B,要么就是Z==1(两数相等),要么C==0(A<B),合起来是C==0||Z==1,用后缀LO。

使用特权

评论回复
9
kqh11a|  楼主 | 2022-8-30 23:36 | 只看该作者
假设A和B是有符号整数。他们之间的关系同样可以为:

A==B、A!=B、A>B、A>=B、A<B、A<=B

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<B,有三种可能的情况

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<B 等价于 V!=N



有了上面的分析,下面两种情况就很容易得到答案了。

对于A>=B,V==N 就足够了

对于A<=B,Z==1 || V!= N

使用特权

评论回复
10
kqh11a|  楼主 | 2022-8-30 23:37 | 只看该作者
IF-THEN 指令块

IF-THEN(IT)指令块在其他的单片机中没有见过,这里值得讲一讲。

IF-THEN(IT)指令围起一个块,里面最多有4条指令,它里面的指令可以条件执行。



IT的使用形式如下:

IT <cond> ;围起1条指令的IF-THEN块

IT<x> <cond> ;围起2条指令的IF-THEN块

IT<x><y> <cond> ;围起3条指令的IF-THEN块

IT<x><y><z> <cond>;围起4条指令的IF-THEN块

其中<x>, <y>,<z>的取值可以是“T”或者“E”。下面是个例子:

要实现如下的功能:

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 ; 不等时算术右移

使用特权

评论回复
11
kqh11a|  楼主 | 2022-8-30 23:38 | 只看该作者
IT指令块的初衷应该是避免了在执行转移指令时,对流水线的清洗和重新指令预取的开销,但是最多只能有四条指令,使它的使用范围也很受限。可能也就是C语言中用到“:?”运算符的地方比较容易汇编为IT指令块了。还有个边很短小的if判断,能够被这么优化。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

499

帖子

0

粉丝