您的位置 首页 知识

arm条件履行

条件执行指令格式ARM处理器的一个非常特殊的特征是它的条件执行。我们指的不是基本的如果进位则分支,ARM使这个逻辑阶段进一步深化为如

条件履行

指令格局
ARM 处理器的一个十分特别的特征是它的条件履行。咱们指的不是根本的假如进位则分支,ARM 使这个逻辑阶段进一步深化为假如进位则 XXX – 这儿的 XXX 是任何东西。
为了举例,下面是 Intel 8086 处理器分支指令的一个列表:
JA Jump if Above
JAE Jump if Above or Equal
JB Jump if Below
JBE Jump if Below or Equal
JC Jump if Carry
JCXZ Jump if CX Zero (CX is a register that can be used for loop counts)
JE Jump if Equal
JG Jump if Greater than
JGE Jump if Greater than or Equal
JL Jump if Less than
JLE Jump if Less Than or Equal
JMP JuMP
JNA Jump if Not Above
JNAE Jump if Not Above or Equal
JNB Jump if Not Below
JNBE Jump if Not Below or Equal
JNC Jump if No Carry
JNE Jump if Not Equal
JNG Jump if Not Greater than
JNGE Jump if Not Greater than or Equal
JNL Jump if Not Less than
JNLE Jump if Not Less than or Equal
JNO Jump if Not Overflow
JNP Jump if Not Parity
JNS Jump if Not Sign
JNZ Jump if Not Zero
JO Jump if Overflow
JP Jump if Parity
JPE Jump if Parity Even
JPO Jump if Parity Odd
JS Jump if Sign
JZ Jump if Zero
80386 添加了:
JECXZ Jump if ECX Zero
作为比照,ARM 处理器只供给了:
B 分支
BL 带衔接的分支
但 ARM 供给了条件履行,你能够不受这个表面上不灵敏的方法的约束:
BEQ Branch if EQual
BNE Branch if Not Equal
BVS Branch if oVerflow Set
BVC Branch if oVerflow Clear
BHI Branch if HIgher
BLS Branch if Lower or the Same
BPL Branch if PLus
BMI Branch if MInus
BCS Branch if Carry Set
BCC Branch if Carry Clear
BGE Branch if Greater than or Equal
BGT Branch if Greater Than
BLE Branch if Less than or Equal
BLT Branch if Less Than
BLEQ Branch with Link if EQual
….
BLLT Branch with Link if Less Than
还有两个代码,
AL – ALways,缺省条件所以不须指定
NV – NeVer,不是十分有用。你无论如何不要运用这个代码…
当你发现一切 Bxx 指令实际上是同一个指令的时分,紧要关头就到了。接着你会想,假如你能够在一个分支指令上加上一切这些条件,那么对一个寄存器装载指令能否加上它们? 答案是能够。
下面是可获得的条件代码的列表:
EQ : 等于
假如一次比较之后设置了 Z 标志。
NE : 不等于
假如一次比较之后铲除了 Z 标志。
VS : 溢出设置
假如在一次算术操作之后设置了 V 标志,核算的成果不适合放入一个 32bit 方针寄存器中。
VC : 溢出铲除
假如铲除了 V 标志,与 VS 相反。
HI : 高于(无符号)
假如一次比较之后设置了 C 标志并铲除了 Z 标志。
LS : 低于或同于(无符号)
假如一次比较操作之后铲除了 C 标志或设置了 Z 标志。
PL : 正号
假如一次算术操作之后铲除了 N。出于界说‘正号’的意图,零是正数的原因是它不是负数…
MI : 负号
假如一次算术操作之后设置了 N 标志。
CS : 进位设置
假如一次算术操作或移位操作之后设置了 C 标志,操作的成果不能表明为 32bit。你能够把 C 标志当作成果的第 33 位。
CC : 进位铲除
与 CS 相反。
GE : 大于或等于(有符号)
假如一次比较之后…
设置了 N 标志并设置了 V 标志
或许…
铲除了 N 标志并铲除了 V 标志。
GT : 大于(有符号)
假如一次比较之后…
设置了 N 标志并设置了 V 标志
或许…
铲除了 N 标志并铲除了 V 标志
而且…
铲除了 Z 标志。
LE : 小于或等于(有符号)
假如一次比较之后…
设置了 N 标志并铲除了 V 标志
或许…
铲除了 N 标志并设置了 V 标志
而且…
设置了 Z 标志。
LT : 小于(有符号)
假如一次比较之后…
设置了 N 标志并铲除了 V 标志。
或许…
铲除了 N 标志并设置了 V 标志。
AL : 总是
缺省条件,所以不必显着声明。
NV : 从不
不是特别有用,它表明应当永久不履行这个指令。是贫民的 NOP。
包括 NV 是为了完整性(与 AL 相对),你不应该在你的代码中运用它。
有一个在最终的条件代码 S,它以相反的方法作业。当用于一个指令的时分,导致更改状况标志。这不是主动产生的 – 除非这些指令的意图是设置状况。例如:
ADD R0, R0, R1
ADDS R0, R0, R1
ADDEQS R0, R0, R1
第一个比如是一个根本的加法(把 R1 的值添加到 R0),它不影响状况寄存器。
第二个比如是同一个加法,只不过它导致更改状况寄存器。
最终一个比如是同一个加法,更改状况寄存器。不同在于它是一个有条件的指令。只要前一个操作的成果是 EQ (假如设置了 Z 标志)的时分它才履行。
下面是条件履行的一个作业中的比如。你把寄存器 0 与存储在寄存器 10 中内容相比较。假如不等于 R10,则调用一个软件中止,添加它并分支回来再次做这些。不然铲除 R10 并回来到调用它的那部分代码(它的地址存储在 R14)。
\ 条件履行的一个比如
.loop ; 符号循环开端方位
CMP R0, R10 ; 把 R0 与 R10 相比较
SWINE &40017 ; 不等于: 调用 SWI &40017
ADDNE R0, R0, #1 ; 向 R0 加 1
BNE loop ; 分支到 loop
MOV R10, #0 ; 等于 : 设置 R10 为零
LDMFD R13!, {R0-R12,PC} ; 回来到调用者
注解:
SWI 编号就象我写的这样。在 RISC OS 下,它是给 Econet_DoImmediate 的编号。不要字面的承受它,这仅仅一个比如!
你或许曾经没见过 LDMFD,它从栈中装载多个寄存器。在这个比如中,咱们从一个彻底正式的栈中装载 R0 至 R12 和 R14。关于寄存器装载和存储的更多信息请参阅 str.html。
我说要装载 R14。那么为什么要把它放入 PC 中? 原因是此刻 R14 存储的值包括回来地址。咱们也能够选用:
LDMFD R13!, {R0-R12,R14}
MOV PC, R14
可是直接康复到 PC 中能够省掉这个 MOV 句子。
最终,这些寄存器很有或许被一个 SWI 调用所占用(依赖于在调用期间履行的代码),所以你最好把你的重要的寄存器压入栈中,今后在康复它们。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/262890.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部