- •Введение.
- •Лекция 1. Архитектура эвм Понятие архитектуры эвм.
- •Архитектура фон Неймана.
- •Лекция 2. Микропроцессор. Характеристики микропроцессора. Структура универсального микропроцессора.
- •Характеристики процессора
- •Лекция 3. Организация памяти. Модели памяти.
- •Режимы работы микропроцессора
- •Лекция 4. Модели памяти.
- •Сегментированная модель памяти.
- •Формирование линейного адреса в реальном режиме.
- •Формирование линейного адреса в защищенном режиме
- •Страничная модель памяти
- •Лекция 5. Типы данных. Форматы команд. Форматы и типы данных
- •Формат машинной команды
- •Лекция 6. Архитектура мп 8086. Программная модель микропроцессора.
- •Лекция 7. Архитектура 32-разрядного универсального микропроцессора ia32
- •Лекция 8. Методы адресации
- •Лекция 9. Структура машинной команды.
- •Лекция 10. Структура программы на ассемблере.
- •Лекция 11. Система команд микропроцессора 8086. Команды пересылки данных
- •Команды пересылки данных
- •Команды преобразования типов
- •Команды преобразования данных.
- •Xlat [адрес_таблицы_перекодировки]
- •Лекция 12. Целочисленные арифметические команды двоичной арифметики
- •Команда сравнения как команда с арифметическим принципом действия
- •Лекция 13. Команды манипулирования битами
- •Логические команды
- •Команды сдвига
- •Коп операнд, счетчик_сдвигов
- •Команды линейного сдвига
- •Команды циклического сдвига
- •Дополнительные команды сдвига
- •Лекция 14. Команды передачи управления
- •Команда безусловного перехода
- •Команды условного перехода
- •Организация циклов
- •Лекция 15. Стек
- •Работа стека
- •Управление стеком
- •Доступ к элементам стека
- •Лекция 16. Модульное программирование. Процедуры Концепция модульного программирования
- •Понятие "процедура"
- •Описание процедуры
- •Команда вызова процедуры. Команда возврата управления
- •Организация интерфейса с процедурой
- •Возврат результата из процедуры
- •Лекция 18. Цепочки
- •Синтаксис цепочечных команд
- •Префиксы повторения
- •Цепочечные индексные регистры
- •Направление обработки цепочки
- •Пересылка цепочек
- •Сравнение цепочек
- •Поиск в цепочках
- •Загрузка цепочек
- •Запись данных в цепочку. Заполнение памяти
- •Лекция 19. Массивы
- •Описание и инициализация массива в программе
- •Доступ к элементам массива
- •Двухмерные массивы
- •Лекция 20. Структуры
- •Описание шаблона структуры
- •Определение данных с типом структуры
- •Ссылки на поля структур
- •Использование структурированных переменных
- •Лекция 21. Расширенные возможности современных микропроцессоров Архитектурные особенности
- •Дополнительные режимы адресации
- •Использование средств 32-разрядных процессоров в программировании
- •Лабораторный практикум Лабораторная работа №1. Этапы создания программы на ассемблере. Отладчик Turbo Debugger
- •Лабораторная работа №2. Команды пересылки данных. Арифметические команды
- •Задачи для самостоятельного решения
- •Лабораторная работа №3 . Команды для работы с битами.
- •Демонстрационные примеры
- •Задачи для самостоятельного решения
- •Лабораторная работа №4. Команды передачи управления
- •Лабораторная работа №5. Прерывания.
- •Демонстрационные примеры
- •Задачи для самостоятельного решения
- •Лабораторная работа №6. Модульное программирование. Подпрограммы
- •Задачи для самостоятельного решения
- •Лабораторная работа №7. Стек.
- •Лабораторная работа №8 . Массивы
- •Задачи для самостоятельного решения
- •Лабораторная работа №9. Цепочки
- •Демонстрационные примеры.
- •Задачи для самостоятельного решения
- •Лабораторная работа №10. Структуры
- •Демонстрационные примеры.
- •Лабораторная работа №11. Файлы
- •Демонстрационные примеры
- •Задачи для самостоятельного решения
- •Литература
Команда сравнения как команда с арифметическим принципом действия
CMP (от англ. compare - " сравнение ").
CMP <Первый операнд>,<Второй операнд>
Приёмник Источник
Не допускается использовать для записи операндов сегментный регистр или записывать оба операнда одновременно в ячейки оперативной памяти.
Команда CMP вычитает из содержимого первого операнда содержимое второго операнда. Результат операции изменяет флаги. Сами операнды не изменяются. Первый операнд может быть записан в регистре, либо в ячейке памяти. Второй операнд может быть задан в регистре, ячейке памяти, либо непосредственным операндом.
Команда осуществляет сравнение операндов.
Укажем значение флагов после выполнения команды CMP:
Условие |
CF |
ZF |
SF |
OF |
PF |
AF |
Операнды без знака; |
||||||
приёмник < источник |
1 |
0 |
1 |
0 |
1 |
1 |
приёмник = источник |
0 |
1 |
0 |
0 |
1 |
0 |
приёмник > источник |
0 |
0 |
0 |
0 |
0 |
0 |
Операнды со знаком; |
||||||
приёмник < источник |
1 |
0 |
1 |
0 |
1 |
1 |
приёмник = источник |
0 |
1 |
0 |
0 |
1 |
0 |
приёмник > источник |
0 |
0 |
0 |
0 |
0 |
0 |
Пример
mov si,100
cmp si,0; ZF=0 and SF=0
Лекция 13. Команды манипулирования битами
Наряду со средствами арифметических вычислений, система команд микропроцессора имеет также средства логического преобразования данных. К средствам логического преобразования данных относятся логические команды и логические операции.
В языке ассемблера имеется следующий набор логических операций:
and (операция "И");
or (операция "ИЛИ");
xor (операция "исключающее ИЛИ");
not (операция "НЕ" или 1 0"отрицание").
Приведём также таблицу истинности для логических операций над битами:
Бит источника |
Бит приемника |
AND |
OR |
XOR |
NOT |
TEST |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
Логические команды
Система команд микропроцессора содержит пять команд, поддерживающих данные операции. Эти команды выполняют логические операции над битами операндов. Размерность операндов, естественно, должна быть одинакова. Например, если размерность операндов равна слову (16 бит), то логическая операция выполняется сначала над нулевыми битами операндов и ее результат записывается на место бита 0 результата. Далее команда последовательно повторяет эти действия над всеми битами с первого до пятнадцатого.
and операнд_1,операнд_2 — операция логического умножения.
Команда выполняет поразрядно логическую операцию И (конъюнкцию) над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1.
Пример. Пусть регистр CX содержит слово 02F7H. Выполним команду AND CX,F300H.
Значения операндов
CX (Первый операнд) 02F7H 0000 0010 1111 0111
Второй операнд F300H 1111 0011 0000 0000
AND CX,F300H 0200H 0000 0010 0000 0000 ───> CX
(Первый операнд)
or операнд_1,операнд_2 — операция логического сложения.
Команда выполняет поразрядно логическую операцию ИЛИ (дизъюнкцию) над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1.
Пример. Пусть регистр CX содержит слово 02F7H. Выполним команду OR CX,F300H.
Значения операндов
CX (Первый операнд ) 02F7H 0000 0010 1111 0111
Второй операнд F300H 1111 0011 0000 0000
OR CX,F300H F3F7H 1111 0011 1111 0111 ───> CX
(Первый операнд)
xor операнд_1,операнд_2 — операция логического исключающего сложения.
Команда выполняет поразрядно логическую операцию исключающего ИЛИ над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1.
Пример. Пусть регистр CX содержит слово 02F7H. Выполним команду XOR CX,F300H.
Значения операндов
CX (Первый операнд) 02F7H 0000 0010 1111 0111
Второй операнд F300H 1111 0011 0000 0000
XOR CX,F300H F1F7H 1111 0001 1111 0111 ───> CX
(Первый операнд)
test операнд_1,операнд_2 — операция “проверить” (способом логического умножения).
Команда выполняет поразрядно логическую операцию И над битами операндов операнд_1 и операнд_2. Состояние операндов остается прежним, изменяются только флаги zf, sf, и pf, что дает возможность анализировать состояние отдельных битов операнда без изменения их состояния.
not операнд — операция логического отрицания.
Команда выполняет поразрядное инвертирование (замену значения на обратное) каждого бита операнда. Результат записывается на место операнда.
Логические операции, кроме NOT, устанавливают флаги SF (знака), ZF (нуля) и PF(четности), флаг переноса устанавливается в 0. Все команды, за исключением TEST, сохраняют результат логической операции в приемнике. Команда TEST выполняет такую же операцию, что и AND. Различие только в том, что результат операции TEST не сохраняется в приемнике, а используется для следующей команды перехода по нулю.
Логические команды хороши тем, что выполняются быстро, быстрее “коротких” команд сложения и вычитания. Приведем некоторые полезные приемы применения этих команд.
Часто встречающийся в программах прием – использование логической команды “исключающее или” (XOR) для обнуления регистра:
XOR AX,AX.
Поскольку логические команды устанавливают флаги, их можно применять для проверки значений регистров.
OR DX,DX ;проверить значение в регистре.
Следует отметить, что эта команда не изменит значения в регистре DX, но при этом, если в регистре хранится нулевое значение, будет установлен в 1 флаг ZF; если старший бит в регистре единичный (что свидетельствует об отрицательном значении при представлении его как числа со знаком), то будет установлен в 1 флаг знака SF.
При проверки четности или нечетности значения в регистре, можно воспользоваться командой
AND DX,1H ;выделить младший бит, учитывая, что двоичное представление четных чисел имеет нулевой последний бит. Следует отметить, что при использовании команды AND значение в регистре будет этой командой изменено. Если необходимо оставить значение в регистре DX без изменений, то следует воспользоваться командой TEST, например, таким образом:
TEST DX,00000001B ;проверить младший бит.
Следующие две команды позволяют осуществить поиск первого установленного в 1 бита операнда. Поиск можно произвести как с начала так и от конца операнда:
bsf операнд_1,операнд_2 (Bit Scaning Forward) - сканирование битов вперед.
Команда просматривает (сканирует) биты операнд_2 от младшего к старшему (от бита 0 до старшего бита) в поисках первого бита, установленного в 1. Если таковой обнаруживается, в операнд_1 заносится номер этого бита в виде целочисленного значения. Если все биты операнд_2 равны 0, то флаг нуля zf устанавливается в 1, в противном случае флаг zf сбрасывается в 0.
mov al,02h
bsf bx,al ;bx=1
jz m1 ;переход, если al=00h
...
bsr операнд_1,операнд_2 (Bit Scaning Reset) — сканирование битов в обратном порядке.
Команда просматривает (сканирует) биты операнд_2 от старшего к младшему (от старшего бита к биту 0) в поисках первого бита, установленного в 1. Если таковой обнаруживается, в операнд_1 заносится номер этого бита в виде целочисленного значения.
При этом важно, что позиция первого единичного бита слева отсчитывается все равно относительно бита 0. Если все биты операнд_2 равны 0, то флаг нуля zf устанавливается в 1, в противном случае флаг zf сбрасывается в 0.
