我正在开展个人项目,以提高我对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->a
是uint8_t
,它模拟名为的intel 8080寄存器
甲
0x0f
是RRC的十六进制值。
该示例由this页面提供。
答案 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->a
是uint8_t
。state->cc.cy = (1 == (x&1))
与state->cc.cy = x & 1;