我目前正在尝试编写一个 Ninja VM,这是一项作为练习交给我的任务。 Opcode 和 value 保存在一个 32-Bit unsigned int 中,前 8 位是 opcode,其余的是 value。为了处理负值,我使用了练习中提供的宏
#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i))
然而,当试图检索操作码时
unsigned int i = (PUSHC << 24) | SIGN_EXTEND(-2);
(其中 PUSHC
等于 1
)
通过使用按位 AND
如这里所见 ->
int opcode = (i>>24)&0xff
我的结果是 255
,尽管此提取方法在值为正时有效,并在这些情况下重现正确的操作码。
在研究这个问题时,我发现了“How I get the value from the Immediate part of a 32 Bit sequence in C?”,它似乎处理了我要问的问题,但是那个问题中给出的答案正是我在做的,有人知道更多吗?
最佳答案
SIGN_EXTEND
看起来像是要用于解码,从指令中提取 24 位并将它们转换为 32 位有符号整数。看起来它不打算用于编码。对于编码,IMMEDIATE(x)
似乎就是为此而设计的。给定一个 32 位带符号整数,它会生成一个 24 位带符号整数,提供适合的值。
所以:
unsigned int i = (PUSHC << 24) | SIGN_EXTEND(-2);
应该是:
unsigned int i = (PUSHC << 24) | IMMEDIATE(-2);
关于c - 如何修复 : OP-code isn't read out correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56332176/