Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

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

Общий формат этих команд (КОП – код операции)

КОП операнд, счетчик_сдвигов

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

Все команды сдвига делятся на команды:

Линейный сдвиг

Осуществляется сдвиг по следующей схеме:

– очередной «сдвигаемый» бит устанавливается во флаг cf

– бит, вводимый в операнд с другого конца, имеет значение 0

– при сдвиге очередного бита он переходит во флаг cf, при этом значение предыдущего сдвинутого бита теряется.

Команды линейного делятся на:

–команды логического сдвига

–команды арифметического сдвига.

К командам логического сдвига относятся

shl операнд, счетчик_сдвигов – логический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчика_сдвигов. Справа (в позицию младшего бита) вписываются нули

shr операнд, счетчик_сдвигов – логический сдвиг вправо. Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчика_сдвигов. Слева (в позицию старшего бита) вписываются нули

Например:

shl ah,4

Команды арифметического линейного сдвига отличаются от команд логического сдвига тем, что они особым образом работают со знаковым разрядом операнда

sal операнд, счетчик_сдвигов – арифметический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчика_сдвигов. Справа (в позицию младшего бита) вписываются нули. Команда sal не сохраняет знака, но устанавливает флаг cf в случае смены знака очередным выдвигаемым битом.

Пример 1: (8*9+3)*5=375(10)=177(16)

Masm

model small

.stack 100h

.data

A DW 5

B DW 3

C DW 8

D DW 9

.code

start:

mov AX,@data

mov DS,AX

mov AX,C

mov BX,D

mul BX

add AX,B

mov BX,A

mul BX

mov AX,4C00h

int 21h

end start

Пример 2: 6*С+(В-С+1)/2

masm

model small

.stack 100h

.data

B DW 8 ; резервирование памяти для данных размером 2 байт;

C DW 3 ; резервирование памяти для данных размером 2 байт;

D Db 2 ; резервирование памяти для данных размером 1 байт;

.code

start:

mov AX,@data

mov DS,AX

mov AX,6

mov BX,C

mul BX

mov Dx,AX

mov Ax,B

mov Bx,C

sub Ax,Bx

jl m1 ; отрицательный ли результат? Если да, то переход на метку m1. Если

;результат положительный, то продолжаем выполнять следующую команду.

add ax,1

xor bx,bx

mov bl,d

div bl

add ax,dx

jmp m2

m1: ; результат оказывается отрицательным!

neg ax

mov bx,1

sub ax,bx

xor bx,bx

mov bl,d

div bl

neg ax

add Ax,Dx

m2:

mov AX,4C00h

int 21h

end start