【发布时间】:2019-12-21 14:36:45
【问题描述】:
我正在为 Z80 处理器构建一个非常基本的反汇编程序。我的程序首先从二进制文件中读取 8 位指令,并将它们存储在向量 bytes 中。该向量被传递给函数disassemble(vector<int>& bytes),该函数遍历bytes 向量并将每个字节解析为其(它们的)对应指令。每条指令都添加到向量assembly。
void disassemble(std::vector<int>& bytes)
{
std::vector<char*> assembly;
char instruction[20];
int xx, yy;
for (auto it = bytes.begin(); it != bytes.end(); ++it) {
switch (*it)
{
case 0x00: // nop
assembly.push_back("nop");
break;
case 0x01: // ld bc, $xxyy
yy = *(++it);
xx = *(++it);
sprintf_s(instruction, "ld bc, $%02X%02X",xx,yy);
assembly.push_back(instruction);
break;
default:
assembly.push_back("Instruction not implemented.");
break;
}
}
std::cout << "instructions: " << assembly.size() << std::endl;
for (int i = 0; i < assembly.size(); i++)
{
std::cout << assembly.at(i) << std::endl;
}
}
到目前为止,我已经实现了两条指令:
- 0x00: 没有
- 0x01: ld bc, $xxyy(其中yy和xx分别代表接下来的两个字节)
例如,下面的二进制代码:
00 01 0D C9 00 00 01 D5 C5 01 05 5C 00 00
应该反汇编到(我添加的cmets):
nop ; 00
ld bc, $C90D; 01 0D C9
nop ; 00
nop ; 00
ld bc, $C5D5 ; 01 D5 C5
ld bc, $5C05 ; 01 05 5C
nop ; 00
nop ; 00
实际输出:
instructions: 8
nop
ld bc, $5C05
nop
nop
ld bc, $5C05
ld bc, $5C05
nop
nop
如你所见,当代码完成后,所有的 0x01 指令都被解析为ld bc, $5C05。在调试过程中,我观察到assembly 向量填充,并且ld bc, $C90D 被正确解释。但是,当解析下一条 ld 指令时,前一条会更新为ld bc, $C5D5。解析最后的 ld 指令时也会发生同样的情况。
我猜这与将 xx 和 yy 分配给迭代器有关,该迭代器会随着每个新的 ld 指令不断更新。如何在不更新assembly 的元素的情况下增加迭代器?我想坚持使用迭代器而不是使用for(int i=0; i<bytes.size(); i++),因为我以前从未使用过它们并且喜欢学习新事物。但如果这是必须做的,那就这样吧。谢谢!
【问题讨论】:
标签: c++ pointers vector iterator