Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_Lektsii_2015.doc
Скачиваний:
105
Добавлен:
22.03.2016
Размер:
1.19 Mб
Скачать

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

<мнемокод> ор,1 ; сдвиг ор на 1 разряд

<мнемокод> ор,CL ; сдвиг ор на CL разрядов

Допустимые типы операнда ор: r8, m8, r16, m16.

2.1. Логические сдвиги

Логический сдвиг влево (shift left): SHL op,1

Логический сдвиг вправо (shift right): SHR op,1

Примеры:

MOV AL,01000111b

SHL AL,1 ; CF=0; AL=10001110b

MOV AL,01000111b

SHR AL,1 ; AL=00100011b; CF=1

MOV DH,00111000b

MOV CL,3

SHL DH,CL ; CF=1; AL=11000000b;

Одно из основных применений команд логического сдвига - это быстрое умножение и деление целых чисел на степени двойки.

Сдвиг двоичного числа на к разрядов влево – это приписывание справа к двоичных нулей, т.е. умножение на 2к.

При сдвиге числа 5 на 3 разряда влево:

5=101b, 101000b=40=5*23

В общем случае умножение на 2к реализуется так:

MOV СL

SHL ор,СL ; ор:= ор*2к.

Результат сдвига должен умещаться в ячейку. Путем сдвига можно реализовать умножение на 2 всех беззнаковых чисел, меньших 128, и всех знаковых чисел от -64 до +63.

Сдвиг на к разрядов вправо – это отбрасывание последних к разрядов, что соответствует получению неполного частного (операции div) от деления на 2к.

При сдвиге числа 18 на 3 разряда вправо:

18=10010b, 10b=2=18 div 23

В общем случае деление на 2к для беззнаковых чисел реализуется так:

MOV СL

SHR ор,СL ; ор:= ор div 2к.

2.2. Арифметические сдвиги

Арифметический сдвиг влево (shift arithmetic left):

SAL op1,op2

Эта команда в точности совпадает с командой SHL.

Арифметический сдвиг вправо (shift arithmetic right):

SAR op1,op2

Примеры:

MOV BH,10001110b

SAR BH,1 ; BH=11000111b; CF=0

MOV BH,00001110b

SAR BH,1 ; BH=00000111b; CF=0

При делении -1 на 2 (т.е. при частном -0,5) команда IDIV выдаст ответ 0, а команда SAR – ответ -1.

MOV AL,-1 ; AL=11111111b

SАR AL,1 ; AL=11111111b (-1)

При делении неотрицательных чисел команда SAR дает тот же результат, что и команды SHR, DIV и IDIV.

2.3. Циклические сдвиги

Циклический сдвиг влево (rotate left): ROL op,1

Циклический сдвиг вправо (rotate right): ROR op,1

Примеры:

MOV CL,11000011b

ROL CL,1 ; CF=1; BH=10000111b

MOV BH,11100010b

ROR BH,1 ; BH=01110001b; CF=0

Например, поменять местами правую и левую половины регистра AL можно циклическим сдвигом этого байта на 4 разряда влево (или вправо):

MOV AL,17h ; AL=00010111b

MOV CL,4

ROL AL,CL ; AL=01110001b=71h

Циклический сдвиг влево через перенос (rotate left through carry):

RCL op,1

Циклический сдвиг вправо через перенос (rotate right through carry):

RCR op,1

Примеры:

MOV ВL,11110000b ; пусть CF=0

RСL ВL,1 ; CF=1; ВL=11100000b

RСL ВL,1 ; CF=1; ВL=11000001b

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]