执行此按位运算以模拟 RRC 指令的目的是什么

What is doing this bitwise operation in order to emulate a RRC instruction

我正在做一个个人项目,以提高我对 CPU 工作原理的了解。所以我正在做一个 Intel 8080 仿真器,它是一个 8 位微处理器。

在执行一条RRC指令时,example是这样的:

case 0x0f: {    
  uint8_t x = state->a;    
  state->a = ((x & 1) << 7) | (x >> 1);    
  state->cc.cy = (1 == (x&1));    
}

我不明白这条线是怎么工作的。

state->a = ((x & 1) << 7) | (x >> 1);

我知道它应该将所有位向右移动 1 个位置,但我不知道如何操作。

如果有人可以向我提供一个实际逐步执行的示例,我将不胜感激。


让我们按顺序研究这些步骤:

  • uint8_t x = state->a;A寄存器的当前值使用一个临时变量;
  • (x & 1) << 7将低位移到高位; (x & 1) 是低阶位的值,因为 x 的所有其他位都被屏蔽掉了。
  • (x >> 1) 将其他位向右移动一位(向低位移动)。
  • state->a = ((x & 1) << 7) | (x >> 1); 组合前两步的位并存储为 A 寄存器的新值;
  • state->cc.cy = (1 == (x&1)); 将原始值的低位存储到进位位(这是被循环到高位的位)。

这些步骤的效果是 8 位向右旋转一步,低位进入进位标志。 8080 reference card 将此描述为 Rotate Accumulator Right thru Carry

注意可以简化步骤:

  • state->a = ((x & 1) << 7) | (x >> 1);state->a = (x << 7) | (x >> 1); 相同,因为 state->auint8_t.
  • state->cc.cy = (1 == (x&1)) 等同于 state->cc.cy = x & 1;