对于学校我正在编写ARM模拟器。在ARM ARM(http://www.eecs.umich.edu/~prabal/teaching/eecs373-f11/readings/ARMv7-M_ARM.pdf)中,将分支偏移的第二和第三高位计算为I1 = NOT(J1 EOR S);
和I2 = NOT(J2 EOR S);
(ARM ARM第239页)。有谁知道为什么会这样?由于某些原因,它似乎导致我的错误。
答案 0 :(得分:2)
这有点令人费解,但它似乎是一种将I1和I2位映射到有效指令编码的技术。
Thumb分支指令被编码为一对16位子指令。每个16位子指令都需要自己独特的指令编码。
'S'位是符号位,因此我们可以看到无法区分编码T3和编码T4与第一个16位子指令。
在第二子指令中,比特12区分编码T3和T4。但是,直接使用I1和I2会与现有指令发生冲突,因此它们会被编入四种编码中的一种,每种编码都决定了分支的范围。