31. Команды сдвига двойной точности

shld операнд_1, операнд_2, счетчик_сдвигов — сдвиг влево двойной точности.
производит сдвиг влево операнда_1, заменяя освободившиеся справа биты значениями битов операнда_2, которые были бы вытолкнуты из него сдвигом влево на то же количество битов.
Количество сдвигаемых бит определяется значением счетчик_сдвигов, которое может лежать в диапазоне 0…31. Это значение может задаваться непосредственным операндом или содержаться в регистре cl. Значение операнд_2 не изменяется.

shrd операнд_1, операнд_2, счетчик_сдвигов — сдвиг вправо двойной точности.
производит сдвиг вправо операнда_1, заменяя освободившиеся слева биты значениями младших битов операнда_2, которые были бы вытолкнуты из него сдвигом вправо на то же количество битов. Количество сдвигаемых бит определяется значением счетчик_сдвигов, которое может лежать в диапазоне 0…31. Это значение может задаваться непосредственным операндом или содержаться в регистре cl. Значение операнд_2 не изменяется.

Команды shld и shrd осуществляют сдвиги до 32 разрядов, но за счет особенностей задания операндов и алгоритма работы эти команды можно использовать для работы с полями длиной до 64 бит.


Пример того, как можно осуществить сдвиг влево на 16 бит поля из 64 бит.
;...
.data
pole_l  dd      0b21187f5h1
pole_h  dd      45ff6711h
.code
;...
mov     cl,16   ;загрузка счетчика сдвига в cl
mov     eax,pole_h
shld    pole_l, eax, cl
shl     pole_h,cl       ;pole_l=87f50000h, pole_h=6711b211h
17.07.2015