【问题标题】:LHLD doesn't assign a value to register HLLHLD 没有给寄存器 HL 赋值
【发布时间】:2023-02-25 04:59:30
【问题描述】:

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

TST8080.COM

电脑测试网

8080PRE.COM

8080EXM.COM

它们都相应地运行和执行,直到最后一个文件出错。 (LHLD 在TST8080.COM 中运行,似乎没有问题)。我只在最后一个文件中遇到过这个问题,nextWord 和 readWord 功能在以前的文件中大多很好。我试过测试和调试。这是代码和输出:

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】:

    根据您提供的信息,问题似乎出在 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 位值。

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

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多