我正在做一个个人项目来提高我对CPU工作原理的认识。所以我在做一个英特尔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);

我知道它应该把所有的位子向右移动一个位置,但我不知道怎么移动。
如果有人能给我举个例子,说明它一步步在做什么,我将不胜感激。
state->a是模拟名为
答。
uint8_t是RRC的十六进制值。
该示例由this页提供。

最佳答案

让我们按顺序研究这些步骤:
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->a是一个uint8_t
state->cc.cy = (1 == (x&1))state->cc.cy = x & 1;相同

09-04 09:02
查看更多