2

我有一个 512 字节长的二进制数据块,我想知道如果我想将它向右移动一次,最有效的方法是什么。

我现在最好的猜测(对组装来说非常新)是我必须首先检查一个块(可能是 int),看看它会移出什么,移出,然后携带之前的 int 会移出的任何内容并继续携带这下移了数据。有没有更简单的方法?如果我必须使用这种进位技术,我可以移动的最大块是多少?双字?QWord?

4

3 回答 3

2

如果您只想移动一次,请使用轮换携带指令。

首先,确保进位标志为零。然后:

  1. 将 4 个字节拉入寄存器
  2. RCR
  3. 写回
  4. 重复接下来的 4 个字节
于 2010-07-09T04:40:30.603 回答
1

即使对于大内存结构,在 x86 下转换也非常简单。

1)设置或清除进位标志取决于你不会作为结果的第一位(LSB)。

2)无需在寄存器中提取数据,您可以在内存中一次直接移位 32 位,例如:

rcr     dword ptr[edx], 1

甚至更好

rcr     dword ptr[edx + ecx *4], 1

其中 ecx 是循环计数器, edx 是内存指针。

2)存储最后移位的进位

编辑:在内存中,您可以一次移动 32 位并且不要忘记内存对齐,移动 32 位对齐双字以提高执行速度。

于 2010-07-09T07:05:31.350 回答
0

x86 处理器有一个进位标志,可以很好地用于此目的。有使用进位标志移位的指令,scrscl. http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate#Shift_With_Carry_Instructions

于 2010-07-09T04:42:51.317 回答