如何修复:OP 代码未正确读出
How to fix: OP-code isn't read out correctly
我目前正在尝试编写 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
,虽然这种提取方法在值为正时有效,并且在这些情况下重现正确的操作码。
在研究这个问题时,我发现了“”,它似乎处理了我要问的问题,但是那个问题中给出的答案正是我在做的,有人知道更多吗?
SIGN_EXTEND
看起来像是要用于解码,从指令中提取 24 位并将它们转换为 32 位带符号整数。看起来它不打算用于编码。对于编码,IMMEDIATE(x)
似乎是为此而设计的。给定一个 32 位有符号整数,它会生成一个 24 位有符号整数,提供适合的值。
所以:
unsigned int i = (PUSHC << 24) | SIGN_EXTEND(-2);
应该是:
unsigned int i = (PUSHC << 24) | IMMEDIATE(-2);
我目前正在尝试编写 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
,虽然这种提取方法在值为正时有效,并且在这些情况下重现正确的操作码。
在研究这个问题时,我发现了“
SIGN_EXTEND
看起来像是要用于解码,从指令中提取 24 位并将它们转换为 32 位带符号整数。看起来它不打算用于编码。对于编码,IMMEDIATE(x)
似乎是为此而设计的。给定一个 32 位有符号整数,它会生成一个 24 位有符号整数,提供适合的值。
所以:
unsigned int i = (PUSHC << 24) | SIGN_EXTEND(-2);
应该是:
unsigned int i = (PUSHC << 24) | IMMEDIATE(-2);