- •Команды языка ассемблера
- •3.2.1 Программные сегменты. Директива assume
- •6. Арифметические команды ……………………………………………….
- •Архитектура пк.
- •Регистры.
- •Регистры общего назначения.
- •1.1.2. Сегментные регистры
- •1.1.3 Регистр флагов
- •Организация памяти.
- •1.3. Представление данных
- •1.3.1 Типы данных
- •1.3.2 Представление символов и строк
- •Операторы программы на ассемблере
- •2.1 Команды языка ассемблера
- •2.2. Режимы адресации и форматы машинных команд
- •3. Псевдооператоры
- •3.1 Директивы определения данных
- •3.2 Структура программы на ассемблере
- •3.2.1 Программные сегменты. Директива assume
- •Начальная загрузка сегментных регистров
- •Упрощенная директива сегментации
- •4. Ассемблирование и компоновка программы.
- •5. Команды пересылки данных
- •5.1 Команды общего назначения
- •5.2 Команды работы со стеком
- •4.3 Команды ввода-вывода
- •5.4 Команды пересылки адреса
- •5.5 Команды пересылки флагов
- •6. Арифметические команды
- •Арифметические операции над целыми двоичными числами.
- •6.1.1 Сложение и вычитание.
- •6.1.2 Команды приращения и уменьшения приемника на единицу
- •6.2 Умножение и деление.
- •6.3 Изменение знака.
- •7. Логические операции
- •8. Сдвиги и циклические сдвиги
- •9. Строковые операции
- •10. Логика и организация программ
- •10.1 Безусловные переходы
- •10.2 Условные переходы
- •10.3 Циклы
- •10.4 Процедуры в языке ассемблера
- •10.5 Прерывания int
- •10.6 Системное программное обеспечение
- •10.6.1.1 Чтение клавиатуры.
- •10.6.1.2 Вывод символов на экран.
- •10.6.1.3 Завершение программ.
- •10.6.2.1 Выбор режимов дисплея.
- •11. Дисковая память
- •11.1 Оглавление диска (каталог)
- •11.2 Таблица распределения файлов
- •11.3 Операции ввода-вывода на диск
- •11.3.1 Запись файла на диск
- •11.3.1.1 Данные в формате asciiz
- •11.3.1.2 Файловый номер
- •11.3.1.3 Создание дискового файла
- •Чтение дискового файла
8. Сдвиги и циклические сдвиги
Микропрцессор Intel обеспечивает ряд способов для передвижения битов в регистре или переменной памяти вправо или влево. Простейший из них - логический сдвиг.
SHL (сдвиг влево, так же известный как SAL) передвигает каждый бит в назначении на 1 разряд влево или в направлении к старшему значащему биту. Значение 1010110b (96h или 150d), хранящееся в AL сдвигается влево при помощи SHL AL,1. Результат - значение 00101100b (2Ch или 44d) , которое возвращается в AL. Флаг переноса устанавливается в 1.
Старшие значащие биты сдвигаются за пределы операнда и во флаг переноса, а в младшие значащие биты устанавливаются нули.
Для чего используется сдвиг влево? Наиболее общее использование SHL - это выполнение быстрого умножения на 2, поскольку каждый SHL умножает операнд на 2. Например, следующий код умножает DX на 16:
...
SHL DX,1 ;DX * 2
SHL DX,1 ;DX * 4
SHL DX,1 ;DX * 8
SHL DX,1 ;DX * 16
...
Умножение при помощи сдвига много быстрее, чем использование инструкции MUL. Заметьте, что второй операнд SHL в этом примере, имеет значение 1. Это означает, что DX должен быть сдвинут влево на 1 бит. Для сдвига на число бит большее чем 1 можно использовать CL; например,
...
MOV CL,4
SHL DX,CL
...
умножает DX на 16, как в предыдущем примере.
Если существует левый сдвиг, то наверное, должен быть и правый. SHR (сдвиг вправо) во многом подобен SHL: он сдвигает биты операнда вправо, либо на 1, либо на CL бит, при этом младший значащий бит сдвигается во флаг переноса, а старший значащий бит устанавливается в 0. SHR - это быстрый способ беззнакового деления на 2.
SAR - арифметический сдвиг вправо, такой же как SHR, за исключением того, что в SAR старший значащий бит операнда сдвигается вправо на следующий бит и затем возвращается в самого себя. Значение 10010110b (90h или -106d), хранящееся в AL сдвигается вправо с помощью SAR AL,1. Результат - значение 11001011b (0CBh или -53d) сохраняемый в AL. Флаг переноса устанавливается в 0.
В результате этого, сохраняется знак операнда, поэтому SAR полезен для знакового деления на 2. Например,
...
MOV bx,-4
SAR bx,1
...
сохраняет -2 в BX.
Существует 4 инструкции циклического сдвига: ROR, ROL, RCR и RCL. ROR подобен SHR, за исключением, что младший значащий бит кроме сдвига во флаг переноса сдвигается так же обратно в старший значащий бит. Рис.4.10 показывает, как значение 10010110b (96h или 150d), хранящееся в AL, циклически сдвигается вправо с помощью ROR AL,1. Результат - значение 01001011b (04Bh или 75d), которое сохраняется в AL. Флаг переноса установлен в 0.
ROL выполняет действие, обратное ROR, сдвигая операнд циклическим образом, но влево, помещая старший значащий бит в младший значащий бит. Например,
...
MOV SI,49f1h
MOV CL,4
ROR SI,CL
...
помещает 149fh в SI, сдвигая биты 3-0 в биты 15-12, биты 7-4 в биты 3-0 и т.д.
RCR и RCL несколько отличаются. RCR подобен сдвигу вправо, в котором старший значащий бит сдвигается из флага переноса. Значение 10010110b (96h или 150d), хранящееся в AL, циклически сдвигается вправо через флаг переноса, который содержит значение 1, с помощью RСR AL,1. Результат - значение 11001011b (0cbh или 203d) которое сохраняется в AL. Флаг переноса установлен в 0.
RCL похож на сдвиг влево, в котором младший значащий бит заполняется из флага переноса. RCR и RCL полезны для сдвигов многословных операндов. Например, значение, типа двойного слова, в DX:AX умножается на 4:
...
SHL AX,1 ;бит 15 AX сдвигается в перенос
RCL DX,1 ;перенос сдвигается в бит 0 DX
SHL AX,1 ;бит 15 AX сдвигается в перенос
RCL DX,1 ;перенос сдвигается в бит 0 DX
...
Инструкции циклического сдвига, как и инструкции сдвига могут сдвигать операнд либо на 1 бит, либо на число бит, указанных в CL.