我有一个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;
答案 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位。