在汇编中交换位

时间:2017-06-13 05:14:05

标签: assembly inline-assembly

假设我正在创建一个名为swap(int)

的函数

使用int = 0xAABBCCDD调用, 预期回报0xDDCCBBAA。我以何种方式访问​​汇编中的内存来逐位控制它,而不是一次控制4位。如果不可能,我可以以什么方式交换价值?

谢谢

1 个答案:

答案 0 :(得分:1)

出于这个答案的目的,我将假设x86或x86_64并且你真的在寻找汇编答案。此外,由于我第一次误读了这个问题,我为你提供了两个答案......:)

那个上下文,没有指令允许你直接处理几个位,虽然有各种寄存器名称可以让你得到像单个字节一样小的东西。否则,位操作将需要AND和OR与屏蔽。

但是,对于您的具体情况,还有另一种选择。考虑一下:

mov eax, 0xAABBCCDD

我们现在在eAX中拥有您的价值。如果要反转该寄存器中字节的顺序,BSWAP指令适合您:

bswap eax

这将导致EAX包含0xDDCCBBAA,这似乎是您所要求的。

另一方面,如果要切换位以将0xAABB移动到较低的两个字节,可以执行以下操作:

ror eax, 16

这会将32位值旋转到右16位。换句话说,EAX现在将包含0xCCDDAABB,这是你的目标。