繁体   English   中英

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 ((*switches) >> 6) & 0x3; ,为什么temp << 5在这里有效,因为移位0没有什么不同? (也许我计算错了,可以根据需要提供我所有的计算结果)

0xff9f是二进制文件1111111110011111 掩码将第5位和第6位置零,其余的保留。

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

(根据输入数据,您得到的temp为0的事实是错误或预期的事实,它不会更改上面的答案)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM