【问题标题】:How to fix: OP-code isn't read out correctly如何修复:操作码未正确读取
【发布时间】:2019-05-27 20:33:50
【问题描述】:

我目前正在尝试编写 Ninja VM,这是作为练习交给我的任务。操作码和值保存在 32 位无符号整数中,前 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?”,它似乎与我要问的问题有关,但是该问题中给出的答案正是我正在做的,有人知道更多吗?

【问题讨论】:

  • 此宏似乎正在从 24 位负值转换为 32 位。所以SIGN_EXTEND(-2) 没有按预期使用它

标签: c c89 opcode vm-implementation


【解决方案1】:

SIGN_EXTEND 看起来像是打算用于解码,从指令中提取 24 位并将它们转换为 32 位有符号整数。看起来它不打算用于编码。对于编码,IMMEDIATE(x) 似乎是为此而设计的。给定一个 32 位有符号整数,它会生成一个 24 位有符号整数,提供适合的值。

所以:

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

应该是:

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

【讨论】:

  • 谢谢,这确实解决了我的问题。我试图事先研究宏的工作方式,但似乎我还没有真正掌握它们。如果有人能解释当您在其中输入值时究竟会发生什么,我将不胜感激。 #define IMMEDIATE(x) ((x) &amp; 0x00FFFFFF) & #define SIGN_EXTEND(i) ((i) &amp; 0x00800000 ? (i) | 0xFF000000 : (i))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2016-03-06
  • 2015-07-29
  • 1970-01-01
  • 2021-06-22
  • 2012-07-03
  • 2022-12-18
相关资源
最近更新 更多