2017-04-10 120 views
0

我想问你我该怎么做位操作&,< <,>>,| |在组装中。我知道轮班和轮换意见,但我不知道用这个做热门。我可以用C编写它,但我不知道如何在汇编中实现。你能帮我解决这个问题吗?装配中的位操作

编辑:为Intel x86

感谢

void shifting_in_C(unsigned short n) 
{ 
    unsigned char a = n & 255; 
    unsigned char b = n >>8; 
    unsigned char c = (n << 8) 
    unsigned char d = (n << 8) | 255; 
} 
+0

编译_C_代码并查看生成的汇编代码? –

+2

对于哪个CPU?查找产品指导手册 – James

+0

已被编辑。对于Intel x86 – Matey

回答

3

你需要考虑一个你正在试图完成的时刻。人们普遍认为,“如果我可以用汇编编写它,速度会更快。”这似乎是有道理的,因为汇编是处理器实际说话的语言,对吗?

但是,这忽略了一个事实,即编译器的目的是将高级语言转换为汇编程序。编译器知道各种关于如何从处理器中获得最佳性能的技巧和怪癖,而这需要您多少年才能掌握。

因此,如果目标是通过将代码写入汇编程序来使代码的一部分运行得更快,那么您需要确保可以比编写编译器的向导编写汇编程序更好。这有可能发生。但更常见的是你自己编写的代码会变慢。

但是,如果目标是更多地了解计算机和汇编程序,那就去做吧。

也就是说......

你正在寻找的x86汇编指令,一旦你开始寻找直通可用的指令很明显的。 Here's x86指令参考(不一定是最好的,只是第一个谷歌提供的)。

看你的例子:

  • 寻呼通的列表中,我们看到被描述为“逻辑与”
  • SHR他们形容为“转移”,而更正确地将被描述为“移AND指令对。”
  • SHL它也被描述为“Shift”,但实际上是“左移”。
  • 您的最后一个示例包含2个操作。第一个是SHL,第二个是OR

如果您打算在汇编程序中做很多工作,您应该花点时间通过引用来调整参考以熟悉各种指令。

FWIW。

0
void shifting_in_C(unsigned short n) 
{ 
    unsigned char a = n & 255; 
    unsigned char b = n >>8; 
    unsigned char c = (n << 8) 
    unsigned char d = (n << 8) | 255; 
} 


push ebx 
; unsigned char a = n & 255; 
mov al, [esp + 8] 
; unsigned char b = n >>8; 
mov bl, [esp + 9] 
; unsigned char c = (n << 8) 
xor cl, cl ;(constant overflow) 
; unsigned char d = (n << 8) | 255; 
xor dl, dl ;(constant overflow) 
dec dl 
pop ebx 
ret 

我想你想要这样的:

unsigned short bswap16(unsigned short n) 
{ 
    return ((n & 0xFF) << 8) | (n >> 8) & 0xFF; 
} 

mov ax, [esp + 4] 
xchg al, ah 
ret 
+1

如果它正在交换@Matey正在查找的字节,我们还应该考虑'__builtin_bswap16'或['_byteswap_ushort'](https://msdn.microsoft.com/en-us/library/a3140177.aspx)(取决于编译器)。 –