使用汇编在字符串中移位字符的最佳方法是什么?

时间:2016-12-24 06:17:42

标签: assembly irvine32

我想问一下使用Irvine库在x86程序集中将字符串中的字符向右或向左移位的最佳方法是什么。 有一个例子: ABCD - > DABC等等

我已经编写了这段代码,但它给了我错误的结果。

r1:
push ecx
mov ecx,lengthof arr
mov al,[esi+lengthof arr]
mov bl,[esi]
mov [esi],al
mov [esi+1],bl
inc esi
innr1:
mov al,[esi]
mov bl,[esi+1]
mov [esi],al
inc esi
loop innr1
pop ecx
loop r1

1 个答案:

答案 0 :(得分:5)

在您的示例中使用4字节字符串的特殊情况下,使用rol dword ptr [arr], 8进行您描述的旋转。

(请记住,x86是little-endian,因此在多字节操作数内左移会将字节移动到更高的地址。)

在非特殊情况下,只需实现一个带有正常复制循环的memmove()来移位字节,然后复制必须环绕的字节。 (您可能希望在进入复制循环之前加载包裹的字节,因此您可以覆盖存储它的位置。)

执行此操作(性能)的最佳方法可能是使用SSE movupsrep movsb具有较高的启动开销,并且在未对齐的数据上较慢。并且可能不适合重叠的目的地,但我不记得看到提到的那些。

如果那不是你所说的“最佳”,那就更具体,说“最容易理解”或其他什么。