在 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 位的值,因为代码和掩码 0x3
、11
为二进制(所有其他位都为零)。您必须将它向左移动 5 次才能通过 |
掩码插入最终值。
(您在 temp
中得到 0 的事实要么是一个错误,要么是预期的,具体取决于输入数据,它不会改变上面的答案)
考虑以下 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 位的值,因为代码和掩码 0x3
、11
为二进制(所有其他位都为零)。您必须将它向左移动 5 次才能通过 |
掩码插入最终值。
(您在 temp
中得到 0 的事实要么是一个错误,要么是预期的,具体取决于输入数据,它不会改变上面的答案)