【问题标题】:How to determine if carry out occuurs in C如何确定执行是否发生在C中
【发布时间】:2014-06-04 17:27:13
【问题描述】:

我正在编写一个 ARM11 仿真器,现在我正在尝试设置 CPRS 标志,它们是 N(负结果)、Z(零)、C(执行)和 V(溢出)

这是规范所说的:

逻辑运算(and、eor、orr、teq、tst 和 mov)中的 C 位将设置为从 任何移位操作(即桶形移位器的结果)。在算术运算中(加、减、rsb 和 cmp) C 位将被设置为 ALU 的第 31 位的进位。

我的问题是,我如何确定逻辑和算术运算的进位? 操作在两个 uint32_t 上工作,例如我的 eor 操作只是返回 x ^ y,然后我需要设置 CPRS 标志。

编辑: 此外,设置 C 如果加法产生进位,则为 1(无符号 ow),否则设置为 0。减法 (包括比较),如果减法产生借位,则将位 C 设置为 0,否则设置 到 1。

【问题讨论】:

  • 示例:确定是否在unsigned 添加c = a + b;Carryout = c < a; 时发生了执行操作
  • @chux 抱歉,应该提到,规范说溢出位保持不变,但是当它在添加后发生时 - 然后你只需设置执行位。剩下的我真的不知道该怎么做。

标签: arm flags bit-shift carryflag


【解决方案1】:

逻辑操作在这里有点牵强 - 显然eor r0, r1, r2 不会产生溢出或进位。然而,我们关心的并不是逻辑运算本身:

逻辑运算(and、eor、orr、teq、tst 和 mov)中的 C 位将设置为 任何移位操作的进位(即桶形移位器的结果)。

还记得 any 数据处理指令上的可选移位吗?给定eor r0, r1, r2 lsl #3,您关心的进位就是r2 lsl #3 生成的任何东西。但是,您正在为班次*实施标志设置,请执行此操作。

* 如果您也对此感到困惑,我在快速浏览相关问题时看到了很多好主意 -->

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多