c - 如何修复 : OP-code isn't read out correctly

标签 c c89 opcode vm-implementation

我目前正在尝试编写一个 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/

相关文章:

assembly - 汇编中的二进制操作码

c - 计算得到随机结果

c - ANSI C 有(或使用)哪些最常见的扩展?

c - 为什么设置了 -std=c99 后 gcc 找不到 random() 接口(interface)?

c - C90 中的可变长度结构

php - 什么是 EXT_NOP 和 EXT_STMT,PHP Opcode

assembly - 为什么 objdump 显示此汇编语言指令的空操作码?

c - 如何在Windows中用C获取文件夹大小?

c - 用指针反转字符串?

php - 如何在函数内组织数据库连接的处理?