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)
- 05-09· 2010-12-25
- 04-29· 中国人寿重夺半壁江山
- 04-29· 只有走到屏风中的人才会
- 04-29· 由罗景到江西 吉安 吉水
- 04-29· 关于2010年各项工作进展情
- 04-27· 三帅+胡夏=好兄弟
- 04-26· 女人,天才
- 04-26· 卡蜜儿.克劳戴 和她的情
- 04-26· 羅丹與卡蜜兒
- 04-21· [转]荷之韵
- 04-19· 090411班第四届团风采演职
- 04-19· [原创]android之旅-rom定制
- 04-19· 2011-3-24 99days
- 04-19· 经济常识第六课基础知识
- 04-19· 胡夏和“三帅”参加天下
- 04-19· 三帅 李炜、武艺、陈翔
- 04-19· 苦练合声不同调 三帅动怒
- 04-19· 断桥铝门窗 北京石景山阜
- 04-18· 罗丹和他的情人
- 04-17· 有座房子 面朝大海!-- 转