执行此按位运算以模拟 RRC 指令的目的是什么
What is doing this bitwise operation in order to emulate a RRC instruction
我正在做一个个人项目,以提高我对 CPU 工作原理的了解。所以我正在做一个 Intel 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);
我知道它应该将所有位向右移动 1 个位置,但我不知道如何操作。
如果有人可以向我提供一个实际逐步执行的示例,我将不胜感激。
state->a
是一个 uint8_t
模拟了名为 intel 8080 的寄存器
A.
0x0f
是 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;
我正在做一个个人项目,以提高我对 CPU 工作原理的了解。所以我正在做一个 Intel 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);
我知道它应该将所有位向右移动 1 个位置,但我不知道如何操作。
如果有人可以向我提供一个实际逐步执行的示例,我将不胜感激。
state->a
是一个uint8_t
模拟了名为 intel 8080 的寄存器 A.0x0f
是 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;