我正在编写一个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。
答案 0 :(得分:1)
这里的逻辑操作有点像红色鲱鱼 - 显然eor r0, r1, r2
不会产生溢出或携带。但是,我们关心的不是逻辑运算本身:
逻辑运算中的C位(和,eor,orr,teq,tst和mov)将被设置为从任何移位操作执行(来自桶形移位器的结果)。
还记得任何数据处理指令的可选移位吗?给定eor r0, r1, r2 lsl #3
,您关心的值是r2 lsl #3
生成的值。但是,您正在为shift *实现标志设置,请执行此操作。
*如果你也坚持下去,我在那里通过相关问题快速浏览了很多好主意 - >