0

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

这就是规范所说的:

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

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

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

4

1 回答 1

1

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

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

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

* 如果你也坚持这一点,我在快速浏览相关问题时看到了很多好主意 -->

于 2014-06-04T21:16:18.317 回答