考虑下面的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并没有什么不同? (也许我计算错了,可以根据需要以位为单位提供我的所有计算结果)
答案 0 :(得分:3)
0xff9f
是1111111110011111
的二进制。掩码将第5位和第6位置零,其余的保留。
temp
是2位的值,因为代码和掩码分别用二进制的0x3
,11
(所有其他位都为零)。您必须将其向左移动5次才能通过|
掩码插入最终值。
(temp
的数字为0的事实是错误或预期的,取决于输入数据,它不会改变上面的答案)