Команды длинного сдвига
Общий вид команды:
![](index_image011.gif)
где оп1 - задает, что сдвигается (память или 32 битный регистр);
оп2 - откуда вдвигаются разряды на освободившиеся места (32 - битный регистр);
оп3 - на сколько сдвиг (константа или регистр CL ).
Схема выполнения команды SHLD представлена на рис. 10.2
![](index_image012.gif)
Рис. 10.2
Заметим, что содержимое оп2 сдвигается виртуально, фактическое содержимое этого регистра не изменяется.
Пример использования команды.
Задано число длиной 1024 бита. Разделить его на 8.
Для деления числа на 8 достаточно сдвинуть его на 3 бита вправо, в этом случае получим частное т деления. Остаток равен младшим трем битам исходного числа.
p486
ideal
model flat
y=x>>3; ost = x[0]&7
extrn ExitProcess:proc
dataseg
x dd 32 dup (0ffffffffh)
y dd 32 dup (?); Частное
ost dd ? ; Остаток
codeseg
begin:
; y=x
mov ecx, 32
for1:
mov eax, [x+ecx*4-4]
mov [y+ecx*4-4], eax
loop for1
;for (i=0; i<31; i++)
mov ecx, 31
mov eax, 0
; shrd (y[i], y[i+1], 3);
for2:
mov ebx, [y+eax*4+4]
shrd [y+eax*4], ebx, 3
;i++
inc eax
loop for2
;shr (y[i], 3);
shr [y+eax*4], 3
; ost = x[0] & 7
mov eax, [x]
and eax, 7
mov [ost], eax
call ExitProcess
end begin