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

cri*_*riw 0 c bit-manipulation emulation intel-8080

我正在开展一个个人项目,以提高我对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));    
}
Run Code Online (Sandbox Code Playgroud)

我无法理解这条线是如何工作的.

state->a = ((x & 1) << 7) | (x >> 1);
Run Code Online (Sandbox Code Playgroud)

我知道它应该将所有位向右移动1个位置,但我无法弄清楚如何.

如果有人能够为我提供一步一步的实际操作示例,我将不胜感激.


  • state->a是一个uint8_t模拟名为A的intel 8080寄存器的模拟器.

  • 0x0f 是RRC的HEX值.

  • 这个例子已提供页.

chq*_*lie 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参考卡将其描述为Rotate Accumulator Right thru Carry.

请注意,步骤可以简化:

  • state->a = ((x & 1) << 7) | (x >> 1);state->a = (x << 7) | (x >> 1);因为state->a是一个uint8_t.
  • state->cc.cy = (1 == (x&1)) 是相同的 state->cc.cy = x & 1;