Ассемблер для IBM PC

Методическое пособие - Компьютеры, программирование

Другие методички по предмету Компьютеры, программирование

кого сдвига SAL и SAR.

К командам арифметического сдвига относятся две команды:

SAL (Shift Arithmetic Left) - арифметический сдвиг влево;

SAR (Shift Arithmetic Right) - арифметический сдвиг вправо.

Синтаксис: SAL dst, countdst, count

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

Содержимое операнда сдвигается влево / вправо на количество битов, определяемое значением count. Справа/слева вписываются нули. Команда SAL не сохраняет знака, но устанавливает флаг CF в случае смены знака очередным выдвигаемым битом. В остальном команда SAL полностью аналогична команде SHL.

Команда SAR сохраняет знак, восстанавливая его после сдвига каждого очередного бита. На рис. 6.2 показан принцип работы команд линейного арифметического сдвига.

 

 

Команды циклического сдвига: ROL и ROR, RCL и RCR.

К командам циклического сдвига относятся команды, сохраняющие значения сдвигаемых бит. Есть два типа команд циклического сдвига:

  • команды простого циклического сдвига;
  • команды циклического сдвига через флаг переноса CF.

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

ROL (Rotate Left) - циклический сдвиг влево.

ROR (Rotate Right) - циклический сдвиг вправо.

Синтаксис: ROL dst, countdst, count

Содержимое операнда dst сдвигается влево / вправо на количество бит, определяемое операндом count. Сдвигаемые влево / вправо биты записываются в тот же операнд справа / слева. Схема работы команд простого циклического сдвига показана на рисунке 6.3.

 

 

Фрагменты использования логических сдвигов

Произвести обмен старшей и младшей половинок операнда размером в байт и слово.

 

data_8db0Fh_16dw1234hal, 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

 

 

Литература

 

  1. Абель П. Язык Ассемблера для IBM PC и программирования: пер. с англ. / П. Абель. - М: Высш. шк., 1992. - 447 с.
  2. Ирвин К. Язык ассемблера для процессоров Intel: пер. с англ. / К. Ирвин. - М.: Вильяме, 2002. - 616 с.
  3. Скляров В.А. Программирование на языке Ассемблера: учеб. пособие / В.А. Скляров. - М.: Высш. шк., 1999. - 152 с.
  4. Юров В. Assembler: практикум (+дискета) / В. Юров. - СПб.: Питер Ком., 2002. - 400 с.
  5. Юров В. Assembler: учеб. курс / В. Юров, С. Хорошенко. - СПб.: Питер Ком., 1999. - 672 с.