如何解决:OP代码未正确读出

时间:2019-05-27 20:33:51

标签: c c89 opcode vm-implementation

我目前正在尝试编写Ninja VM,该任务是作为练习提供给我的。操作码和值保存在32位无符号int中,前8位为操作码,其余为值。为了处理负值,我在练习中使用了一个赋予我的宏

#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?”似乎与我要问的内容有关,但是该问题给出的答案正是我在做什么,任何人都知道吗?

1 个答案:

答案 0 :(得分:1)

SIGN_EXTEND似乎打算用于解码,以提取从指令中提取的24位并将其转换为32位带符号整数。似乎不打算在编码中使用它。对于编码,IMMEDIATE(x)似乎是为此目的而设计的。给定一个32位带符号整数,它将产生一个24位带符号整数,并提供合适的值。

所以:

unsigned int i = (PUSHC << 24) | SIGN_EXTEND(-2);

应为:

unsigned int i = (PUSHC << 24) | IMMEDIATE(-2);
相关问题