程序集

时间:2017-04-10 22:20:05

标签: assembly x86 inline-assembly

我想问你如何进行位操作&,<<,>>,|在集会中。我知道转移和旋转意见,但我不知道这很热。我能用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;
}

2 个答案:

答案 0 :(得分:3)

你需要考虑一下你想要完成的事情。它是一个普遍的信念,如果我能用汇编语言写它,它会更快。&#34;这似乎有意义,因为汇编程序是处理器实际说的语言,对吧?

然而,忽略了这样一个事实,即编译器的目的是将高级语言转换为汇编语言。并且编译器知道各种各样的技巧和怪癖,关于如何从处理器中获得最佳性能,这将花费你很多年的时间来掌握。

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

但如果目标是要了解有关计算机和汇编程序的更多信息,那就去吧。

那说......

一旦您开始查看可用的指令,您正在寻找的x86汇编程序指令非常明显。 Here's x86指令参考(不一定是最好的,只是谷歌提供的第一个)。

看看你的例子:

  • 通过列表进行分页,我们看到AND指令描述为&#34;逻辑AND&#34;
  • SHR他们描述为&#34; Shift&#34;但更准确的说法是&#34; Shift Right。&#34;
  • SHL,也被描述为&#34; Shift&#34;但实际上是#34;左移。&#34;
  • 您的上一个示例包含2个操作。第一个是SHL,第二个是OR

如果你打算在汇编程序中做很多工作,你应该花一些时间通过引用进行分页,以熟悉各种指令。

FWIW。

答案 1 :(得分: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