バックストーリー: 私は、簡略化されたアセンブリのようなテキストを取り、それを 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 未満であるため、文書化されていないシフト動作の問題ではありません。
誰かが正しい方向にナッジを提供できれば、私は感謝しています. 私はアイデアが不足しています。