为了模拟RRC指令,这种按位操作是做什么的

时间:2017-09-27 20:37:42

标签: c bit-manipulation emulation intel-8080

我正在开展个人项目,以提高我对CPU运作方式的了解。所以我正在做一个8位微处理器的Intel 8080仿真器。

在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个位置,但我无法弄清楚如何。

如果有人能够为我提供一步一步的实例,我将不胜感激。

  • state->auint8_t,它模拟名为的intel 8080寄存器 甲

  • 0x0f是RRC的十六进制值。

  • 该示例由this页面提供。

1 个答案:

答案 0 :(得分:5)

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

  • 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;
  • 相同