汇编语言SHLD(双精度左移)和SHRD(双精度右移)指令
SHLD(双精度左移)指令将目的操作数向左移动指定位数。移动形成的空位由源操作数的高位填充。源操作数不变,但是符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志位会受影响:
SHRD(双精度右移)指令将目的操作数向右移动指定位数。移动形成的空位由源操作数的低位填充:
下面的指令格式既可以应用于 SHLD 也可以应用于 SHRD。目标操作数可以是寄存器或内存操作数;源操作数必须是寄存器;移位次数可以是 CL 寄存器或者 8 位立即数:
【示例 2】下例中,AX 右移 4 位,DX 的低 4 位移入 AX 的高 4 位:
为了在屏幕上重定位图像而必须将位元组左右移动时,可以用 SHLD 和 SHRD 来处理位映射图像。另一种可能的应用是数据加密,如果加密算法中包含位的移动的话。最后,对于很长的整数来说,这两条指令还可以用于快速执行其乘除法。
下面的代码示例展示了用 SHRD 如何将一个双字数组右移 4 位:
SHLD dest, source, count
下图展示的是 SHLD 执行移动一位的过程。源操作数的最高位复制到目的操作数的最低位上。目的操作数的所有位都向左移动:SHRD(双精度右移)指令将目的操作数向右移动指定位数。移动形成的空位由源操作数的低位填充:
SHRD dest, source, count
下图展示的是 SHRD 执行移动一位的过程:下面的指令格式既可以应用于 SHLD 也可以应用于 SHRD。目标操作数可以是寄存器或内存操作数;源操作数必须是寄存器;移位次数可以是 CL 寄存器或者 8 位立即数:
SHLD regl6, regl6, CL/imm8
SHLD meml6, regl6, CL/imm8
SHLD reg32, reg32, CL/imm8
SHLD mem32, reg32, CL/imm8
.data wval WORD 9BA6h .code mov ax, 0AC36h shld wval, ax, 4 ; wval = BA6Ah数据移动过程如下图所示:
【示例 2】下例中,AX 右移 4 位,DX 的低 4 位移入 AX 的高 4 位:
mov ax, 234Bh
mov dx,7654h
shrd ax, dx, 4
为了在屏幕上重定位图像而必须将位元组左右移动时,可以用 SHLD 和 SHRD 来处理位映射图像。另一种可能的应用是数据加密,如果加密算法中包含位的移动的话。最后,对于很长的整数来说,这两条指令还可以用于快速执行其乘除法。
下面的代码示例展示了用 SHRD 如何将一个双字数组右移 4 位:
.data array DWORD 648B2165h, 8C943A29h, 6DFA4B86h, 91F76C04h, 8BAF9857h .code mov bl, 4 ;移位次数 mov esi, OFFSET array ;数组的偏移量 mov ecx, (LENGTHOF array) - 1 ;数组元素个数 L1: push ecx ;保存循环计数 mov eax, [esi + TYPE DWORD] mov cl, bl ;移动次数 shrd [esi], eax, cl ;EAX [ESI] 的高位 add esi, TYPE DWORD ;指向下一对双字 pop ecx ;恢复循环计数 loop L1 shr DWORD PTR [esi], 4 ;最后一个双字进行移位