[英]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 ((*switches) >> 6) & 0x3;
,为什么temp << 5
在这里有效,因为移位0没有什么不同? (也许我计算错了,可以根据需要提供我所有的计算结果)
0xff9f
是二进制文件1111111110011111
。 掩码将第5位和第6位置零,其余的保留。
temp
是2位的值,因为二进制代码的0x3
和11
的代码和掩码(所有其他位都为零)。 您必须将其向左移动5次,才能通过|
插入最终值|
掩蔽。
(根据输入数据,您得到的temp
为0的事实是错误或预期的事实,它不会更改上面的答案)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.