什么时候设置零标志?

When is the zero flag set?

我正在为 8 月中旬的计算机工程考试做一些复习。一些练习是关于计算汇编程序中某些指令的工作寄存器和状态寄存器。我正在努力了解状态寄存器,尤其是零标志在本练习中的工作原理。练习是关于在这 11 条指令之后计算 WREG 的值。我在每一行都写了我的答案,但不知何故我没有得到正确的状态寄存器和零标志:

  1. CLRF WREG; WREG = 0x00
  2. BSF STATUS,C;进位标志=1
  3. BSF WREG,7; WREG = 0x80 (1000 0000) 第 7 位设置为 1。
  4. RLCF WREG; W = 0x01 和状态寄存器 0x​​03?
  5. BC MCARRY;我们将分支,因为C已设置。
  6. ADDLW 0x01; 因此跳过这一行。
  7. MCARRY DECF WREG; W = 0x00
  8. MOVLW OxFF; W = 0xFF,状态寄存器在这里不知何故是 7
  9. BZ MHALT; 从第 4 行开始设置 Z 位。
  10. INCF WREG; 因此我跳过了这一行

11.MHALT GOTO MHALT;

WREG = 0xFF 这是正确的答案,但我不明白第 4 行的状态寄存器发生了什么。它以某种方式与 WREG 一起旋转,并且值被放入状态寄存器。然后状态寄存器的值是 7(第 8 行),这让我很困惑。你们有没有一个很好的解释可以让我理解状态寄存器发生了什么,特别是在汇编程序中执行指令时零标志?

结束

不清楚您有什么问题。首先你提到第 4 行。正如你在那里正确评论的那样,WREG 的 MSB 是 1,它被旋转到 C。C 的原始值也是 1,被旋转到 WREG 的 LSB。因此 WREG=0x01,C=1 且 Z=0。第 7 行将设置 WREG=0x00、C=1 和 Z=1。 MOVW 不影响标志,因此第 9 行将使用第 7 行而不是第 4 行的值。

注意状态寄存器是0 0 0 N OV Z DC C

WREG = 0x80 C = 1

通过进位向左旋转。进位移入 WREG 的 LSBit,WREG 的 MSBit 移入进位:

WREG = 0x01 C = 1

当任何汇编程序操作(在我的例子中是 WREG)导致 WREG 的内容为 0 时,设置零标志。