我正在做一个个人项目来提高我对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;
相同