我如何从 C 中的 32 位序列的立即数部分获取值?
How I get the value from the Immediate part of a 32 Bit sequence in C?
我用 C 构建了一个虚拟机。为此我有指令
pushc <const>
我把命令和值保存在32位。前 8 位用于命令,其余 8 位用于值。
8 位 -> 操作码
24位->立即值
为此我制作了一个宏
#define PUSHC 1 //1 is for the command value in the Opcode
#define IMMEDIATE(x) ((x) & 0x00FFFFFF)
更新:
**#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i))**
然后我加载以在无符号整数数组中进行测试:
更新:
unsigned int code[] = { (PUSHC << 24 | IMMEDIATE(2)),
(PUSHC << 24 | SIGN_EXTEND(-2)),
...};
稍后在我的代码中,我想获取 pushc 命令的立即值并将该值推送到堆栈...
我从数组中获取每条指令 (IR) 并构建我的堆栈。
更新:
void exec(unsigned int IR){
unsigned int opcode = (IR >> 24) & 0xff;
unsigned int imm = (IR & 0xffffff);
switch(opcode){
case PUSHC: {
stack[sp] = imm;
sp = sp + 1;
break;
}
}
...
}
}
只需使用按位 AND
屏蔽掉低 24 位,然后在 case
:
中使用它
const uint8_t opcode = (IR >> 24) & 0xff;
const uint32_t imm = (IR & 0xffffff);
switch(opcode)
{
case PUSHC:
stack[sp] = imm;
break;
}
我围绕操作码的提取进行了调整,以使 case
更易于阅读。
我用 C 构建了一个虚拟机。为此我有指令
pushc <const>
我把命令和值保存在32位。前 8 位用于命令,其余 8 位用于值。
8 位 -> 操作码 24位->立即值
为此我制作了一个宏
#define PUSHC 1 //1 is for the command value in the Opcode
#define IMMEDIATE(x) ((x) & 0x00FFFFFF)
更新:
**#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i))**
然后我加载以在无符号整数数组中进行测试:
更新:
unsigned int code[] = { (PUSHC << 24 | IMMEDIATE(2)),
(PUSHC << 24 | SIGN_EXTEND(-2)),
...};
稍后在我的代码中,我想获取 pushc 命令的立即值并将该值推送到堆栈...
我从数组中获取每条指令 (IR) 并构建我的堆栈。
更新:
void exec(unsigned int IR){
unsigned int opcode = (IR >> 24) & 0xff;
unsigned int imm = (IR & 0xffffff);
switch(opcode){
case PUSHC: {
stack[sp] = imm;
sp = sp + 1;
break;
}
}
...
}
}
只需使用按位 AND
屏蔽掉低 24 位,然后在 case
:
const uint8_t opcode = (IR >> 24) & 0xff;
const uint32_t imm = (IR & 0xffffff);
switch(opcode)
{
case PUSHC:
stack[sp] = imm;
break;
}
我围绕操作码的提取进行了调整,以使 case
更易于阅读。