【问题标题】:ARM carry flag on EOR/XOR and ANDARM 在 EOR/XOR 和 AND 上携带标志
【发布时间】:2009-07-29 10:48:21
【问题描述】:

我正在查找一些 ARM 程序集,我注意到 EOR/XOR 和 AND 都设置了 C 和 O 标志。这是如何运作的?他们总是被清除吗?他们设置了什么条件?

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

    如果您决定继续使用 ARM 汇编程序,您需要一份 ARM ARM 副本,即 ARM 架构参考手册。有许多版本,每个版本都有自己的“功能”。我建议尽可能多地收集,但那是另一个故事。有多种方法可以免费获得电子版。无论哪种方式:

    与 您需要设置 S 位,这对于 ARM 意味着使用 ANDS 而不是 AND。对于 thumb 模式,您始终使用 ANDS,但例如 gas 拒绝在 thumb 模式下接受 ANDS(但总是将其分解为 ands)。

    If S==1 and Rd == R15 then 
      CPSR=SPSR
    else if S==1
      N Flag = Rd[31]
      Z Flag = if Rd == 0 then 1 else 0
      C Flag = shifter_carry_out
      V flag = unaffected
    

    当涉及到标志时,EOR 与 AND 相同

    【讨论】:

    • 哇,这看起来很难看,我没有正确格式化它。无论如何,谷歌搜索没有引号的“手臂手臂”,第一次点击是直接来自 arm.com 的手臂手臂的第一版
    • 我为你修正了格式。选择文本并点击二进制查找按钮。
    【解决方案2】:

    我不相信普通的 AND/EOR 根本不会设置进位和溢出标志。 ANDS 和 EORS 变体(AND/EOR with set)可以设置进位,但前提是右侧是移位操作数。这些都不会影响溢出标志。

    例如,

    ANDS R0,R1,R2, LSR #1
    

    将根据 R2 的 b0 设置进位。如果该位为 1(即 R2 为奇数),则设置进位。

    请参阅here 了解详细信息(第 3 章,指令集)。

    【讨论】:

      【解决方案3】:

      正如其他张贴者所指出的,C 标志根据在操作之前可选地应用于源寄存器之一的移位进行更新。

      V(溢出)标志不受这些指令的影响。

      如果结果正好为零,则设置 Z 标志,如果将结果视为一个二进制补码整数(即高位为一),则设置 N 标志。

      【讨论】:

        【解决方案4】:

        回想一下,您可以在运算后任意移动结果。进位标志基于桶形移位器的进位设置。溢出标志永远不会受到影响。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-13
          相关资源
          最近更新 更多