C 右移不能正常工作
C Rightshift not working correctly
我正在尝试用 C 实现 LC3 模拟器,但在解析指令代码时我 运行 遇到了麻烦。我有一个方法 get_bits() 应该获取指定短整型(定义为 'Word')的位。
Word get_bits(Word val, Word leftBit, Word rightBit){
printf("\nWord: %x, LeftBit: %d, RightBit: %d\n", val,leftBit,rightBit);
Word leftPad = 15 - leftBit;
Word rightPad = leftPad + rightBit;
printf("LeftPad: %d RightPad: %d\n", leftPad,rightPad);
printf("Val : "); printBinary(val); printf("\n");
Word temp = val << leftPad;
printf("Temp L: "); printBinary(temp); printf("\n");
temp = val >> rightPad;
printf("Temp R: "); printBinary(temp); printf("\n");
//build mask
Word mask = 0x0;
switch(leftBit - rightBit){
case 3:
mask = 0x000F;
break;
case 2:
mask = 0x0007;
break;
default:
printf("Case Not Covered!");
break;
}
printf("Mask: "); printBinary(mask); printf("\n");
temp = temp & mask;
return temp;
}
对于给定的指令 1221,ASM 应该是 ADD R1, R0, 1
但是,get_bits() 函数在第二次解析时失败。
它正确解析了 "ADD" 部分,即前四位,但是在尝试解析 R1 部分时,它右移了太多次,我不明白为什么。输出:
@ 4096 (1000) Value: 4641 1221 ASM:
前 4 位 = "ADD",工作正常
Word: 1221, LeftBit: 15, RightBit: 12
LeftPad: 0 RightPad: 12
Val : 0001001000100001
Temp L: 0001001000100001
Temp R: 0000000000000001
Mask: 0000000000001111
ADD
应该得到位 11 - 9,这 3 位构成寄存器 1(“001”),但被移到 0
Word: 1221, LeftBit: 11, RightBit: 9
LeftPad: 4 RightPad: 13
Val : 0001001000100001
Temp L: 0010001000010000
Temp R: 0000000000000000
Mask: 0000000000000111
应该得到位 8 - 6,这 3 位构成寄存器 0(“000”),被正确读取
Word: 1221, LeftBit: 8, RightBit: 6
LeftPad: 7 RightPad: 13
Val : 0001001000100001
Temp L: 0001000010000000
Temp R: 0000000000000000
Mask: 0000000000000111
R0, R0,
那么,为什么我的右移在第二次调用时不起作用,但在第一次和最后一次调用时却能正常工作?
问题出在您的 rightPad
中也有 leftPad
。无需向您提供给函数的正确偏移量添加任何内容。只需向右移动那么多就可以了。
为什么第一次不报错是因为leftBit
是15,所以15 - 15
是0,你只移动了rightBit
的量。
如此简单
temp = val >> rightBit;
我正在尝试用 C 实现 LC3 模拟器,但在解析指令代码时我 运行 遇到了麻烦。我有一个方法 get_bits() 应该获取指定短整型(定义为 'Word')的位。
Word get_bits(Word val, Word leftBit, Word rightBit){
printf("\nWord: %x, LeftBit: %d, RightBit: %d\n", val,leftBit,rightBit);
Word leftPad = 15 - leftBit;
Word rightPad = leftPad + rightBit;
printf("LeftPad: %d RightPad: %d\n", leftPad,rightPad);
printf("Val : "); printBinary(val); printf("\n");
Word temp = val << leftPad;
printf("Temp L: "); printBinary(temp); printf("\n");
temp = val >> rightPad;
printf("Temp R: "); printBinary(temp); printf("\n");
//build mask
Word mask = 0x0;
switch(leftBit - rightBit){
case 3:
mask = 0x000F;
break;
case 2:
mask = 0x0007;
break;
default:
printf("Case Not Covered!");
break;
}
printf("Mask: "); printBinary(mask); printf("\n");
temp = temp & mask;
return temp;
}
对于给定的指令 1221,ASM 应该是 ADD R1, R0, 1 但是,get_bits() 函数在第二次解析时失败。 它正确解析了 "ADD" 部分,即前四位,但是在尝试解析 R1 部分时,它右移了太多次,我不明白为什么。输出:
@ 4096 (1000) Value: 4641 1221 ASM:
前 4 位 = "ADD",工作正常
Word: 1221, LeftBit: 15, RightBit: 12
LeftPad: 0 RightPad: 12
Val : 0001001000100001
Temp L: 0001001000100001
Temp R: 0000000000000001
Mask: 0000000000001111
ADD
应该得到位 11 - 9,这 3 位构成寄存器 1(“001”),但被移到 0
Word: 1221, LeftBit: 11, RightBit: 9
LeftPad: 4 RightPad: 13
Val : 0001001000100001
Temp L: 0010001000010000
Temp R: 0000000000000000
Mask: 0000000000000111
应该得到位 8 - 6,这 3 位构成寄存器 0(“000”),被正确读取
Word: 1221, LeftBit: 8, RightBit: 6
LeftPad: 7 RightPad: 13
Val : 0001001000100001
Temp L: 0001000010000000
Temp R: 0000000000000000
Mask: 0000000000000111
R0, R0,
那么,为什么我的右移在第二次调用时不起作用,但在第一次和最后一次调用时却能正常工作?
问题出在您的 rightPad
中也有 leftPad
。无需向您提供给函数的正确偏移量添加任何内容。只需向右移动那么多就可以了。
为什么第一次不报错是因为leftBit
是15,所以15 - 15
是0,你只移动了rightBit
的量。
如此简单
temp = val >> rightBit;