8086组装中的大型二进制移位?

时间:2010-07-09 04:33:14

标签: assembly logic bit-shift x86-16

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

我现在最好的猜测(非常新的装配)将是我必须首先检查一个块(可能是int)以查看它会移出什么,移位,然后继续进行以前的int会移出的并继续进行数据转换。有没有更简单的方法?如果我必须使用这种携带技术,那么我可以移动的最大块是什么?双字? QWORD?

3 个答案:

答案 0 :(得分:2)

如果您只想换一次,请使用旋转随身携带说明。

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

  1. 将4个字节拉入寄存器
  2. RCR
  3. 回写
  4. 重复下4个字节

答案 1 :(得分:1)

即使对于大型内存结构,在x86下移位也非常简单。

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

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

rcr     dword ptr[edx], 1

甚至更好

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

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

2)存储最后移位的进位位

编辑: 在内存中你可以立即移动32位并且不要忘记内存对齐,移动32位aligend dwords来提高执行速度。

答案 2 :(得分:0)

x86处理器有一个Carry标志,可以很好地实现此目的。随着Carry标志scrscl有移位说明。 http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate#Shift_With_Carry_Instructions