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));    
}
我无法理解这条线是如何工作的.
state->a = ((x & 1) << 7) | (x >> 1);
我知道它应该将所有位向右移动1个位置,但我无法弄清楚如何.
如果有人能够为我提供一步一步的实际操作示例,我将不胜感激.
state->a是一个uint8_t模拟名为A的intel 8080寄存器的模拟器.
0x0f 是RRC的HEX值.
这个例子已提供此页.
让我们按顺序研究这些步骤:
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;