1

我正在阅读有关 Intel 8080 emulation Emulator 101的指南,当我阅读代码以检查我写的内容时,我偶然发现了这个

case 0x36:      //MVI   M,byte
{                   
//AC set if lower nibble of h was zero prior to dec
uint16_t offset = (state->h<<8) | state->l;
state->memory[offset] = opcode[1];
state->pc++;
}
break;

从一本名为 Intel 8080/8085 Assembly Language Programming 的书中,我读到了 MVI 这个

该指令将存储在其第二个字节中的数据复制到由 H 和 L 寻址的内存位置。M 是对 H 和 L 寄存器对的符号引用。

所以我猜测偏移量是 H 和 L 寻址的内存位置,但我们为什么要这样做呢?那是(state->h<<8) | state->l

谢谢

4

1 回答 1

3

<< 和 | 的组合如何?给我们 16 位偏移量?

H8 位寄存器为例,其中 H 7是最高有效位,H 0是最低有效位:

H 7 H 6 H 5 H 4 H 3 H 2 H 1 H 0

L8 位寄存器为例,其中 L 7是最高有效位,L 0是最低有效位:

L 7 L 6 L 5 L 4 L 3 L 2 L 1 L 0

您现在想要构造由(最高 8 位)和(最低 8 位)组合产生的 16 位偏移量H。在C / C ++/Java 中,这可以通过左移 8 位后跟按位或如下:L<<|

H =   H 7 H 6 H 5 H 4 H 3 H 2 H 1 H 0 
H<<8 = H 7 H 6 H 5 H 4 H 3 H 2 H 1 H 0 0 0 0 0 0 0 0 0 
H<< 8|L = H 7 H 6 H 5 H 4 H 3 H 2 H 1 H 0 L 7                       L 6 L 5 L 4 L 3 L 2 L 1 L 0
于 2012-11-24T14:31:20.617 回答