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