您的位置:首页 > 服装鞋帽 > 制服 > ARM 指令集(四):比较指令

ARM 指令集(四):比较指令

luyued 发布于 2011-01-31 08:42   浏览 N 次  
  • CMN
  • CMP
  • TEQ
  • TST

译注:CMP 和 CMP 是算术指令,TEQ 和 TST 是逻辑指令。把它们归入一类的原因是它们的 S 位总是设置的,就是说,它们总是影响标志位。

CMN : 比较取负的值

(Compare Negative)

  CMN{条件}{P} ,  status = op_1 - (- op_2) 

CMN 同于 CMP,但它允许你与小负值(操作数 2 的取负的值)进行比较,比如难于用其他方法实现的用于结束列表的 -1。这样与 -1 比较将使用:

  CMN R0, #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 模式中)。

TST : 测试位

(Test bits)

  TST{条件}{P} ,  Status = op_1 AND op_2 

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

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

==============================================

指令格式:

数据处理指令:

xxxx000a aaaSnnnn ddddcccc ctttmmmm 寄存器形式 xxxx001a aaaSnnnn ddddrrrr bbbbbbbb 立即数形式 

典型的汇编语法:

  MOV Rd, #0 ADDEQS Rd, Rn, Rm, ASL Rc ANDEQ Rd, Rn, Rm TEQP Pn, #&80000000 CMP Rn, Rm 

在操作 a 下,组合 Rn 的内容和 Op2,放置结果到 Rd 中。

如果使用寄存器形式,则 Op2 被设置为依据下面描述的 t 来移位的 Rm 的内容。如果使用立即数形式,则 Op2 = #b, ROR #2r。

 t 汇编器 解释 000 LSL #c 逻辑左移 001 LSL Rc 逻辑左移 010 LSR #c for c != 0 逻辑右移 LSR #32 for c = 0 011 LSR Rc 逻辑右移 100 ASR #c for c != 0 算术右移 ASR #32 for c = 0 101 ASR Rc 算术右移 110 ROR #c for c != 0 循环右移 RRX for c = 0 带扩展的循环右移一位 111 ROR Rc 循环右移 

在寄存器形式中,用位 8-11 表示 Rc;如果使用 Rc 则位 7 必须清除。(如果你编码为 1,你将得到一个乘法、SWP 或未分配的指令而不是一个数据处理指令。)

还有,只使用了 Rc 的底端字节 - 如果 Rc = 256, 则移位将是零。

“MOV[S] Ra,Rb,RLX” 可以通过 ADC[S] Ra,Rb,Rb 来完成,这里的 RLX 意思是带扩展的循环左移一位。

多数汇编器允许使用 ASL 作为 LSL 的同义词。因为对算术左移是什么有不同的意见,最好使用术语 LSL。

通过在 MOV、MVN 或逻辑指令中设置 S 位,(在寄存器或立即数形式中)把进位标志设置为最后移出的那一位。

如果不做移位,则不影响进位标志。

