7.3.1 多双字移位
程序有时需要移动数组内的所有位,如将位映射图像从屏幕的一个位置移动到另一个位置就需要这样做,以一个包含三个双字的数组为例,通过下面的步骤可以将数组整体向右移动一位:
1、将ESI设置为array的偏移。
2、将[esi+8]位置处的双字向右移一位,最低位拷贝到进位标志中。
3、将[esi+4]处的值右移一位,最高位以进位标志的值填充,最低位拷贝到进位标志中。
4、将[esi+0]处的双字右移一位,其最高位以进位标志值填充,其最低位拷贝到进位标志中。
下图显示了数组的内容及间接引用:
|99999999h|99999999h|99999999h|
[esi] [esi+4] [esi+8]
实现程序Multishf.asm的代码如下:
.data
arraysize=3
array DWORD arraysize DUP(99999999h) ;1001 1001 ...
.code
mov esi,0
shr array[esi+8],1
rcr array[esi+4],1
rcr array[esi],1
问题:
我看不懂这样怎么可能把它们同时右移动一个位,我感觉错了,我想的是
1、第一次shr 99999999h, 最后一个位进入进位标志。
2、第二次rcr 99999999h,最低位进入进位标志,最高位用[esi+8]的最低位填充的。
3、第三次rcr 99999999h 高位用[esi+4]的最低位,最低位进入进位标志。
这样就不是同时移动所有位@
那位高手给我讲讲行不@
------解决方案--------------------------------------------------------
的确,当初我看到这节内容也是很奇怪,不过自己做下实验就知道了,我认为书上所说的有错误,应该是:
- Assembly code
mov esi,0 shr Array[esi],1 rcr Array[esi+4],1 rcr Array[esi+8],1