如何确定是否在C中进行

时间:2014-06-04 17:27:13

标签: arm flags bit-shift carryflag

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

这是规范所说的:

  

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

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

编辑: 另外,设置了C. 如果加法产生一个进位(未签名的,则为1) ow),否则设置为0。用于减法 (包括比较),如果减法产生借位,则位C设置为0,否则设置 到1。

1 个答案:

答案 0 :(得分:1)

这里的逻辑操作有点像红色鲱鱼 - 显然eor r0, r1, r2不会产生溢出或携带。但是,我们关心的不是逻辑运算本身:

  

逻辑运算中的C位(和,eor,orr,teq,tst和mov)将被设置为从任何移位操作执行(来自桶形移位器的结果)。

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

*如果你也坚持下去,我在那里通过相关问题快速浏览了很多好主意 - >