LHLD没有给寄存器HL赋值

问题描述 投票:0回答:1

所以我正处于完成我的 Intel 8080 模拟器的阶段,遇到了 LHLD 助记符的问题。因此,每当我运行 Altair 克隆 CPU 测试文件 时,我都会遇到一个错误。所以我一次执行了一系列 4 个文件,它们是:

TST8080.COM 电脑测试网 8080PRE.COM 8080EXM.COM 它们都相应地运行和执行,直到最后一个文件出错。 (LHLD 在TST8080.COM 中运行,似乎没有问题)。我试过测试和调试。这是代码和输出:

LHLD函数中使用的函数:

void set_pair(i8080* const s, uint8_t pair, uint16_t value)
{
  uint8_t high = (value >> 8) & 0xFF;
  uint8_t low = value & 0xFF;
  switch(pair)
  {
    case 0:
      s->b = high;
      s->c = low;
      break;
    case 1:
      s->d = high;
      s->e = low;
      break;
    case 2:
      s->h = high;
      s->l = low;
      break;
    case 3:
      s->sp = (high << 8) | (low & 0xFF);
      break;
    default:
      printf("\nCouldn't set pair.\n");
      break;
  }

uint16_t readWord(i8080* const s, uint16_t addr)
{
    return (readByte(s, addr + 1) << 8 | readByte(s, addr));
}

uint16_t nextWord(i8080* const s)
{
    uint16_t word = readWord(s, s->pc);
    s->pc += 2;
    return word;
}

LHLD功能:

void lhld(i8080* const s, uint8_t opcode)
{
  set_pair(s, opcode & 0x7, readWord(s, nextWord(s)));
}

我在测试时注意到的问题是没有读取 nextWord 函数,使其成为 0.

我阅读并检查了 PC 值,在 LHLD 之前它是 = 0x0006 当调用 nextWord 时,它应该被读入内存,但是当它被读入内存时它变成了 0?

BEFORE LHLD: 0x0006 // Before LHLD operations

BEFORE VALUE: 0x0000 // Value inputted to set_pair


AFTER VALUE: 0x0000, 0x0000, 0x0000 // After low, high and value are set in set_pair


AFTER LHLD: 0x11F9 // PC value read into memory (In hex)

AFTER LHLD: 4601 // PC value read into memory (In decimal)

H: 0x0000, L: 0x0000 // Value of H and L registers after LHLD

相应地调用所有指令,其他一切正常。我还尝试使用调试器(尤其是 LLDB)解决问题,我检查了变量值及其对程序的影响;这是我在 LHLD 操作期间调用的变量得到的(JMP a16 也包含在这里,因为我认为它与错误有关,JMP 是文件执行期间调用的第一条指令,然后是 LHLD):

AF = 0002 BC = 0000 DE = 0000 HL = 0000 PC = 0100 SP = 0000 CYC = 0  (C3 13 01 00)
F = 2 SF = 0 ZF = 0 HF = 0 PF = 0 CF = 0
 - JMP, $

opcode='\xc3'

nextWord函数:

addr=257

opcode='\xc3'

跳跃功能:

addr=275

opcode='\xc3'

opcode='\xc3'

opcode='\xc3'

AF = 0002 BC = 0000 DE = 0000 HL = 0000 PC = 0113 SP = 0000 CYC = 10  (2A 06 00 F9)
F = 2 SF = 0 ZF = 0 HF = 0 PF = 0 CF = 0
 - LHLD, $

opcode='*'

opcode='*'

opcode='*'

在读取期间的 nextWord 函数之后:

addr=276

opcode='*'

readWord 再次被调用 =

addr=6

opcode='*'

opcode='*'

opcode='*'

opcode='*'

注意:我连续多次提到一个变量的原因是因为这是直到到达下一条指令(MVI C,d8)之前显示的变量值的序列。

提前谢谢你,我希望这是足够的信息。

c emulation 8-bit intel-8080
1个回答
0
投票

根据您提供的信息,问题似乎出在readWord函数的实现上。具体来说,该函数似乎没有正确检索构成存储在给定地址的 16 位值的两个字节。

以下是您可以尝试帮助识别和解决问题的一些方法:

  1. 检查 readWord 正在读取的地址处的内存值。您可以使用内存查看器或调试器来检查这些地址的内存内容,并确保它们符合您的预期。
  2. 验证 readByte 函数是否正常工作。您可以通过使用已知地址直接调用它并检查返回值来测试它。
  3. 检查系统的字节序是否与 Intel 8080 架构的字节序匹配。 LHLD 指令从内存中读取一个 16 位的值,该值由两个连续的字节组成。这些字节存储在内存中的顺序取决于系统的字节顺序。在小端系统中,低字节存储在低地址,高字节存储在高地址。在大端系统上,顺序是相反的。如果您的系统与 Intel 8080 的字节序不同,您可能需要调整 readWord 的实现来解决这个问题。
  4. 确保程序计数器(s->pc)在每条指令后正确递增。如果程序计数器没有正确增加,则在调用 readWord 时它可能指向错误的地址。
  5. 仔细检查传递给 set_pair 的值。特别是,确保 pair 参数在有效寄存器对 (0-3) 的范围内,并且 value 参数是从内存中读取的预期 16 位值。

我希望这可以帮助您识别和修复错误

© www.soinside.com 2019 - 2024. All rights reserved.