【问题标题】:How to handle forward referencing when Label size is not fixed标签大小不固定时如何处理前向引用
【发布时间】:2021-02-23 01:05:38
【问题描述】:

我正在尝试用 C++ 编写 8086 模拟器。 但是我遇到了一个问题。

假设代码是:

MOV AL, BL
JMP X
MOV BL, CL
MOV DL, CL
.
.
.
X:
ADD AX, BX
HLT

现在 JMP X 的机器码将依赖于 X,无论是 near location or short location

近: 8位地址[00-ff]

短: 16位地址(ff-ffff]

因此,如果 JMP 指令的大小过去是恒定的(固定大小),那么我可以进一步移动,只要找到 X,我就可以将它的地址放回去。 但是这里我不能再进一步了,因为下一个位置也取决于 JMP X 并且其大小不固定。

我不知道如何处理它。

【问题讨论】:

  • 你在模拟汇编语言?
  • 对于一个非常简单的解决方案,您始终可以发出近跳,除非用户指定“短”关键字覆盖。您还可以在跳跃之前检测与目标的跳跃并自动缩短这些跳跃。

标签: c++ assembly x86 emu8086


【解决方案1】:

jmp 可能会遇到更多问题。请参阅以下可能的操作码及其含义:

EB cb   JMP rel8        Jump short, relative, displacement relative to next instruction.
E9 cw   JMP rel16       Jump near, relative, displacement relative to next instruction.
E9 cd   JMP rel32       Jump near, relative, displacement relative to next instruction.
FF /4   JMP r/m16       Jump near, absolute indirect, address given in r/m16.
FF /4   JMP r/m32       Jump near, absolute indirect, address given in r/m32.
EA cd   JMP ptr16:16    Jump far, absolute, address given in operand.
EA cp   JMP ptr16:32    Jump far, absolute, address given in operand.
FF /5   JMP m16:16      Jump far, absolute indirect, address given in m16:16.
FF /5   JMP m16:32      Jump far, absolute indirect, address given in m16:32.

所以,你需要考虑更多的特殊情况。

解决方案是实现一个多通道汇编器。无论如何,您都需要将所有操作码和操作数存储在 std::vector 或任何地方。然后就可以在第二步设置正确的数据了。

如果您为操作码和操作数定义struct 并将所有这些结构存储在std::vector 中,它不会对其他操作码/操作数产生影响。你也可以运行多次,直到一切都正确。

然后,当一切都解决后,您可以再次查看std::vector 并发出真正需要的数据。

你可能想出:

struct Operation {
    bool updateNeeded{false};
    unsigned int opcode{};
    unsigned long operand1{};
    unsigned long operand2{};
    unsigned long operand3{};
    size_t indexOfRelated{};
};

std::vector<Operation> operation;

当然你可以根据需要添加更多属性。

然后您可以读取源数据并填写std::vector。阅读完整的源代码后,您将再次检查数据,并修复未解决的问题。

然后,将其交给虚拟机,或发出最终指令。

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 2019-07-20
    • 2019-05-05
    • 2021-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多