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。阅读完整的源代码后,您将再次检查数据,并修复未解决的问题。
然后,将其交给虚拟机,或发出最终指令。