C和汇编的转变

时间:2019-01-07 09:42:59

标签: c assembly mips bit

考虑下面的C代码,它们在内存映射的I / O之间进行读写操作。

volatile int* switches = (volatile int*) 0x1b430010; 
volatile int* leds = (volatile int*) 0xabbb8050; 
int temp = ((*switches) >> 6) & 0x3; 
*leds = (*leds & 0xff9f) | XXX;

从上面的C代码中可以得出,某些位是从16位开关端口读取的,并用于打开或关闭某些LED,而不会影响16位LED端口上的其他LED。一个缺少的表达式标记为XXX。写下表达式XXX应该是什么,以便正确打开或关闭LED。

答案是XXX = temp << 5。 当我尝试转换为汇编并按位计算时,在((*switches) >> 6) & 0x3;之后得到temp为0,那么为什么temp << 5在这里有效,因为移位0并没有什么不同? (也许我计算错了,可以根据需要以位为单位提供我的所有计算结果)

1 个答案:

答案 0 :(得分:3)

0xff9f1111111110011111的二进制。掩码将第5位和第6位置零,其余的保留。

temp是2位的值,因为代码和掩码分别用二进制的0x311(所有其他位都为零)。您必须将其向左移动5次才能通过|掩码插入最终值。

temp的数字为0的事实是错误或预期的,取决于输入数据,它不会改变上面的答案)