我如何从我的机器代码中屏蔽我不想要的位?
How do i mask the bits i dont want from my machinecode?
所以我有一个 txt 文件,我正在使用类似 02324020 的数字,这是 MIPS 指令的机器代码:add $t0, $s1, $s2
当它是二进制并分成 6,5,5,5,5,6 的部分时,取的数字是:0,17,18,8,0,20
这给出了指令的概念 R[rd] = R[rs]+R[rt] 并且从 26-31 的数字是操作码 0 表示 R 格式,rd=8,rs=17,rt =18
我试图屏蔽这些位,这样我只能看到 21-25 之间的位,然后收到它们的数字:0,17,18,8,0,20,因为向右移动:printf("\n%x\n", code >>26);
给我操作码 0 并告诉我它是 R 格式。
所以现在我试图找到 17,但我不知道在 & 0b
之后放置什么:
printf("\n%x\n", code >>21 & 0b____);
我真的可以用一个例子从我的号码 02324020 中找出剩余的号码
到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
unsigned int code = 0;
FILE *fp;
fp = fopen(argv[1], "r+");
int result = fscanf(fp, "%x", &code);
printf("\n hex-1: %08X, decimal-1: %d \n", code, code);
printf("\n%x\n", code >>26);
printf("\n%x\n", code >>21 & 0x0b00000011111); //what can i do to change this
while (result != EOF)
{
result = fscanf(fp, "%x", &code);
printf("\n read hex: %08X, decimal: %d \n", code, code);
if(feof(fp))
{
puts("EOF");
break;
}//if
}//while
}
要定义二进制数,您将使用 0b___
(正如您在回答中提到的),而不是 0x0b0___
。
要提取所需的数字,您必须进行位移 code
,以便您感兴趣的位位于最右端。然后 OR
只有你感兴趣的那些位。把这些放在一起,你有:
printf("\n%x\n", code >> 26);
printf("\n%x\n", code >> 21 & 0b11111);
printf("\n%x\n", code >> 16 & 0b11111);
printf("\n%x\n", code >> 11 & 0b11111);
printf("\n%x\n", code >> 6 & 0b11111);
printf("\n%x\n", code & 0b111111);
所以我有一个 txt 文件,我正在使用类似 02324020 的数字,这是 MIPS 指令的机器代码:add $t0, $s1, $s2
当它是二进制并分成 6,5,5,5,5,6 的部分时,取的数字是:0,17,18,8,0,20
这给出了指令的概念 R[rd] = R[rs]+R[rt] 并且从 26-31 的数字是操作码 0 表示 R 格式,rd=8,rs=17,rt =18
我试图屏蔽这些位,这样我只能看到 21-25 之间的位,然后收到它们的数字:0,17,18,8,0,20,因为向右移动:printf("\n%x\n", code >>26);
给我操作码 0 并告诉我它是 R 格式。
所以现在我试图找到 17,但我不知道在 & 0b
之后放置什么:
printf("\n%x\n", code >>21 & 0b____);
我真的可以用一个例子从我的号码 02324020 中找出剩余的号码
到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
unsigned int code = 0;
FILE *fp;
fp = fopen(argv[1], "r+");
int result = fscanf(fp, "%x", &code);
printf("\n hex-1: %08X, decimal-1: %d \n", code, code);
printf("\n%x\n", code >>26);
printf("\n%x\n", code >>21 & 0x0b00000011111); //what can i do to change this
while (result != EOF)
{
result = fscanf(fp, "%x", &code);
printf("\n read hex: %08X, decimal: %d \n", code, code);
if(feof(fp))
{
puts("EOF");
break;
}//if
}//while
}
要定义二进制数,您将使用 0b___
(正如您在回答中提到的),而不是 0x0b0___
。
要提取所需的数字,您必须进行位移 code
,以便您感兴趣的位位于最右端。然后 OR
只有你感兴趣的那些位。把这些放在一起,你有:
printf("\n%x\n", code >> 26);
printf("\n%x\n", code >> 21 & 0b11111);
printf("\n%x\n", code >> 16 & 0b11111);
printf("\n%x\n", code >> 11 & 0b11111);
printf("\n%x\n", code >> 6 & 0b11111);
printf("\n%x\n", code & 0b111111);