А. Цветкова - Информатика и информационные технологии
Прямая адресация может быть двух типов.
Относительная прямая адресация
Используется для команд условных переходов, для указания относительного адреса перехода. Относительность такого перехода заключается в том, что в поле смещения машинной команды содержится 8-, 16– или 32-битное значение, которое в результате работы команды будет складываться с содержимым регистра указателя команд ip/eip. В результате такого сложения получается адрес, по которому и осуществляется переход.
Абсолютная прямая адресация
В этом случае эффективный адрес является частью машинной команды, но формируется этот адрес только из значения поля смещения в команде. Для формирования физического адреса операнда в памяти микропроцессор складывает это поле со сдвинутым на 4 бита значением сегментного регистра. В команде ассемблера можно использовать несколько форм такой адресации.
Косвенная базовая (регистровая) адресация
При такой адресации эффективный адрес операнда может находиться в любом из регистров общего назначения, кроме sp/esp и bp/ebp (это специфические регистры для работы с сегментом стека). Синтаксически в команде этот режим адресации выражается заключением имени регистра в квадратные скобки [].
Косвенная базовая (регистровая) адресация со смещением
Этот вид адресации является дополнением предыдущего и предназначен для доступа к данным с известным смещением относительно некоторого базового адреса. Этот вид адресации удобно использовать для доступа к элементам структур данных, когда смещение элементов известно заранее, на стадии разработки программы, а базовый (начальный) адрес структуры должен вычисляться динамически, на стадии выполнения программы.
Косвенная индексная адресация со смещением
Этот вид адресации очень похож на косвенную базовую адресацию со смещением. Здесь также для формирования эффективного адреса используется один из регистров общего назначения. Но индексная адресация обладает одной интересной особенностью, которая очень удобна для работы с массивами. Она связана с возможностью так называемого масштабирования содержимого индексного регистра.
Косвенная базовая индексная адресация
При этом виде адресации эффективный адрес формируется как сумма содержимого двух регистров общего назначения: базового и индексного. В качестве этих регистров могут применяться любые регистры общего назначения, при этом часто используется масштабирование содержимого индексного регистра.
Косвенная базовая индексная адресация со смещением
Этот вид адресации является дополнением косвенной индексной адресации. Эффективный адрес формируется как сумма трех составляющих: содержимого базового регистра, содержимого индексного регистра и значения поля смещения в команде.
53. Команды пересылки данных
Команды пересылки данных общего назначения
К этой группе относятся следующие команды:
1) mov – это основная команда пересылки данных;
2) xchg – применяют для двунаправленной пересылки данных.
Команды ввода-вывода в порт
Принципиально управлять устройствами напрямую через порты несложно:
1) in аккумулятор, номерпорта – ввод в аккумулятор из порта с номером номерпорта;
2) out порт, аккумулятор – вывод содержимого аккумулятора в порт с номером номерпорта.
Команды преобразования данных
К этой группе можно отнести множество команд микропроцессора, но большинство из них имеет те или иные особенности, которые требуют отнести их к другим функциональным группам.
Команды работы со стеком
Эта группа представляет собой набор специализированных команд, ориентированных на организацию гибкой и эффективной работы со стеком.
Стек – это область памяти, специально выделяемая для временного хранения данных программы.
Для работы со стеком предназначены три регистра:
1) ss – сегментный регистр стека;
2) sp/esp – регистр указателя стека;
3) bp/ebp – регистр указателя базы кадра стека. Для организации работы со стеком существуют специальные команды записи и чтения.
1. push источник – запись значения источникв вершину стека.
2. pop назначение – запись значения из вершины стека по месту, указанному операндом назначение. Значение при этом «снимается» с вершины стека.
3. pusha – команда групповой записи в стек.
4. pushaw – почти синоним команды pusha. Атрибут разрядности может принимать значение use16 или use32. Р
5. pushad – выполняется аналогично команде pusha, но есть некоторые особенности.
Следующие три команды выполняют действия, обратные вышеописанным командам:
1) popa;
2) popaw;
3) popad.
Группа команд, описанная ниже, позволяет сохранить в стеке регистр флагов и записать слово или двойное слово в стеке.
1. pushf – сохраняет регистр флагов в стеке.
2. pushfw – сохранение в стеке регистра флагов размером в слово. Всегда работает как pushf с атрибутом use16.
3. pushfd – сохранение в стеке регистра флагов flags или eflags в зависимости от атрибута разрядности сегмента (т. е. то же, что и pushf).
Аналогично, следующие три команды выполняют действия, обратные рассмотренным выше операциям:
1) popf;
2) popfw;
3) popfd.
54. Арифметические команды
Такие команды работают с двумя типами:
1) целыми двоичными числами, то есть с числами, закодированными в двоичной системе счисления.
Десятичные числа – специальный вид представления числовой информации, в основу которого положен принцип кодирования каждой десятичной цифры числа группой из четырех бит.
Микропроцессор выполняет сложение операндов по правилам сложения двоичных чисел.
В системе команд микропроцессора имеются три команды двоичного сложения:
1) inc операнд – увеличение значения операнда;
2) add операнд1, операнд2 – сложение;
3) adc операнд1,операнд2 – сложение с учетом флага переноса cf.
Вычитание двоичных чисел без знака
Если уменьшаемое больше вычитаемого, то разность положительна. Если уменьшаемое меньше вычитаемого, возникает проблема: результат меньше 0, а это уже число со знаком.
После вычитания чисел без знака нужно анализировать состояние флага CF. Если он установлен в 1, то произошел заем из старшего разряда и результат получился в дополнительном коде.
Вычитание двоичных чисел со знаком Но для вычитания способом сложения чисел со знаком в дополнительном коде необходимо представлять оба операнда – и уменьшаемое, и вычитаемое. Результат тоже нужно рассматривать как значение в дополнительном коде. Но здесь возникают сложности. Прежде всего они связаны с тем, что старший бит операнда рассматривается как знаковый.
По содержимому флага переполнения of. Его установка в 1 говорит о том, что результат вышел за диапазон представления знаковых чисел (т. е. изменился старший бит) для операнда данного размера, и программист должен предусмотреть действия по корректировке результата.
Принцип вычитания чисел с диапазоном представления, превышающим стандартные разрядные сетки операндов, тот же, что и при сложении, т. е. используется флаг переноса cf. Нужно только представлять себе процесс вычитания в столбик и правильно комбинировать команды микропроцессора с командой sbb.
Для умножения чисел без знака предназначена команда
mul сомножитель_1
Для умножения чисел со знаком предназначена команда
[imul операнд_1, операнд_2, операнд_3]
Для деления чисел без знака предназначена команда div делитель
Для деления чисел со знаком предназначена команда idiv делитель
55. Логические команды
Согласно теории, над высказываниями (над битами) могут выполняться следующие логические операции.
1. Отрицание (логическое НЕ) – логическая операция над одним операндом, результатом которой является величина, обратная значению исходного операнда.
2. Логическое сложение (логическое включающее ИЛИ) – логическая операция над двумя операндами, результатом которой является «истина» (1), если один или оба операнда имеют значение «истина» (1), и «ложь» (0), если оба операнда имеют значение «ложь» (0).
3. Логическое умножение (логическое И) – логическая операция над двумя операндами, результатом которой является «истина» (1) только в том случае, если оба операнда имеют значение «истина» (1). Во всех остальных случаях значение операции «ложь» (0).
4. Логическое исключающее сложение (логическое исключающее ИЛИ) – логическая операция над двумя операндами, результатом которой является «истина» (1), если только один из двух операндов имеет значение «истина» (1), и ложь (0), если оба операнда имеют значение «ложь» (0) или «истина» (1).
4. Логическое исключающее сложение (логическое исключающее ИЛИ) – логическая операция над двумя операндами, результатом которой является «истина» (1), если только один из двух операндов имеет значение «истина» (1), и ложь (0), если оба операнда имеют значение «ложь» (0) или «истина» (1).