将 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位。
我有一个 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位。