背景故事:我正在开发一个玩具编译器,它采用一些简化的类似汇编的文本并将其转换为 32 位指令。
转换为 32 位指令工作正常,但是当我尝试输出结果时,我遇到了一些问题。具体来说,我为提取各个部分而编写的宏似乎以我无法解释的方式破坏了值。
以下循环是我遇到问题的地方(位操作存储在宏中,但我将它们扩展为更简单的调试):
while(pc < num_insts)
{
printf("full: %x | op: %x | rs: %x | rt: %x | rd: %x | imm: %x\n",
inst_mem[pc],
((inst_mem[pc] >> 26) & 0x0000003F),
((inst_mem[pc] >> 21) & 0x0000003F),
((inst_mem[pc] >> 16) & 0x0000003F),
((inst_mem[pc] >> 11) & 0x0000F800),
(inst_mem[pc++] & 0x0000FFFF));
}
打印出以下内容:
full: 20450008 | op: 8 | rs: 2 | rt: 5 | rd: 0 | imm: 10
full: 0 | op: 0 | rs: 0 | rt: 0 | rd: 0 | imm: 8
这些行的正确值是:
full: 20450008 | op: 8 | rs: 1 | rt: 4 | rd: 0 | imm: 16
full: 20240010 | op: 8 | rs: 2 | rt: 5 | rd: 0 | imm: 8
如果我用更简单的替换它
while(pc < num_insts)
{
printf("full: %x", inst_mem[pc++]);
}
然后按照我的预期输出每个完整地址。这对我来说意味着解析一切正常,并且我的宏在解析和提取不应该的东西后将值从地址中提取出来。我只是不确定那会是什么。
由于inst_mem[]
包含int32_t
值并且所有班次都小于 32,因此它不应该是未记录的班次行为的问题。
如果有人能在正确的方向上提供帮助,我将不胜感激。我的想法不多了。