- •Программирование на языке Ассемблер
- •Классификация языков программирования
- •Поколения мп
- •Структура мп 8086
- •Регистры мп
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры смещений
- •Регистр флагов
- •Структура и организация памяти
- •Сегментация памяти и формирование адреса
- •Особенности машинных команд
- •Основные команды мп
- •1.2 Перестановка (exchange):
- •1.3 Загрузка исполнительного адреса (load effective address):
- •3.1 Команды умножения
- •3.2 Команды деления
- •Переходы. Циклы
- •Команды сравнения и условного перехода
- •Команды условного перехода
- •3. Команды управления циклом
- •Язык Ассемблера ibm pc. Структура операторов и директив. Метки, переменные и их атрибуты
- •Команды
- •Директивы
- •Директивы определения данных
- •Конструкция повторения dup
- •Директива dd (define double word, определить двойное слово)
- •Директивы эквивалентности и присваивания
- •Структура программы. Логические сегменты
- •Побитовая обработка и ее основные виды
- •2. Команды сдвига
- •2.1. Логические сдвиги
- •2.2. Арифметические сдвиги
- •2.3. Циклические сдвиги
- •Стек и сегмент стека
- •Стековые команды
- •Пример использования стека
- •Модульное программирование
- •Типы объединения модулей
- •Связь Паскаль-Ассемблер
- •Параметры-значения
- •Параметры-переменные
- •Способы адресации
- •Команды строковых примитивов
- •Сканирование строки: scasb, scasw
- •Приемы обработки структурированной информации
- •Inc si ; к следующей оценке
- •Inc dx ; учет отличника
- •Составление и оформление программ на ассемблере
- •Префикс программного сегмента. Com- и exe-программы
- •Команда прерывания
- •Функции прерывания 21h
- •Процесс разработки программы на языке ассемблера
- •Трансляция программы
- •Компоновка программы
- •Макроповторения
- •Макрооператоры
- •Директива local
- •Директивы условного ассемблирования
- •Директивы if и ife
- •Директивы ifidn и ifdif
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