在 C 和汇编中移动

shifting in C and assembly

考虑以下 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; 之后为 0,那么为什么 temp << 5 在这里有效,因为移动 0 没有任何不同? (可能是我算错了,如果需要的话可以提供我所有的计算结果)

0xff9f 在二进制中是 1111111110011111。掩码将第 5 位和第 6 位归零,保留其他位。

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

(您在 temp 中得到 0 的事实要么是一个错误,要么是预期的,具体取决于输入数据,它不会改变上面的答案)