如果立即数有可选择的多个形式(例如,#1 可以表示为 1 ROR #0、4 ROR #2、16 ROR #4 或 64 ROR #6),则汇编器希望使用涉及零移位的那个形式,如果可获得的话。所以,如果 0 <= const <= 255,则 MOVS Rn,#const 将保持进位标志不受影响,否则将改变它。

aaaa 汇编器 意思 P-Code 0000 AND 逻辑与 Rd = Rn AND Op2 0001 EOR 逻辑异或 Rd = Rn EOR Op2 0010 SUB 减法 Rd = Rn - Op2 0011 RSB 反向减法 Rd = Op2 - Rn 0100 ADD 加法 Rd = Rn + Op2 0101 ADC 带进位的加法 Rd = Rn + Op2 + C 0110 SBC 带借位的减法 Rd = Rn - Op2 - (1-C) 0111 RSC 带借位的反向减法 Rd = Op2 - Rn - (1-C) 1000 TST 测试位 Rn AND Op2 1001 TEQ 测试等同 Rn EOR Op2 1010 CMP 比较 Rn - Op2 1011 CMN 比较取负 Rn + Op2 1100 ORR 逻辑或 Rd = Rn OR Op2 1101 MOV 传送值 Rd = Op2 1110 BIC 位清除 Rd = Rn AND NOT Op2 1111 MVN 传送取非 Rd = NOT Op2 

注意 MVN 和 CMN 不是象表面上的那种关系;MVN 使用直接的逐位(bitwise)非操作,把 Rn 设置为 Op2 对 1 的补码(反码)。CMN 把 Rn 与 Op2 对 2 的补码进行比较。

这些指令可归入 4 个子集:

MOV, MVN
Rn 被忽略,并且应当是 0000。如果设置了 S 位,则在结果上设置 N 和 Z 标志。并且如果使用了移位器,则 C 标志被设置为被移出的最后一位。不影响 V 标志。
CMN, CMP, TEQ, TST
Rd 不被指令所设置,并且应当是 0000。必须设置 S 位(多数汇编器会自动完成;如果没有设置它,则这个指令将是 MRS、MSR、或一个未分配的指令。)

算术操作(CMN, CMP)在结果上设置 N 和 Z 标志,从 ALU 得到 C 和 V 标志。

逻辑操作(TEQ, TST)在结果上设置 N 和 Z 标志,如果使用了移位器则从它得到 C 标志(在这种情况下它变成被移出的最后一位),不影响 V 标志。

有一个特殊情况(对于 ARMs >= 6,只针对 26 位模式),dddd 字段是 1111 导致用结果的相应的位设置标志(在用户模式下),或整个 26 位 PSR (在特权模式下)。这由给指令的 P 后缀来指示 - CMNP、 CMPP、TEQP、TSTP。常用 TEQP PC,#(新模式编号) 来改变模式。在 32 位模式,应当使用 MSR 来替代(因为 TEQP 等不再工作)。

ADC, ADD, RSB, RSC, SBC, SUB
如果设置了 S 位,则在结果上设置 N 和 Z 标志,从 ALU 的得到 C 和 V 标志。
AND, BIC, EOR, ORR
如果设置了 S 位,则在结果上设置 N 和 Z 标志,如果使用了移位器则从它得到 C 标志(在这种情况下它变成被移出的最后一位),不影响 V 标志。

可以使用 ADD 和 SUB 以与位置无关的方式使寄存器指向数据,例如 ADD R0,PC,#24。这很有用,一些汇编器有一个叫做 ADR 的特殊宏指令(directive),它自动生成恰当的 ADD 或 SUB 指令。(ADR R0, fred 典型的把 fred 的地址放置到 R0 中,假定 fred 在范围内)。

在 26-bit 模式下,在 R15 是使用的寄存器之一的时候发生一种特殊情况:
如果 Rn = R15 则使用的 R15 值屏蔽掉了所有 PSR 位。
如果 Op2 涉及 R15,则使用所有的 32 位。

在 32-bit 模式下,使用 R15 的所有的位。

在 26-bit 模式下,如果 Rd = R15 则:
如果未设置 S 位,则只设置 PC 的 24 位。
如果设置了 S 位,则覆写 PC 和 PSR 二者(除非在非用户模式下,否则不改变模式位、I 和 F 位。)

对于 32-bit 模式, 如果 Rd=15,则覆写 PC 的所有的位,不包括最低的那两个有效位,它们总是零。如果未设置 S 位,则只进行上面这些;如果设置了 S 位,把当前模式的 SPSR 复制到 CPSR 中。在 32-bit 用户模式下,你不应该执行把 PC 作为目的寄存器并设置了 S 位的指令,因为用户模式没有 SPSR。(顺便说一句,你这样做不会打断处理器 - 这样做的结果只是未定义而已,且在不同的处理器上可能不同。)

执行这些指令使用下列数目的周期: 1S + (1S 如果使用了寄存器控制的移位) + (1S + 1N 如果改变了 PC)

图文资讯
广告赞助商