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

时间:2017-04-11 07:52:58

标签: c instructions

我有一个32位指令,我想分成四个字节。 假设指令看起来像这样:

yyyyyzzzzzzxxxxxx?????????

该指令是由四个无符号整数组成的单词。 y表示操作代码,???表示未使用的空间。我正在研究一台大端机器。

我希望将值从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]的值,那么我现在可以看到我有一个值,但这是正确的方法吗?当我这样做时,我是否设置了register = z + w

EDIT Mabye我应该得到这样的位?

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

然后这样做:

regs[y] = z + w;

1 个答案:

答案 0 :(得分:0)

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

#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位。