【发布时间】:2019-02-19 02:47:40
【问题描述】:
我已经定义了一些值,见下文,但我无法正确使用它们。
#define add 000001
#define sub 000010
#define jmp 000111
#define IMM 10000
#define ADDR 10001
在我的代码中,我设置了一个十六进制地址。
parameter1 = false;
parameter1 = false;
uint64_t data = 0xffffffff05001e00;
uint16_t vector[4];
memcpy(vector, &data, sizeof(uint64_t));
int currentPosition = 0;
while (currentPosition < 4) {
header = vector[currentPosition];//header
opcode = header >> 0xA & 0x3F;
src1 = header >> 0x5 & 0x1F;
src2 = header & 0x1F;
if (src1 == ADDR || src1 == IMM) { parameter1 = true; }
if (src2 == ADDR || src2 == IMM) { parameter2 = true; }
....
currentPosition++;
}
header = 1e00 在这种情况下(因为它是 vector[0] )
转发它会做: 操作码=0x7,src1=0x10,src2=0x0。
这意味着二进制:000111 10000 00000 -> jmp IMM NULL
当第一个if被调用时,parameter1应该取值为true;但这从未发生过。为什么会这样? 我没有正确定义 IMM 值?
谢谢!!!
【问题讨论】:
-
你的常量都不是二进制的;
add、sub和jmp是八进制文字;IMM和ADDR是十进制文字。二进制000111是七,而jmp是七十三,二进制10000是十六,而IMM是一万。 -
将您的定义(尽管使用
constexpr更好)写成0b000001、0b000010等,这将强制它们是二进制的。 -
memcpy(vector, &data, sizeof(uint64_t));是个坏主意。您的代码将取决于我们计算机的字节序。