微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM指令详解

ARM指令详解

时间:11-20 来源:互联网 点击:

CMNR0, #1; 把 R0 与 -1 进行比较
详情参照 CMP 指令。

 

CMP : 比较
(Compare)

CMP{条件}{P},

status = op_1 - op_2
CMP 允许把一个寄存器的内容如另一个寄存器的内容或立即值进行比较,更改状态标志来允许进行条件执行。它进行一次减法,但不存储结果,而是正确的更改标志。标志表示的是操作数 1 比操作数 2 如何(大小等)。如果操作数 1 大于操作操作数 2,则此后的有 GT 后缀的指令将可以执行。
明显的,你不需要显式的指定 S 后缀来更改状态标志... 如果你指定了它则被忽略。

 

TEQ : 测试等价
(Test Equivalence)

TEQ{条件}{P},

Status = op_1 EOR op_2
TEQ 类似于 TST。区别是这里的概念上的计算是 EOR 而不是 AND。这提供了一种查看两个操作数是否相同而又不影响进位标志(不象 CMP那样)的方法。加上 P 后缀的 TEQ 还可用于改变 R15 中的标志(在 26-bit 模式中)。详情请参照 psr.html,在 32-bit 模式下如何做请参见这里。

 

TST : 测试位
(Test bits)

TST{条件}{P},

Status = op_1 AND op_2
TST 类似于 CMP,不产生放置到目的寄存器中的结果。而是在给出的两个操作数上进行操作并把结果反映到状态标志上。使用 TST 来检查是否设置了特定的位。操作数 1 是要测试的数据字而操作数 2 是一个位掩码。经过测试后,如果匹配则设置 Zero 标志,否则清除它。象 CMP 那样,你不需要指定 S 后缀。

TSTR0, #%1; 测试在 R0 中是否设置了位 0。

分支指令
B : 分支
(Branch)
B{条件}<地址>
B 是最简单的分支。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。
注意存储在分支指令中的实际的值是相对当前的 R15 的值的一个偏移量;而不是一个绝对地址。
它的值由汇编器来计算,它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(+/- 32 M)。
在其他处理器上,你可能经常见到这样的指令:
OPT 1
LDA &70
CMP #0
BEQ Zero
STA &72
.Zero RTS
(取自 Acorn Electron User Guide issue 1 page 213)
在 ARM 处理器上,它们将变成下面这些东西:
OPT1
ADRR1, #&70
LDRR0, [R1]
CMP#0
BEQZero
STRR0, [R1, #2]
.Zero
MOVPC, R14
这不是一个很好的例子,但你可以构想如何更好的去条件执行而不是分支。另一方面,如果你有大段的代码或者你的代码使用状态标志,那么你可以使用条件执行来实现各类分支: 这样一个单一的简单条件执行指令可以替代在其他处理器中存在的所有这些分支和跳转指令。
OPT1
ADRR1, #&70
LDRR0, [R1]
CMPR0, #0
STRNER0, [R1, #2]
MOVPC, R14
BL : 带连接的分支

(Branch with Link)

BL{条件}<地址>

BL 是另一个分支指令。就在分支之前,在寄存器 14 中装载上 R15 的内容。你可以重新装载 R14 到 R15 中来返回到在这个分支之后的那个指令,

它是子例程的一个基本但强力的实现。它的作用在屏幕装载器 2 (例子 4)中得以很好的展现...

.load_new_format
BLswitch_screen_mode
BLget_screen_info
BLload_palette

.new_loop
MOVR1, R5
BLread_byte
CMPR0, #255
BLEQread_loop
STRBR0, [R2, #1]!

...在这里我们见到在装载器循环之前调用了三个子例程。接着,一旦满足了条件执行就在循环中调用了 read_byte 子例程。

条件执行

 


ARM 处理器的一个非常特殊的特征是它的条件执行。我们指的不是基本的如果进位则分支,ARM 使这个逻辑阶段进一步深化为如果进位则 XXX- 这里的 XXX 是任何东西。
为了举例,下面是 Intel 8086 处理器分支指令的一个列表:
JAJump if Above
JAEJump if Above or Equal
JBJump if Below
JBEJump if Below or Equal
JCJump if Carry
JCXZJump if CX Zero (CX is a register that can be used for loop counts)
JEJump if Equal
JGJump if Greater than
JGEJump if Greater than or Equal
JLJump if Less than
JLEJump if Less Than or Equal
JMPJuMP
JNAJump if Not Above
JNAEJump if Not Above or Equal
JNBJump if Not Below
JNBEJump if Not Below or Equal
JNCJump if No Carry
JNEJump if Not Equal
JNGJump if Not Greater than
JNGEJump if Not Greater than or Equal
JNLJump if Not Less than
JNLEJump if Not Less than or Equal
JNOJump if Not Overflow
JNPJump if Not Parity
JNSJump if Not Sign
JNZJump if Not Zero
JOJump if Overflow
JPJump if Parity
JPEJump if Parity Even
JPOJump if Parity Odd
JSJump if Sign
JZJump if Zero

80386 添加了:
JECXZ Jump if ECX Zero

作为对比,ARM 处理器只提供了:
B分支
BL带连接的分支

但 ARM 提供了条件执行,你可以不受这个表面上不灵活的方式的限制:
BEQBranch if EQual
BNEBranch if Not Equal
BVSBranch if oVerflow Set
BVCBranch if oVerflow Clear
BHIBranch if HIgher
BLSBranch if Lower or the Same
BPLBranch if PLus
BMIBranch if MInus
BCSBranch if Carry Set
BCCBranch if Carry Clear
BGEBranch if Greater than or Equal
BGTBranch if Greater Than
BLEBranch if Less than or Equal
BLTBranch if Less Than

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top