将 32 位指令拆分为字节并使用 c 将结果移动到另一个地址

split 32 bit instruction into bytes and move result to another address using c

我有一个 32 位指令,我希望将其分成四个字节。 假设指令如下所示:

yyyyyzzzzzzxxxxxx?????????

该指令是由四个无符号整数组成的字。 y代表操作码,???代表不用的space。我正在使用大端机器。

我希望将值从 z + w 移动到 a

我以前从未用过 C,但我尝试过这样做。

这是我读这个词的方式,这样我就可以打印出每个字节:

unsigned int a, b, c, o;
w = instruction << 24;
z = instruction << 16;
x = instruction << 8;
y = instruction;

我在这里打印无符号值,只是为了检查结果。

printf("%u\n", w);
printf("%u\n", z);
printf("%u\n", x);
printf("%u\n", y);
printf("\n");

regs[x] = instruction + instruction << 8;

如果我在这之后打印出 regs[x] 的值,那么我可以看到我现在有一个值,但这是正确的做法吗?当我这样做时,我是否设置寄存器 = z + w?

编辑 Mabye 我应该得到这样的位吗?

            y = (inst >> 24) & 077;
            x = (inst >> 16) & 0xffff;
            z = (inst >> 8) & 0xffff;
            w = (inst) & 0xffff;

然后这样做:

regs[y] = z + w;

如果您只想使用位位置和计数,您可以构建一个位掩码,即 9 位,并设置下一位并递减 (1<<10)-1。所以你的价值观是

#define MASK(n) ((1<<(n+1))-1)

unsigned int w = instruction & MASK(9);
unsigned int x = (instruction >> 9) & MASK(6);
unsigned int z = (instruction >> 15) & MASK(6);
unsigned int y = (instruction >> 21) & MASK(5);

所有值都向下移动。所以如果你想结合 z 和 w 你将不得不

unsigned int zw = z<<9 | w; 

因为w包含9位,或者

unsigned int wz = w<<6 | z; 

因为z包含6位。