Команды длинного сдвига
Общий вид команды:
,где оп1 - задает, что сдвигается (память или 32 битный регистр);
оп2 - откуда вдвигаются разряды на освободившиеся места (32 - битный регистр);
оп3 - на сколько сдвиг (константа или регистр CL ).
Схема выполнения команды SHLD представлена на рис. 10.2
Рис. 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