Программирование на Ассемблере


Команды длинного сдвига


Общий вид команды:

,

где оп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




Содержание раздела