- •1. Обработка символьной информации
- •Команды префикса повторения.
- •Примеры программ, реализующих действия со строками.
- •Практическая часть.
- •Контрольные вопросы и задания.
- •Передача параметров в процедуру.
- •1. Передача через регистры: программа перед вызовом заносит входные параметры в некоторые регистры процессора, а после возврата выбирает из регистров значения результатов.
- •Модульная структура программ на языке Ассемблера.
- •Работа с командой прерываний int.
- •Практические задания.
- •Синтаксис:
- •Команды сдвига.
- •Команды логического сдвига shl и shr.
- •Команды арифметического сдвига sal и sar.
- •Команды циклического сдвига: rol и ror, rcl и rcr.
- •Использование логических и арифметических команд сдвига.
- •1. Команды логического сдвига. Используются для выполнения быстрого умножение и деление целых чисел на степени двойки, на 2 k.
- •Литература
Команды циклического сдвига: rol и ror, rcl и rcr.
К командам циклического сдвига относятся команды, сохраняющие значения сдвигаемых бит. Есть два типа команд циклического сдвига:
команды простого циклического сдвига;
команды циклического сдвига через флаг переноса CF.
К командам простого циклического сдвига относятся:
ROL (Rotate Left) - циклический сдвиг влево.
ROR (Rotate Right) - циклический сдвиг вправо.
Синтаксис: ROL dst, countdst, count
Содержимое операнда dst сдвигается влево / вправо на количество бит, определяемое операндом count. Сдвигаемые влево / вправо биты записываются в тот же операнд справа / слева. Схема работы команд простого циклического сдвига показана на рисунке 6.3.
Фрагменты использования логических сдвигов
Произвести обмен старшей и младшей половинок операнда размером в байт и слово.
data_8 db 0Fh_16 dw 1234hal, 26hal, 4val_8, 4ax, 0203hax, 8 val_16, 8
К командам циклического сдвига через флаг переноса CF относятся следующие:
RCL (Rotate through Carry Left) - циклический сдвиг влево через перенос;
RCR (Rotate through Carry Right) - циклический сдвиг вправо через перенос.
Синтаксис: RCL dst, count
RCR dst, count
Содержимое операнда dst сдвигается влево / вправо на количество бит, определяемое операндом count. Сдвигаемые биты поочередно становятся значением флага переноса CF. Схема работы команд циклического сдвига через флаг переноса CF показана на рисунке 6.4.
Использование логических и арифметических команд сдвига.
1. Команды логического сдвига. Используются для выполнения быстрого умножение и деление целых чисел на степени двойки, на 2 k.
Сдвиг двоичного числа на k разрядов влево - это приписывание справа k двоичных нулей, т.е. умножение на 2 k. Например, при сдвиге числа 5 на 3 разряда влево получаем:
=101b -> 101000b = 40 = 5*2 3
Это же верно и для отрицательных чисел, представленных в дополнительном коде. Например, при сдвиге числа -4 на 1 разряд влево получаем:
доп (-4) = 11111100b -> 11111000b = 100h-8 = доп (-8)
В общем случае умножение на 2 k реализуется так:
MOV CL, kdst, CL
При этом надо учитывать, что все это верно, только если результат сдвига умещается в ячейку. Например, путем сдвига можно реализовать умножение на 2 всех беззнаковых чисел, меньших 128, и всех знаковых чисел от -64 до +63.
Сдвиг на k разрядов вправо - это отбрасывание последних k разрядов, что соответствует получению неполного частного (операции div) от деления на 2 k. Например, при сдвиге числа 18 на 3 разряда вправо получаем:
= 10010b-> 10b = 2 = 18 div 2 3
Однако так можно реализовать операцию деления нацело только для беззнаковых чисел, для отрицательных чисел это не проходит. Поэтому имеем:
CL, kdst, CL
. Команда SAR может быть использована для быстрого получения неполного частного при делении знаковых чисел на степени 2. Однако эта операция отличается от той, что реализуется командой IDIV: команда IDIV округляет частное в сторону 0, а SAR округляет в сторону минус бесконечности. Например, при делении -1 на 2 (т.е. при частном -0.5) команда IDIV выдаст ответ 0, а команда SAR - ответ -1:
MOV AL, -1; AL=11111111bAL, 1; AL=11111111b (-1)
. Команды циклического сдвига обычно используются для перестановки частей содержимого ячейки или регистра. Например, поменять местами правую и левую половины регистра AL можно циклическим сдвигом этого байта на 4 разряда влево (или вправо):
MOV AL, 17h; AL=00010111bCL, 4AL, CL; AL = 01110001b = 71h
. Команды циклического сдвига через перенос RCL и RCR обычно используются при переносе битов из одного регистра (или переменной) в другой. Например, сдвинуть на 3 разряда влево значения регистров AL и DH, приписав справа к AL три левых бита регистра DH, можно так:
MOV СХ, 3: SHL DH, 1 AL, 1
LOOP L
