2017-09-27 120 views
0

我正在开展个人项目,以提高我对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->auint8_t其仿效命名 A.

  • 0x0f为RRC十六进制值的英特尔8080寄存器。

  • 这个例子已经由this提供。

+0

你是如何“知道它应该将所有的位1个职位的权利”? – EOF

+2

'(x >> 1)' - 移动所有东西。'((x&1)<< 7)'将最右边的位移到最左边的位置。循环移位8位。 –

+2

'x >> 1'将'x'中的(无符号)数量向右移一位,在最高有效位上留下一个零。 '(x&1)<< 7)'将最低有效位移动到最高有效位(在较低有效位中留下零)。两者的“|”组合已经实现了RRC。 –

回答

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->auint8_t
  • state->cc.cy = (1 == (x&1))相同state->cc.cy = x & 1;
+0

OP的问题在于第二个问题。它错过了“屏蔽掉最右边的一切”。顺便说一句,我不明白为什么它使用8位变量时完成... –

+0

感谢您的解释!实际上,这是我不明白的第二点,链接将帮助我在将来的指示 – criw

+0

有趣 - OP引用的http://www.emulator101.com站点同时具有RRC和RAR。 RAR代码将进位位复制到MSB而不是MSB。我想知道为什么RRC代码调整了进位位,但是如果LSB被复制到进位位则更清楚。 –