0

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

在 RRC 指令的实现中,这个例子是这样的:

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->a是一个uint8_t模拟名为 A 的 intel 8080 寄存器。

  • 0x0f是 RRC 的 HEX 值。

  • 该示例已由此页面提供。

4

1 回答 1

5

让我们按顺序研究步骤:

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

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

请注意,可以简化步骤:

  • state->a = ((x & 1) << 7) | (x >> 1);state->a = (x << 7) | (x >> 1);与because state->ais a相同uint8_t
  • state->cc.cy = (1 == (x&1))是相同的state->cc.cy = x & 1;
于 2017-09-27T20:52:36.153 回答