我有一个 512 字节长的二进制数据块,我想知道如果我想将它向右移动一次,最有效的方法是什么。
我现在最好的猜测(对组装来说非常新)是我必须首先检查一个块(可能是 int),看看它会移出什么,移出,然后携带之前的 int 会移出的任何内容并继续携带这下移了数据。有没有更简单的方法?如果我必须使用这种进位技术,我可以移动的最大块是多少?双字?QWord?
如果您只想移动一次,请使用轮换携带指令。
首先,确保进位标志为零。然后:
即使对于大内存结构,在 x86 下转换也非常简单。
1)设置或清除进位标志取决于你不会作为结果的第一位(LSB)。
2)无需在寄存器中提取数据,您可以在内存中一次直接移位 32 位,例如:
rcr dword ptr[edx], 1
甚至更好
rcr dword ptr[edx + ecx *4], 1
其中 ecx 是循环计数器, edx 是内存指针。
2)存储最后移位的进位
编辑:在内存中,您可以一次移动 32 位并且不要忘记内存对齐,移动 32 位对齐双字以提高执行速度。
x86 处理器有一个进位标志,可以很好地用于此目的。有使用进位标志移位的指令,scr
和scl
. http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate#Shift_With_Carry_Instructions