什么是按位操作以模拟RRC指令
我正在开展个人项目,以提高我对CPU工作方式的了解。所以我正在做一个Intel 8080模拟器,它是一个8位微处理器。什么是按位操作以模拟RRC指令
在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
其仿效命名 A.0x0f
为RRC十六进制值的英特尔8080寄存器。这个例子已经由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;
OP的问题在于第二个问题。它错过了“屏蔽掉最右边的一切”。顺便说一句,我不明白为什么它使用8位变量时完成... –
感谢您的解释!实际上,这是我不明白的第二点,链接将帮助我在将来的指示 – criw
有趣 - OP引用的http://www.emulator101.com站点同时具有RRC和RAR。 RAR代码将进位位复制到MSB而不是MSB。我想知道为什么RRC代码调整了进位位,但是如果LSB被复制到进位位则更清楚。 –
你是如何“知道它应该将所有的位1个职位的权利”? – EOF
'(x >> 1)' - 移动所有东西。'((x&1)
'x >> 1'将'x'中的(无符号)数量向右移一位,在最高有效位上留下一个零。 '(x&1)