Дайте определение понятия «система программирования». Приведите примеры современных систем программирования

Дайте определение понятиям «программы», «программное обеспечение», «системное программирование».

Программы – это данные, предназначенные для управления кон­кретными компонентами системы обработки ин­формации в целях реализации определённого ал­горитма.

(Программа —совокупность данных и команд, предназначенных для функционирования ЭВМ и других компьютерных устройств с целью получения определённого результата, включая подготовительные материалы, полученные в ходе разработки программы для ЭВМ, и порождаемые ею аудиовизуальные отображения.)

 

Программное обеспечение–все или часть программ, процедур, обработки информации, в основном решает конкретные практические задачи .

Системное программирование - это создание системного программного обеспечения, относятся операционные системы, утилиты, системы программирования, системы управления базами данных.Комплекс программ, которые обеспечивают управление компонентами компьютерной системы, такими как процессор,оперативная память, устройства ввода-вывода, сетевое оборудование, выступая как «межслойный интерфейс», с одной стороны которого аппаратура, а с другой — приложения пользователя. В отличие от прикладного программного обеспечения, системное не решает конкретные практические задачи, а лишь обеспечивает работу других программ, предоставляя им сервисные функции, абстрагирующие детали аппаратной и микропрограммной реализации вычислительной системы, управляет аппаратными ресурсами вычислительной системы.

Перечислите и опишите этапы подготовки программы.

включает этапы подготовки исходного текста, трансляции, компоновки и отладки.

Подготовка текста программы
Текст программы записывается в один или несколько текстовых файлов. Имена файлов могут быть любыми, но для файлов, содержащих текст программы, принято расширение .asm, а для файлов с определением констант и новых типов – расширение .inc. Эти файлы являются текстовыми, их можно подготовить с помощью стандартных редакторов текста или с использованием интегрированных сред разработки программ.
Ассемблирование программы
Подготовленный текст является исходными данными для специальных программ, называемых ассемблерами. Задача ассемблеров – преобразовать текст программы в форму двоичных команд, которые могут быть выполнены микропроцессором. Если обнаружены синтаксические ошибки, то результирующий код создан не будет. Процесс создания исполняемого файла происходит в две стадии:
.asm --> .obj --> .exe/.dll/.com
Компоновка программы
Следующая стадия (.obj --> .exe/.dll/.com) называется линковкой или компоновкой и служит для замещения символьных имен, используемых программистом, на реальные адреса.
Сравните шестнадцатеричное содержимое OBJ и EXE файла, который у вас получился. В EXE-файле присутствует та же последовательность байтов, что и в OBJ-файле. Но помимо этого еще присутствует: имя ассемблированного файла, версия ассемблера, «имя собственное» сегмента и так далее.
Это «служебная» информация, предназначенная для тех случаев, когда ваш исполнимый файл вы хотите собрать из нескольких. При разработке больших приложений исходный текст состоит, как правило, из нескольких модулей (файлов с исходными текстами), потому что хранить все тексты в одном файле неудобно – в них сложно ориентироваться.
Каждый модуль по раздельности компилируется в отдельный файл с объектным кодом. В каждом из этих файлов прописаны свои сегменты кода/данных/стека, которые затем надо объединить в одно целое. А исполнимый файл нам нужно получить только один – с единым сегментом кода/данных/стека. Именно это LINK и делает: завершает определение адресных ссылок и объединяет, если это требуется, несколько программных модулей в один. И этот один у нас и является исполнимым.
Кроме того, к нашим модулям надо добавить машинный код подпрограмм, реализующих различные стандартные функции (например, вычисляющих математические функции SIN или LN). Такие функции содержатся в библиотеках (файлах со стандартным расширением .LIB), которые либо поставляются вместе с компилятором, либо создаются самостоятельно. Поэтому процесс подготовки обязательно включает в себя этап компоновки, когда определяются все неизвестные при раздельном ассемблировании адреса совместно используемых переменных или функций.
Процесс объединения объектных модулей в один файл осуществляется специальной программой-компоновщиком или сборщиком (программа LINK.EXE фирмы Microsoft и TLINK.EXE фирмы Borland), которая выполняет связывание объектных модулей и машинного кода стандартных функций, находя их в библиотеках, и формирует на выходе работоспособное приложение – исполнимый код для конкретной платформы.
Исполнимый код – это законченная программа с расширением COM, DLL или EXE, которую можно запустить на компьютере с установленной операционной системой, для которой эта программа создавалась. Имя исполняемого файла задастся именем первого .OBJ файла. Для линковки нужно в командной строке набрать:
link prog1.obj prog2.obj или tlink prog1.obj prog2.obj
Содержимое объектного файла анализируется компоновщиком. Он определяет, есть ли в программе внешние ссылки, то есть содержит ли программа команды вызовов процедур, находящихся в одной из библиотек объектных модулей (link library). Компоновщик находит эти ссылки в объектном файле, копирует необходимые процедуры из библиотек, объединяет их вместе с объектным файлом и создает исполняемый файл (executable file). В качестве дополнительных возможностей компоновщик может создать файл перекрестных ссылок, содержащих план полученного исполняемого файла.
Загрузка программы
Компонент операционной системы, называемый загрузчиком (loader), считывает данные из исполняемого файла, загружает программу в память и передает управление по адресу точки входа. В результате программа начинает выполняться.
В тех случаях, когда при написании новой программы на языке ассемблера требуются лишь незначительные изменения машинных кодов, иногда быстрее и удобнее внести изменения непосредственно в объектный файл, а не проходить всю цепочку редактирования исходной программы и осуществлять ее повторную трансляцию с внесенными изменениями. Для этого существуют специальные шестнадцатеричные редакторы (типа Hacker Viewer), которые позволяют рассматривать файлы с бинарным (машинным) кодом в виде последовательности ассемблерных команд. Эту же технологию применяют в тех случаях, если исходный текст программы не доступен (взлом программы).

Дайте определение понятия «система программирования». Приведите примеры современных систем программирования.

Система программирования - это программная система, предназначенная для разработки программ на конкретном языке программирования.

C++, C#, Microsoft Visual Basic, Borland Delphi, Pascal идр.

 

4. Перечислите основные типы данных микропроцессора.

С точки зрения размерности микропроцессор аппаратно поддерживает следующие основные типы данных :

•байт — восемь последовательно расположенных битов, пронумерованных от 0 до 7, при этом бит 0 является самым младшим значащим битом;

•слово — последовательность из двух байт, имеющих последовательные адреса. Размер слова — 16 бит; биты в слове нумеруются от 0 до 15. Байт, содержащий нулевой бит, называется младшим байтом, а байт, содержащий 15-й бит - старшим байтом. Микропроцессоры Intel имеют важную особенность — младший байт всегда хранится по меньшему адресу. Адресом слова считается адрес его младшего байта. Адрес старшего байта может быть использован для доступа к старшей половине слова.

•двойное слово — последовательность из четырех байт (32 бита), расположенных по последовательным адресам. Нумерация этих бит производится от 0 до 31. Слово, содержащее нулевой бит, называется младшим словом, а слово, содержащее 31-й бит, - старшим словом. Младшее слово хранится по меньшему адресу. Адресом двойного слова считается адрес его младшего слова. Адрес старшего слова может быть использован для доступа к старшей половине двойного слова.

•учетверенное слово — последовательность из восьми байт (64 бита), расположенных по последовательным адресам. Нумерация бит производится от 0 до 63. Двойное слово, содержащее нулевой бит, называется младшим двойным словом, а двойное слово, содержащее 63-й бит, — старшим двойным словом. Младшее двойное слово хранится по меньшему адресу. Адресом учетверенного слова считается адрес его младшего двойного слова. Адрес старшего двойного слова может быть использован для доступа к старшей половине учетверенного слова.

 

 

5. Опишите данные микропроцессора простого типа с точки зрения их размерностиразрядности.

Целый тип со знаком — двоичное значение со знаком, размером 8, 16 или 32 бита. Знак в этом двоичном числе содержится в 7, 15 или 31-м бите соответственно. Ноль в этих битах в операндах соответствует положительному числу, а единица — отрицательному. Отрицательные числа представляются в дополнительном коде. Числовые диапазоны для этого типа данных следующие:

•8-разрядное целое — от –128 до +127;

•16-разрядное целое — от –32 768 до +32 767;

•32-разрядное целое — от –231 до +231–1.

 

Целый тип без знака — двоичное значение без знака, размером 8, 16 или 32 бита. Числовой диапазон для этого типа следующий:

•байт — от 0 до 255;

•слово — от 0 до 65 535;

•двойное слово — от 0 до 232–1.

 

Указатель на память двух типов:

ближнего типа — 32-разрядный логический адрес, представляющий собой относительное смещение в байтах от начала сегмента. Эти указатели могут также использоваться в сплошной (плоской) модели памяти, где сегментные составляющие одинаковы;

•дальнего типа — 48-разрядный логический адрес, состоящий из двух частей: 16-разрядной сегментной части — селектора, и 32-разрядного смещения.

Цепочка — представляющая собой некоторый непрерывный набор байтов, слов или двойных слов максимальной длины до 4 Гбайт.

Битовое поле представляет собой непрерывную последовательность бит, в которой каждый бит является независимым и может рассматриваться как отдельная переменная. Битовое поле может начинаться с любого бита любого байта и содержать до 32 бит.

Неупакованный двоично-десятичный тип — байтовое представление десятичной цифры от 0 до 9. Неупакованные десятичные числа хранятся как байтовые значения без знака по одной цифре в каждом байте. Значение цифры определяется младшим полубайтом.

Упакованный двоично-десятичный тип представляет собой упакованное представление двух десятичных цифр от 0 до 9 в одном байте. Каждая цифра хранится в своем полубайте. Цифра в старшем полубайте (биты 4–7) является старшей.

 

 

6. Поясните двойственный характер данныхпростого типапри их трактовке микропроцессором на уровне команд с точки зрения физической и логической интерпретации.

  • байт — восемь последовательно расположенных битов, пронумерованных от 0 до 7, при этом бит 0 является самым младшим значащим битом;
  • слово — последовательность из двух байт, имеющих последовательные адреса. Размер слова — 16 бит; биты в слове нумеруются от 0 до 15. Байт, содержащий нулевой бит, называется младшим байтом, а байт, содержащий 15-й бит - старшим байтом. Микропроцессоры Intel имеют важную особенность — младший байт всегда хранится по меньшему адресу. Адресом слова считается адрес его младшего байта. Адрес старшего байта может быть использован для доступа к старшей половине слова.
  • двойное слово — последовательность из четырех байт (32 бита), расположенных по последовательным адресам. Нумерация этих бит производится от 0 до 31. Слово, содержащее нулевой бит, называется младшим словом, а слово, содержащее 31-й бит, - старшим словом. Младшее слово хранится по меньшему адресу. Адресом двойного слова считается адрес его младшего слова. Адрес старшего слова может быть использован для доступа к старшей половине двойного слова.
  • учетверенное слово — последовательность из восьми байт (64 бита), расположенных по последовательным адресам. Нумерация бит производится от 0 до 63. Двойное слово, содержащее нулевой бит, называется младшим двойным словом, а двойное слово, содержащее 63-й бит, — старшим двойным словом. Младшее двойное слово хранится по меньшему адресу. Адресом учетверенного слова считается адрес его младшего двойного слова. Адрес старшего двойного слова может быть использован для доступа к старшей половине учетверенного слова.

 

7. Опишитепорядок размещения данных в памяти для микропроцессоров Intel. Поясните этот порядок на примере

 

Микропроцессоры Intel имеют важную особенность — младший байт всегда хранится по меньшему адресу. Адресом слова считается адрес его младшего байта. Адрес старшего байта может быть использован для доступа к старшей половине слова.

Листинг 1. Пример использования директив резервирования и инициализации данных

masm

model small

.stack 100h

.data

message db 'Запустите эту программу в отладчике’,’$'

perem_1 db 0ffh

perem_2 dw 3a7fh

perem_3 dd 0f54d567ah

mas db 10 dup (' ')

pole_1 db 5 dup (?)

adr dw perem_3

adr_full  dd perem_3

fin db 'Конец сегмента данных программы $'

.code

start:

   mov ax,@data

   mov ds,ax

   mov ah,09h

   mov dx,offset message

   int 21h

   mov ax,4c00h

   int 21h

end start

 

8. Перечислите регистры общего назначения для микропроцессоров Intel. Укажите разрядность перечисленных регистров. Охарактеризуйте каждый регистр с точки зрения его использования и функционального назначения.


Рассматривая этот рисунок, заметьте, что использовать для самостоятельной адресации можно только младшие 16 и 8-битные части этих регистров. Старшие 16 бит этих регистров как самостоятельные объекты недоступны. Это сделано, как мы отметили выше, для совместимости с младшими 16-разрядными моделями микропроцессоров фирмы Intel.

Перечислим регистры, относящиеся к группе регистров общего назначения. Так как эти регистры физически находятся в микропроцессоре внутри арифметико-логического устройства (АЛУ), то их еще называют регистрами АЛУ:

  • eax/ax/ah/al (Accumulator register) — аккумулятор.
    Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно;
  • ebx/bx/bh/bl (Base register) — базовый регистр.
    Применяется для хранения базового адреса некоторого объекта в памяти;
  • ecx/cx/ch/cl (Count register) — регистр-счетчик.
    Применяется в командах, производящих некоторые повторяющиеся действия. Его использование зачастую неявно и скрыто в алгоритме работы соответствующей команды.
    К примеру, команда организации цикла loop кроме передачи управления команде, находящейся по некоторому адресу, анализирует и уменьшает на единицу значение регистраecx/cx;
  • edx/dx/dh/dl (Data register) — регистр данных.
    Так же, как и регистр eax/ax/ah/al, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно.

Следующие два регистра используются для поддержки так называемых цепочечных операций, то есть операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит:

  • esi/si (Source Index register) — индексисточника.
    Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике;
  • edi/di (Destination Index register) — индексприемника (получателя).
    Этот регистр в цепочечных операциях содержит текущий адрес в цепочке-приемнике.

В архитектуре микропроцессора на программно-аппаратном уровне поддерживается такая структура данных, как стек. Для работы со стеком в системе команд микропроцессора есть специальные команды, а в программной модели микропроцессора для этого существуют специальные регистры:

  • esp/sp (Stack Pointer register) — регистр указателястека.
    Содержит указатель вершины стека в текущем сегменте стека.
  • ebp/bp (Base Pointer register) — регистр указателя базы кадра стека.
    Предназначен для организации произвольного доступа к данным внутри стека.

Не спешите пугаться столь жесткого функционального назначения регистров АЛУ. На самом деле, большинство из них могут использоваться при программировании для хранения операндов практически в любых сочетаниях. Но, как мы отметили выше, некоторые команды используют фиксированные регистры для выполнения своих действий. Это нужно обязательно учитывать.
Использование жесткого закрепления регистров для некоторых команд позволяет более компактно кодировать их машинное представление. Знание этих особенностей позволит вам при необходимости хотя бы на несколько байт сэкономить память, занимаемую кодом программы.

 

9. Перечислите сегментные регистры для микропроцессоров Intel. Укажите разрядность перечисленных регистров. Определите функциональное назначение каждого из регистров.

В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs.
Их существование обусловлено спецификой организации и использования оперативной памяти микропроцессорами Intel. Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде трех частей, называемых сегментами. Соответственно, такая организация памяти называется сегментной.

Для того чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени, и предназначены сегментные регистры. Фактически, с небольшой поправкой, как мы увидим далее, в этих регистрах содержатся адреса памяти с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов:

Сегмент кода. Содержит команды программы.
Для доступа к этому сегменту служит регистр cs (code segment register) — сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор (то есть эти команды загружаются в конвейер микропроцессора).

Сегмент данных. Содержит обрабатываемые программой данные.
Для доступа к этому сегменту служит регистр ds (data segment register) — сегментный регистр данных, который хранит адрес сегмента данных текущей программы.

Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком.
Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) — сегментный регистр стека, содержащий адрес сегмента стека.

Дополнительный сегмент данных.
Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в сегментном регистре ds.
Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде.
Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers).

 

10. Опишитерегистр состояния для микропроцессоров Intel с точки зрения его использования и функционального назначения.

В микропроцессор включены несколько регистров (см. рис. 1), которые постоянно содержат информацию о состоянии как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:

  • регистр флагов eflags/flags;
  • регистр указателя команды eip/ip.

Используя эти регистры, можно получать информацию о результатах выполнения команд и влиять на состояние самого микропроцессора. Рассмотрим подробнее назначение и содержимое этих регистров:

eflags/flags (flag register) — регистр флагов. Разрядность eflags/flags — 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для i8086.

сходя из особенностей использования, флаги регистра eflags/flags можно разделить на три группы:

  • 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд.
    Флаги состояниярегистра eflags отражают особенности результата исполнения арифметических или логических операций. Это дает возможность анализировать состояние вычислительного процесса и реагировать на него с помощью команд условных переходов и вызовов подпрограмм. В табл. 1 приведены флаги состояния и указано их назначение;
  • 1 флаг управления. Обозначается df (Directory Flag).
    Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление поэлементной обработки в этих операциях: от начала строки к концу (df = 0) либо наоборот, от конца строки к ее началу (df = 1).
    Для работы с флагом df существуют специальные команды: cld (снять флаг df) и std (установить флаг df).
    Применение этих команд позволяет привести флаг df в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками;
  • 5 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.
    Прикладным программам не рекомендуется модифицировать без необходимости эти флаги, так как в большинстве случаев это приведет к прерыванию работы программы. Втабл. 2 перечислены системные флаги, их назначение.

ip/ip (Instraction Pointer register) — регистр-указатель команд.
Регистр eip/ip имеет разрядность 32/16 бит и содержит смещение следующей подлежащей выполнению команды относительно содержимого сегментного регистра cs в текущем сегменте команд. Этот регистр непосредственно недоступен программисту, но загрузка и изменение его значения производятся различными командами управления, к которым относятся команды условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip.

11. Перечислите этапы создания программы на языке ассемблера. Опишите результат, получаемый на каждом этапе.

Постановка задачи (точное и подробное описание функциональности будущей программы, а также описание всех входных и выходных данных и способа их передачи программе);

Разработка алгоритма программы (построение блок схемы, граф-схемы или текстовое или математическое описание решения);

Формализация алгоритма(запись алгоритма на языке программирования).
Создание текстового файла программы с расширением .asm (например my.asm). Отсутствие среды разработки позволяет программисту самостоятельно выбрать текстовый редактор для написания кода программы. Для этой цели подойдет любой текстовый редактор с нумерацией строк, мы рекомендуем редактор, встроенный в оболочку "FAR Manager".

Компиляция программы;
Компиляция - процесс перевода программы из текстового вида в машинный код. При использовании компилятора фирмы Borland необходимо выполнить:
tasm my.asm
т.е. запускаем компилятор tasm и передаем с командной строки имя файла, содержащего программу. Если программа имеет синтаксические ошибки, компилятор выдаст сообщение об ошибке с указанием номера строки и описанием для каждой ошибки (нужно вернуться на этап №3 и исправить синтаксические ошибки).
В случае успешной компиляции будет создан файл, содержащий объектный код программы my.obj, который ещё не является исполняемым модулем.

Компоновка программы;
Компоновка - создание из файла объектного кода исполняемого модуля.
tlink my.obj
В качестве параметра компоновщик tlink принимает имя файла содержащего объектный код программы (в нашем случае - my.obj). В случае успешной компоновки будет создан исполняемый модуль my.exe

Запуск и тестирование исполняемого модуля программы.
На данном этапе необходимо проверить, соответствует ли написанная программа постановке задачи, сделанной нами на этапе №1. Неправильная работа программы говорит об алгоритмической ошибке (семантическая ошибка), поэтому для успешного её устранения нужно вернуться на этап разработки алгоритма (этап №2).

 

12. Дайте определение понятия «операнд». Приведите классификацию операндов, поддерживаемых транслятором ассемблера

Операнд - это константа, литерал, идентификатор, вызов функции, индексное выражение, выражение выбора элемента или более сложное выражение, сформированное комбинацией операндов, знаков операций и круглых скобок.

Постоянные или непосредственные операнды — число, строка, имя или выражение, имеющие некоторое фиксированное значение. Имя не должно быть перемещаемым, то есть зависеть от адреса загрузки программы в память. К примеру, оно может быть определено операторами equ или =.

Адресные операнды — задают физическое расположение операнда в памяти с помощью указания двух составляющих адреса: сегмента исмещения (рис. 4).

 

Перемещаемые операнды — любые символьные имена, представляющие некоторые адреса памяти. Эти адреса могут обозначать местоположение в памяти некоторых инструкции (если операнд — метка) или данных (если операнд — имя области памяти в сегменте данных).


Перемещаемые операнды отличаются от адресных тем, что они не привязаны к конкретному адресу физической памяти. Сегментная составляющая адреса перемещаемого операнда неизвестна и будет определена после загрузки программы в память для выполнения.

Счетчик адреса — специфический вид операнда. Он обозначается знаком $.


Специфика этого операнда в том, что когда транслятор ассемблера встречает в исходной программе этот символ, то он подставляет вместо него текущее значение счетчика адреса. Значение счетчика адреса, или, как его иногда называют, счетчика размещения, представляет собой смещение текущей машинной команды относительно начала сегмента кода.
В формате листинга счетчику адреса соответствует вторая или третья колонка (в зависимости от того, присутствует или нет в листинге колонка с уровнем вложенности). Если взять в качестве пример любой листинг, то видно, что при обработке транслятором очередной команды ассемблера счетчик адреса увеличивается на длину сформированной машинной команды. Важно правильно понимать этот момент.
К примеру, обработка директив ассемблера не влечет за собой изменения счетчика. Директивы, в отличие от команд ассемблера, — это лишь указания транслятору на выполнение определенных действий по формированию машинного представления программы, и для них транслятором не генерируется никаких конструкций в памяти. В качестве примера использования в команде значения счетчика адреса можно привести следующий:

При использовании подобного выражения для перехода не забывайте о длине самой команды, в которой это выражение используется, так как значение счетчика адреса соответствует смещению в сегменте команд данной, а не следующей за ней команды. В нашем примере команда jmp занимает 2 байта. Но будьте осторожны, длина команды зависит от того, какие в ней используются операнды. Команда с регистровыми операндами будет короче команды, один из операндов которой расположен в памяти. В большинстве случаев эту информацию можно получить, зная формат машинной команды и анализируя колонку листинга с объектным кодом команды.

Регистровый операнд — это просто имя регистра. В программе на ассемблере можно использовать имена всех регистров общего назначения и большинства системных регистров.

Базовый и индексный операнды. Этот тип операндов используется для реализации косвенной базовой, косвенной индексной адресации или их комбинаций и расширений.

Структурные операнды используются для доступа к конкретному элементу сложного типа данных, называемого структурой.

Записи (аналогично структурному типу) используются для доступа к битовому полю некоторой записи.

 

 

13. Перечислите виды адресации операндов в памяти и принципы организации каждого вида адресации. Дайте описание синтаксиса каждого вида адресации. Приведите пример каждого вида адресации.

Команда CLR (очистка) «стирает» операнд, т. е. записывает на его место 0.

Команда INC (инкремент) увеличивает операнд на 1. - Указанные команды относятся к классу однооперандных или одноадресных, так как по своему смыслу они воздействуют только на один операнд. Многие команды должны работать с двумя операндами. Один из них называют источником, другой — прием­ником. Приведем примеры таких команд.

Команда MOV (пересылка) передает операнд-источник по адресу операнда-приемника, например содержимое одного регистра в другой либо содержимое регистра в ячейку памяти. При этом операнд-источник не изменяется.

Команда ADD (сложение) прибавляет операнд-источник к операнду-приемнику и отправляет полученную сумму по адресу операнда-приемника. При этом операнд-источник не изменяется.

Собственно команда (оператор предложения АССЕМБЛЕРа) указывает только характер действия, которое надо выполнить над операндами. Местонахождение операндов (а они могут содержаться либо в РОН, либо в ячейках оперативной памяти) указывается с помощью адреса, входящего в полный код команды.Адрес может задаваться различными способами.

Всего существует 12 различных способов адресации. Первые

восемь из них в процессе обращения к операндам используют РОН с RO no R6. Какой именно регистр использовать для поиска операнда, определяет программист, указывая мнемоническое обозначение выбранного регистра (RO, R1 и т. д.) в программной строке.


^ Адресация через регистры общего назначения RO—R6

Прямая адресация используется в тех случаях, когда операнд, участвующий в заданной операции, находится в одном из регист­ров общего назначения. Мнемоническое обозначение Rn, где п — номер используемого регистра общего назначения.

Примеры команд с использованием прямой адресации:

INC RA2 ; увеличить содержимое R2 на 1

MOV Rl, R3 " ; переслать содержимое R1 в R3.


Задача 5.1. Поменять содержимое регистров RO и R1.

Для решения задачи надо воспользоваться вспомогательным регистром, на­пример R4:

MOV RO, R4

MOV Rl, RO

MOV R4, R1


Задача 5.2 Сложить содержимое регистров R1,R2,R3. Сумму занести в R5:

Проще всего выполнить последовательное сложение прямо в R5.

MOV Rl, R5

ADD R2, R5

ADD R3, R5

Задача 5.3 Увеличить содержимое R1 на два.

INC R1

INC R1


Задача 5.4. Удвоить содержимое RO ADD R0,RO

Косвенная адресация предполагает наличие в регистре адреса операнда, т. е. номера ячейки оперативной памяти (слова или байта), в которой находится операнд. Мнемоническое обозначение (Rn) или @Rn,

В приведенных ниже примерах на косвенную адресацию пред­полагается, что в регистре R2 находится число 1000, а в регистре R3 — число 250:

CLR (R2) ; очистить ячейку с адресом 1000

MOV(R3), (R2) ; перенести содержимое ячейки с адресом

; 250 в ячейку с адресом 1000


Задача 5.5 В регистре RO находится адрес начала массива, а в регистре

R1- номер нужного элемента. Увеличить этот элемент массива на еденицу.

Поскольку порядковые номера присваиваются байтам, а каждое слово содер-жит два байта, адреса слов увеличиваются через 2. При этом 0-й элемент от начала массива имеет смещение 0, 1-й элемент — смещение 2, 2-й элемент смещение 4 и т д. Поэтому для вычесления смещения порядковый номер элемента надо умножить на 2, что можно сделать, сложив содержимое регистра R1 с самим собой. При этом предпологается, что элементы массива нумеруются от нуля:

ADD Rl, Rl ; вычисление смещения

ADD Rl, RO ; вычисление адреса

INC (RO) ; инкремент элемента

При автоинкрементной адресации, как и при косвенной, в ре­гистре находится адрес операнда. Сам операнд хранится в опера­тивной памяти. Отличие от косвенной адресации заключается в том, что после выполнения заданной операции содержимое регистра (т. е. адрес операнда) автоматически увеличивается на 2, если использовалась команда обращения к слову, и на 1, если исполь­зовалась команда работы с байтом (команды с побайтовой адре­сацией будут рассмотрены ниже). Мнемоническое обозначение (Rn)+.

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

Пример на автоинкрементную адресацию (в R1 находится число 1000):

CLR (Rl)+ ; очистить слово с адресом 1000. После выпол-

; нения команды в регистре R1 адрес 1002

Задача 5.6. Очистить три последовательные ячейки памяти. Адрес первой находится в R1:

CLR (Rl)+

CLR (Rl)+

CLR (Rl)

При автодекрементной адресации, как и при автоинкрементной, в регистре находится адрес. Однако изменяется этот адрес не после, а до выполнения операции, при этом адрес не увеличивается, а уменьшается на 2 или 1 в зависимости от типа команды (обращение к слову или байту). Мнемоническое обозначение —(Rn). Пример на автодекрементную адресацию (в R1 находится число 166):

INC—(R1) - увеличить на единицу содержимое ячейки с адресом 164. После выполнения команды в регистре R1 адрес 164


^ Автоинкрементную косвенную адресацию можно назвать двой­ной косвенной, поскольку в регистре указывается адрес ячейки, в которой, в свою очередь, записан адрес ячейки с операндом. Инкрементность адресации заключается в том, что после выполнения команды содержимое регистра увеличивается на 2. Мнемоническое обозначение @(Rn)+.

Рассмотрим действие автоинкрементной косвенной адресации (рис. 5.5). Пусть в регистре R2 содержится число 102. Оно рассмат­ривается как адрес ячейки памяти, однако по адресу 102 располо­жен не операнд, а адрес операнда. Если в ячейке с адресом 102 содержится число 200, то операнд находится по адресу 200. После выполнения команды содержимое R2 увеличится на 2 и станет равным 104 (ожидается, что по адресу 104 находится следующий операнд или его адрес).

Пример на автоинкрементную косвенную адресацию (содер­жимое регистров и ячеек взято из рис. 5. 5):

CLR@(R2)+ - очищается ячейка с адресом 200

Важность автоинкрементной косвенной адресации определяется тем, что во многих случаях в программах удобно работать с массивами адресов (числа 400, 200 и 260 на рис. 5.5). Автоинкре­ментная косвенная адресация дает удобную возможность работы с операндами, если их адреса расположены в последовательных ячейках.

^ Автодекрементная косвенная адресация действует в принципе так же, как и предыдущая, с той разницей, что еще перед выполне­нием команды адрес в регистре уменьшается на два, и по этому модифицированному адресу выбирается адрес операнда. Мнемони­ческое обозначение @ — (Rn).



Рис. 5.5 Действие автоинкрементной Рис.5.6 Действие индексной адресации.

косвенной адресации.


Пример команды для содержимого регистров и ячеек из рис. 5.5:

CLR@ — (R2) ; очистка ячейки по адресу 400

Индексная адресация используется прежде всего для работы с массивами операндов. Мнемоническое обозначение -E(Rn), где Е — выражение (подробнее о выражениях см. § 5.4). Чаще всего Е представляет собой символическое обозначение метки. Адрес операнда определяется как сумма содержимого регистра Rn и значения Е.

Пусть метка МА относится к началу массива данных (рис. 5.6). Тогда следующие за МА слова имеют адреса МА+2, МА+4, МА+6 и т. д. Если заносить в какой-либо из регистров общего назначения этот «добавок» к значению МА и использовать этот регистр для индексной адресации, то можно будет обращаться к любым элементам массива. Если (как это показано на рис. 5.6) в R5 находится число 4, то команда CLR MA(R5) очистит ячейку с адресом МА+4.

Полный код команды, использующей индексную адресацию, тре­бует не одного, как это было до сих пор, а двух слов памяти. В первом слове находится собственно код команды, а во второе слово заносится (в процессе трансляции) значение выражения Е. Таким образом, при использовании индексной адресации опера­тивная память расходуется менее экономно, чем в предыдущих случаях.


Задача 5.7 Увеличить на еденицу все элементы массива из 100 слов, начинающихся с метки ММ.

CLR R2 ;подготовка (очистка) индексного регистра

PP: INC MM(R2) ; содержательная строка цикла

INC R2 ; изменение

INC R2 ;индекса элемента

; переход на метку PP, если содержимое R2 < 200

В рассмотренных примерах использованная метка характеризо­вала адрес начала массива («базовый» адрес), а в регистре нахо­дилось смещение относительно этой базы. Иногда удобно хранить базовый адрес в регистре. Тогда в символическом обозначении команды используют не метку, а абсолютное значение смещения.

Если, например, в регистр R2 помещен адрес 164000, то команда CLR(R2) очистит слово с адресом 164000, команда INC 2(R2) до­бавит единицу к содержимому слова с адресом 164002, а команда CLR 4(R2) очистит слово с адресом 164004.

I ^ Индексную косвенную адресацию можно использовать, наприvep, для работы с массивами адресов. Мнемоническое обозначение @E(Rn). Здесь адрес вычисляется так же, как и в предыдущем случае (сумма значения Е и содержимого регистра), но это не адрес операнда,а адрес адреса операнда. Команда занимает в па­мяти два слова; во втором слове хранится значение Е.


^ Адресация через счетчик команд

Рассмотрим теперь оставшиеся четыре способа адресации. Все они используют для поиска операнда счетчик команд R7, что дает новые очень полезные возможности. При этом программисту в большинстве случаев важно понимать только конечный результат, к которому приводит применение этих способов адресации. Роль счетчика команд и механизм адресации с его помощью можно отнести к несущественным тонкостям работы процессора.

^ Непосредственная адресация предназначена для работы с опе­рандом, входящим непосредственно в символическую запись ко­манды. Мнемоническое обозначение #Е, где Е — выражение, являющееся операндом. Чаще всего Е представляет собой просто число или символическое обозначение метки. В последнем случае опе­рандом является значение этой метки, т. е. адрес соответствующей ячейки. Команда занимает два слова. В первом содержится код Команды, во втором — операнд. Примеры команд:

MOV #15,R3 ;загрузка числа 15 в R3

MOV #PARM,R2 ; загрузка адреса PARM в R2


Задача 5.8 Метка SPECTR характеризует начало массива. Определить адрес 126-го элементаи занести его в R0.

Воспользуемся регистром R0 для определения смещения относительно начала массива, а затем для нахождения адреса искомого элемента, определяемого суммой смещения и базового адреса, т. е. Значения метки SPECTR:

MOV #126, RO ; в R0-адрес элемента

ADD R0,R0 ; в R0- смещение к элементу

ADD #SPECTR,R0 ; прибавить к смещению базовый адрес


^ Абсолютная адресация используется для обращения по адресам, значения которых фиксированы и известны заранее. Чаще всего это адреса ячеек системных областей памяти и регистров внешних устройств. Мнемоническое обозначение @#Е, где Е — выражение, вычисление которого дает абсолютный адрес. Команда занимает два слова памяти. Во второе слово транслятором заносится ука­занный в команде абсолютный адрес.

Пример команды:

MOV @#52, R3 ; переслать в R3 содержимое ячейки

; с абсолютным адресом 52

^ Относительная адресация позволяет обращаться к ячейкам по присвоенным им меткам. Мнемоническое обозначение Е. Значение выражения Е является адресом операнда. Команда занимает два слова памяти, при этом во втором слове записывается смещение к указанному в команде адресу. Это смещение вычисляется относи­тельно адреса следующей команды.

Задача 5.9 Поменять местами содержимое ячеек X,Y:

MOV X, RO

MOV Y..X

MOV RO, Y


^ Относительная косвенная адресация является косвенной по отношению к предыдущей. Структура кода команды и метод вычис­ления адреса такие же, но полученный адрес есть не адрес операн­да, а адрес адреса операнда. Мнемоническое обозначение @Е.

Пример:

CLR @LL ; очистка ячейки, адрес которой находится в ячейке

; с меткой LL

В табл. П5 и П6 сведены все способы адресации вместе с мнемоникой и кратким описанием.

 

14. Дайте определение понятия «директива» в ассемблере.Перечислите директивы резервирования и инициализации данных простого типа. Охарактеризуйте каждый тип с точки зрения формата представления и диапазона принимаемых значений. Приведите примеры использования директиврезервирования и инициализации данных.

Директивы - параметры (ключевые слова) в тексте программы на языке ассемблера, влияющие на процесс ассемблирования или свойства выходного файла.

 

Директивы резервирования и инициализации данных простых типов:

 

•db — резервирование памяти для данных размером 1 байт.

•dw — резервирование памяти для данных размером 2 байта.

•dd — резервирование памяти для данных размером 4 байта.

•df — резервирование памяти для данных размером 6 байт;

•dp — резервирование памяти для данных размером 6 байт.

•dq — резервирование памяти для данных размером 8 байт.

•dt — резервирование памяти для данных размером 10 байт.

 

Формат этих директив :

[<имя >] Dx <выражение>

Выражение может быть

1) константой, Perem1 DB 100

2)последовательностью констант

Massiv DW 0,0,0,0,0 ; 5 элементов. Каждый по 2 б.

3) цепочкой символов, закл. в кавычки

Message DB ‘ Результат выполнения программы - ‘

4) символическим именем (из поля <имя> этой или другой директивы)

Когда транслятор встречает директивы описания памяти с подобными операндами, то он формирует в памяти значения адресов тех переменных, чьи имена были указаны в качестве операндов. В зависимости от директивы, применяемой для получения такого адреса, формируется либо полный адрес (директива dd) в виде двух байтов сегментного адреса и двух байтов смещения, либо только смещение (директива dw).

perem2 dd 0f54d567ah

adr dw perem2

adr_full dd perem2

5) вопросительным знаком ? например, Pole db ?

Означает резервирование памяти без инициализации (присвоения нач. знач.)

Замеч. В памяти этот байт будет 00h.

6) Для повторения операндов можно использовать директиву DUP

(duplicate - повторять, дублировать)

Massiv1 dw 5 DUP (0)

Massiv2 db 10 DUP(0), 10 DUP (1)

Massiv3 db 3 DUP(0), 1,1

Massiv4 db 100 DUP(?)

Stroka db 10 DUP(‘ ‘)

 

В сегменте данных наряду с директивами резервирования и инициализации данных могут использоватьсяпсевдооператоры EQU и = (директивы определения идентификаторов). Их можно отнести к простейшим макросредствам ассемблера.

С их помощью можно определять символические имена или идентификаторы часто используемых выражений. В ходе трансляции вместо этих имен макроассемблер подставит соответствующие значения. В случае необходимости это позволяет вносить в программу минимум изменений.

Синтаксис псевдооператора EQU (equete -приравнивать).

<имя> EQU <строка или числовое выражение>

Синтаксис псевдооператора =

<имя> = <числовое выражение>

Отличия псевдооператоров:

1. С помощью EQU имени можно ставить в соответствие как числовые выражения, так и текстовые строки, а псевдооператор = может использоваться только с числовыми выражениями.

2. Идентификаторы, определенные с помощью =, можно переопределять в тексте программы, а определенные с помощью EQU - нельзя.

Замечание. Чтобы строка воспринималась как текстовая, а не как выражение, ее необходимо заключить в угловые скобки <строка> . В режиме Ideal строка для EQU всегда трактуется как текстовая.

 

Size equ 10

Ak equ ax ; переименовали регистр

length = 50

time = 24

time = time-2

 

Совет!! Псевдооператор = удобно использовать для определения простых абсолютных (т.е. не зависящих от места загрузки программы в память) математических выражений.

Например, adr1 db 10 dup (0)

adr2 db 1

dlina adr2-adr1

 

 

15. Дайте определения понятий «адрес» и «указатель» с точки зрения программы на ассемблере. Приведите примеры использования директив и команд работы с «адресами» и «указателями».

 

 

16. Дайте определение понятия «стек». Перечислите команды работы со стеком. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры использования команд работы со стеком.

Стек - это структура данных, которая используется для временного
хранения информации. Программа может поместить данные в стек
(PUSH) или забрать их оттуда (POP).

Алгоритм работы:

  • уменьшить значение указателя стека esp/sp на 4/2 (в зависимости от значения атрибута размера адреса — use16 или use32);
  • записать источник в вершину стека (адресуемую парой ss:esp/sp).

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:
Команда push используется совместно с командой pop для записи значений в стек и извлечения их из стека. Размер записываемых значений — слово или двойное слово. Также в стек можно записывать непосредственные значения. Заметьте, что в отличие от команды pop в стек можно включать значение сегментного регистра cs. Другой интересный момент связан с регистром sp. Команда push esp/sp записывает в стек значение esp/sp по состоянию до выдачи этой команды. В микропроцессоре i8086 по этой команде записывалось скорректированное значение sp. При записи в стек 8-битных значений для них все равно выделяется слово или двойное слово (в зависимости от use16 или use32).

my_proc proc near push ax push bx;тело процедуры, в которой изменяется содержимое;регистров ax и bx... pop bx pop ax ret endp

Алгоритм работы команды зависит от установленного атрибута размера адреса — use16 или use32:

  • загрузить в приемник содержимое вершины стека (адресуется парой ss:esp/sp);
  • увеличить содержимое esp/sp на 4 (2 байта) для use32 (соответственно для use16).

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:
Команда применяется для восстановления содержимого вершины стека в регистр, ячейку памяти или сегментный регистр. Заметим, что недопустимо восстановление значения в сегментный регистр cs.

my_proc proc near push ax push bx;тело процедуры, в которой изменяется содержимое;регистров ax и bx... pop bx pop ax ret endp

 

 

17. Перечислите команды сложения и вычитания двоичных чисел. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры сложения и вычитания двоичных чисел.

ADD

(ADDition)

Сложение

 

Схема команды: add приемник,источник

Назначение: сложение двух операндов источник и приемник размерностью байт, слово или двойное слово.

Синтаксис
Алгоритм работы:

  • сложить операнды источник и приемник;
  • записать результат сложения в приемник;
  • установить флаги.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r r r r

Применение:
Команда add используется для сложения двух целочисленных операндов. Результат сложения помещается по адресу первого операнда. Если результат сложения выходит за границы операнда приемник (возникает переполнение), то учесть эту ситуацию следует путем анализа флага cf и последующего возможного применения команды adc. Например, сложим значения в регистре ax и области памяти ch. При сложении следует учесть возможность переполнения.

chiclo dw 2015rez dd 0... add ax,chislo ;(ax)=(ax)+ch mov word ptr rez,ax jnc dop_sum ;переход, если результат не вышел за разрядную сетку adc word ptr rez+2,0 ;расширить результат, для учета переноса ;в старший разрядdop_sum:...

Addition with Carry)

Сложение с переносом

 

Схема команды: adc приемник,источник

Назначение: сложение двух операндов с учетом переноса из младшего разряда.

Синтаксис
Алгоритм работы:

  • сложить два операнда;
  • поместить результат в первый операнд: приемник=приемник+источник;
  • в зависимости от результата установить флаги.

Состояние флагов после выполнения команды:

11 07 06 04 02 02
OF SF ZF AF PF CF
r r r r r r

Применение:
Команда adc используется при сложении длинных двоичных чисел. Ее можно использовать как самостоятельно, так и совместно с командой add. При совместном использовании команды adc с командой add сложение младших байтов/слов/двойных слов осуществляется командой add, а уже старшие байты/слова/двойные слова складываются командой adc, учитывающей переносы из младших разрядов в старшие. Таким образом, команда adc значительно расширяет диапазон значений складываемых чисел. В приложении 7 приведен пример программы сложения двоичных чисел произвольной размерности.

.datasl1 dd 01fe544fhsl2 dd 005044cdhelderREZ db 0 ;для учета переноса из старшего разряда результатаrez dd 0.code... mov ax,sl1 add ax,sl2 ;сложение младших слов слагаемых mov rez,ax mov ax,sl+2 adc ax,sl2+2 ;сложение старших слов слагаемых плюс cf mov rez+2,ax adc elderREZ,0 ;учесть возможный перенос

INC

(INCrement operand by 1)

Увеличить операнд на 1

 

Схема команды: inc операнд

Назначение: увеличение значения операнда в памяти или регистре на 1.

Синтаксис
Алгоритм работы:
команда увеличивает операнд на единицу.
Состояние флагов после выполнения команды:

11 07 06 04 02
OF SF ZF AF PF
r r r r r

Применение:
Команда используется для увеличения значения байта, слова, двойного слова в памяти или регистре на единицу. При этом команда не воздействует на флаг cf.

inc ax ;увеличить значение в ax на 1

SUB

(SUBtract)

Вычитание

 

Схема команды: sub операнд_1,операнд_2

Назначение: целочисленное вычитание.

Синтаксис
Алгоритм работы:

  • выполнить вычитание операнд_1=операнд_2-операнд_1;
  • установить флаги.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r r r r

Применение:
Команда sub используется для выполнения вычитания целочисленных операндов или для вычитания младших частей значений многобайтных операндов.

;выполнить вычитание 64-битных значений: vich_1-vich_2vich_1 dd 2 dup (0)vich_2 dd 2 dup (0)rez dd 2 dup (0)...;ввести значения в поля vich_1 и vich_2:;младший байт по младшему адресу... mov eax,vich_1 sub eax,vich_2 ;вычесть младшие половинки чисел mov rez,eax ;младшая часть результата mov eax,vich_1+4 sbb eax,vich_2+4 ;вычесть старшие половинки чисел mov rez+4,eax ;старшая часть результата

МSBB

(SuBtract with Borrow)

Вычитание с заемом

 

Схема команды: sbb операнд_1,операнд_2

Назначение: целочисленное вычитание с учетом результата предыдущего вычитания командами sbb и sub (по состоянию флага переноса cf).

Синтаксис
Алгоритм работы:

  • выполнить сложение операнд_2=операнд_2+(cf);
  • выполнить вычитание операнд_1=операнд_1-операнд_2;

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r r r r

Применение:
Команда sbb используется для выполнения вычитания старших частей значений многобайтных операндов с учетом возможного предыдущего заема при вычитании младших частей значений этих операндов.

;выполнить вычитание 64-битных значений: vich_1-vich_2vich_1 dd 2 dup (0)vich_2 dd 2 dup (0)rez dd 2 dup (0)...;ввести значения в поля vich_1 и vich_2:;младший байт по младшему адресу... mov eax,vich_1 sub eax,vich_2 ;вычесть младшие половинки чисел mov rez,eax ;младшая часть результата mov eax,vich_1+4 sbb eax,vich_2+4 ;вычесть старшие половинки чисел mov rez+4,eax ;старшая часть результата

DEC

(DECrement operand by 1)

Уменьшение операнда на единицу

 

Схема команды: dec операнд

Назначение: уменьшение значения операнда в памяти или регистре на 1.

Синтаксис
Алгоритм работы:
команда вычитает 1 из операнда. Состояние флагов после выполнения команды:

11 07 06 04 02
OF SF ZF AF PF
r r r r r

Применение:
Команда dec используется для уменьшения значения байта, слова, двойного слова в памяти или регистре на единицу. При этом заметьте то, что команда не воздействует на флаг cf.

mov al,9... dec al ;al=8

См. также: урок 8 и команды inc, sub

 

18. Перечислите команды умножения двоичных чисел. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры умножения двоичных чисел.

 

IMUL

(Integer MULtiply)

Умножение целочисленное со знаком

 

Схема команды: imul множитель_1 imul множ_1,множ_2 imul рез-т,множ_1,множ_2

Назначение: операция умножения двух целочисленных двоичных значений со знаком.

Синтаксис
Алгоритм работы:
Алгоритм работы команды зависит от используемой формы команды. Форма команды с одним операндом требует явного указания местоположения только одного сомножителя, который может быть расположен в ячейке памяти или регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:

  • если операнд, указанный в команде, — байт, то второй сомножитель располагается в al;
  • если операнд, указанный в команде, — слово, то второй сомножитель располагается в ax;
  • если операнд, указанный в команде, — двойное слово, то второй сомножитель располагается в eax.

Результат умножения для команды с одним операндом также помещается в строго определенное место, определяемое размером сомножителей:

  • при умножении байтов результат помещается в ax;
  • при умножении слов результат помещается в пару dx:ax;
  • при умножении двойных слов результат помещается в пару edx:eax.

Команды с двумя и тремя операндами однозначно определяют расположение результата и сомножителей следующим образом:

  • в команде с двумя операндами первый операнд определяет местоположение первого сомножителя. На его место впоследствии будет записан результат. Второй операнд определяет местоположение второго сомножителя;
  • в команде с тремя операндами первый операнд определяет местоположение результата, второй операнд — местоположение первого сомножителя, третий операнд может быть непосредственно заданным значением размером в байт, слово или двойное слово.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r ? ? ? ? r

Команда imul устанавливает в ноль флаги of и cf, если размер результата соответствует регистру назначения. Если эти флаги отличны от нуля, то это означает, что результат слишком велик для отведенных ему регистром назначения рамок и необходимо указать больший по размеру регистр для успешного завершения данной операции умножения. Конкретными условиями сброса флагов of и cf в ноль являются следующие условия:

  • для однооперандной формы команды imul регистры ax/dx/edx являются знаковыми расширениями регистров al/ax/eax;
  • для двухоперандной формы команды imul для размещения результата умножения достаточно размерности указанных регистров назначения r16/r32;
  • то же для трехоперандной команды умножения.

Применение:
Команда выполняет целочисленное умножение операндов с учетом их знаковых разрядов. Для выполнения этой операции необходимо наличие двух сомножителей. Размещение и задание их местоположения в команде зависит от формы применяемой команды умножения, которая, в свою очередь, определяется моделью микропроцессора. Так, для микропроцессора i8086 возможна только однооперандная форма команды, для последующих моделей микропроцессоров дополнительно можно использовать двух- и трехоперандные формы этой команды.

.486... mov bx,186 imul eax,bx,8;если результату не хватило размерности операнда1,;то перейдем на m1, где скорректируем ситуацию: jc m1

MUL

(MULtiply)

Умножение целочисленное без учета знака

 

Схема команды: mul множитель_1

Назначение: операция умножения двух целых чисел без учета знака.

Синтаксис
Алгоритм работы:
Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя, который может быть расположен в памяти или в регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:

  • если операнд, указанный в команде — байт, то второй сомножитель должен располагаться в al;
  • если операнд, указанный в команде — слово, то второй сомножитель должен располагаться в ax;
  • если операнд, указанный в команде — двойное слово, то второй сомножитель должен располагаться в eax.

Результат умножения помещается также в фиксированное место, определяемое размером сомножителей:

  • при умножении байтов результат помещается в ax;
  • при умножении слов результат помещается в пару dx:ax;
  • при умножении двойных слов результат помещается в пару edx:eax.

Состояние флагов после выполнения команды (если старшая половина результата нулевая):

11 07 06 04 02 00
OF SF ZF AF PF CF
0 ? ? ? ? 0

Состояние флагов после выполнения команды (если старшая половина результата ненулевая):

11 07 06 04 02 00
OF SF ZF AF PF CF
1 ? ? ? ? 1

Применение:
Команда mul выполняет целочисленное умножение операндов без учета их знаковых разрядов. Для этой операции необходимо наличие двух операндов-сомножителей, размещение одного из которых фиксировано, а другого задается операндом в команде. Контролировать размер результата удобно используя флаги cf и of.

mn_1 db 15mn_2 db 25... mov al,mn_1 mul mn_2

 

19. Перечислите команды деления двоичных чисел. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите пример деления двоичных чисел.

DIV

(DIVide unsigned)

Деление беззнаковое

 

Схема команды: div делитель

Назначение: выполнение операции деления двух двоичных беззнаковых значений.

Синтаксис
Алгоритм работы:
Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно и размер его зависит от размера делителя, который указывается в команде:

  • если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;
  • если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;
  • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
? ? ? ? ? ?

Применение:
Команда выполняет целочисленное деление операндов с выдачей результата деления в виде частного и остатка от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.

mov ax,10234 mov bl,154 div bl ;ah=остаток, al=частное

IDIV

(Integer DIVide)

Деление целочисленное со знаком

 

Схема команды: idiv делитель

Назначение: операция деления двух двоичных значений со знаком.

Синтаксис
Алгоритм работы:
Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, местонахождение которого указывается в команде:

  • если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;
  • если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;
  • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx;

Остаток всегда имеет знак делимого. Знак частного зависит от состояния знаковых битов (старших разрядов) делимого и делителя.
Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
? ? ? ? ? ?

Применение:
Команда выполняет целочисленное деление операндов с учетом их знаковых разрядов. Результатом деления являются частное и остаток от деления. При выполнении операции деления возможно возникновение исключительной ситуации: 0 — ошибка деления. Эта ситуация возникает в одном из двух случаев: делитель равен 0 или частное слишком велико для его размещения в регистре eax/ax/al.

;деление слов mov ax,1045 ;делимое mov bx,587 ;делитель cwd ;расширение делимого dx:ax idiv bx ;частное в ax, остаток в dx

 

20. Команда сравнениядвух операндов. Опишите синтаксис и алгоритм ее работы.

CMP

(CoMPare operands)

Сравнение операндов

 

Схема команды: cmp операнд1,операнд2

Назначение: сравнение двух операндов.

Синтаксис
Алгоритм работы:

  • выполнить вычитание (операнд1-операнд2);
  • в зависимости от результата установить флаги, операнд1 и операнд2 не изменять (то есть результат не запоминать).

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r r r r

Применение:
Данная команда используется для сравнения двух операндов методом вычитания, при этом операнды не изменяются. По результатам выполнения команды устанавливаются флаги. Команда cmp применяется с командами условного перехода и командой установки байта по значению setcc.

len equ 10... cmp ax,len jne m1 ;переход если (ax)<>len jmp m2 ;переход если (ax)=len

 

21. Перечислите команды преобразования типа,опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры использованиякоманд преобразования типа.

CBW/CWDE

(Convert Byte to Word/Convert Word to Double Word Extended)

Преобразование байта в слово/слова в двойное слово

 

Схема команды: cbw cwde

Назначение: расширение операнда со знаком.

Синтаксис
Алгоритм работы:
cbw — при работе команда использует только регистры al и ax:

  • анализ знакового бита регистра al:
    • если знаковый бит al=0, то ah=00h;
    • если знаковый бит al=1, то ah=0ffh.

cwde — при работе команда использует только регистры ax и eax:

  • анализ знакового бита регистра ax:
    • если знаковый бит ax=0, то установить старшее слово eax=0000h;
    • если знаковый бит ax=1, то установить старшее слово eax=0ffffh.

Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

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

.386 ;только для cwde, cwd была для i8086 mov ebx,10fecd23h mov ax,-3 ;ax=1111 1111 1111 1101 cwde ;eax=1111 1111 1111 1111 1111 1111 1111 1101 add eax,ebx

CDQ

(Convert Double word to Quad word)

Преобразование двойного слова в учетверенное слово

 

Схема команды: cdq

Назначение: расширение двойного слова со знаком до размера учетверенного слова (64 бита) со знаком.

Синтаксис
Алгоритм работы:
копирование значения старшего бита регистра eax на все биты регистра edx. Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:
Команду cdq можно использовать для распространения значения знакового бита в регистре eax на все биты регистра edx. Данную операцию, в частности, можно использовать для подготовки к операции деления, для которой размер делимого должен быть в два раза больше размера делителя.

.386delimoe dd ...delitel dd ...... mov eax,delimoe cdq idiv delitel ;частное в eax, остаток в edx

 

22. Укажите различие и формат представления упакованных и неупакованных двоично-десятичных чисел.

Суть двоично-десятичных двоичных чисел заключается в том, что на запись каждой цифры отводится 4 младших бита, а 4 старших бита отводятся под запись ANSII кода. Например, десятичное число 31110 будет записано в двоичной системе счисления в двоичном коде как 111100110000110, а в двоично-десятичном коде как 00000011 00000001 00000001 00000001 00000000, то есть на каждое число отводится по 4 младших бита, либо в формате ANSII 00110011 00110001 00110001 00110001 00110000 значения величин в формате слова и двойного слова имеют ограниченный диапазон.Если программа предназначена для работы в области финансов, то ограничение суммы в рублях величиной 65 536 (для слова) или даже 4 294 967 296 (для двойного слова) будет существенно сужать сферу ее применения, данную проблему решают подобные числа, они не ограничивают размер данных, хотя и приходится тратить больше памяти на хранение чисел

Преимущества

• Упрощён вывод чисел на индикацию — вместо последовательного деления на 10 требуется просто вывести на индикацию каждый полубайт. Аналогично, проще ввод данных с цифровой клавиатуры.

• Для дробных чисел (как с фиксированной, так и с плавающей запятой) при переводе в человекочитаемый десятичный формат и наоборот не теряется точность.

• Упрощены умножение и деление на 10, а также округление. По этим причинам двоично-десятичный формат применяется в калькуляторах — калькулятор в простейших арифметических операциях должен выводить в точности такой же результат, какой подсчитает человек на бумаге.

Недостатки

• Усложнены арифметические операции.

• Требует больше памяти.

• В двоично-десятичном коде 8421-BCD существуют запрещённые комбинации битов: Запрещённые в 8421-BCD битовые комбинации

1010 1011 1100

1101 1110 1111

 

23. Перечислите логические команды языка ассемблер. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры использования логических команд.

Логическое включающее ИЛИ

 

Схема команды: or приемник,маска

Назначение: операция логического ИЛИ над битами операнда назначения.

Синтаксис
Алгоритм работы:

  • выполнить операцию логического ИЛИ над битами операнда назначения, используя в качестве маски второй операнд — маска. При этом бит результата равен 0, если соответствующие биты операндов маска и назначения равны 0, в противном случае бит равен 1;
  • записать результат операции в источник (операнд маска остается неизменным);
  • установить флаги.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
0 r r ? r 0

Применение:
Команду or можно использовать для работы с операндами на уровне битов. Типичное использование команды — установка определенных разрядов первого операнда в единицу.

mov al,01h or bl,al ;установить нулевой бит в 1

AND

(logical AND)

Логическое И

 

Схема команды: and приемник,источник

Назначение: операция логического умножения для операндов приемник и источник размерностью байт, слово или двойное слово.

Синтаксис
Алгоритм работы:

  • выполнить операцию логического умножения над операндами источник и приемник: каждый бит результата равен 1, если соответствующие биты операндов равны 1, в остальных случаях бит результата равен 0;
  • записать результат операции в приемник;
  • установить флаги.

Состояние флагов после выполнения команды:

11 07 06 02 00
OF SF ZF PF CF
0 r r r 0

Применение:
Команда and используется для логического умножения двух операндов. Результат операции помещается по адресу первого операнда. Эту команду удобно использовать для принудительной установки или сброса определенных битов операнда.
Например, преобразуем двузначное упакованное BCD-число в его символьный эквивалент.

u_BCD db 25h ;упакованное BCD-числоs_ch dw 0 ;место для результата... xor ax,ax ;очистка ax mov al,u_BCD shl ax,4 ;ax=0250 mov al,u_BCD ;ax=0225;преобразование в символьное представление: and ax,3f3fh ;ax=3235h mov s_ch,ax

XOR

Логическое исключающее ИЛИ

ASCII-коррекция после сложения

 

Схема команды: xor приемник,источник

Назначение: операция логического исключающего ИЛИ над двумя операндами размерностью байт, слово или двойное слово.

Синтаксис
Алгоритм работы:

  • выполнить операцию логического исключающего ИЛИ над операндами: бит результата равен 1, если значения соответствующих битов операндов различны, в остальных случаях бит результата равен 0;
  • записать результат сложения в приемник;
  • установить флаги.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
0 r r ? r 0

Применение:
Команда xor используется для выполнения операции логического исключающего ИЛИ двух операндов. Результат операции помещается в первый операнд. Эту операцию удобно использовать для инвертирования или сравнения определенных битов операндов.

;изменить значение бита 0 регистра al на обратное xor al,01h

SHR

Сдвиг логический операнда вправо

ASCII-коррекция после сложения

 

Схема команды: shr операнд,кол-во_сдвигов

Назначение: логический сдвиг операнда вправо.

Синтаксис
Алгоритм работы:

  • сдвиг всех битов операнда вправо на один разряд; при этом выдвигаемый справа бит становится значением флага переноса cf;
  • одновременно слева в операнд вдвигается нулевой бит;
  • указанные выше два действия повторяются количество раз, равное значению второго операнда.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
?r r r ? r r

Применение:
Команда shr используется для логического сдвига разрядов операнда вправо. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество_разрядов. В отличие от других команд сдвига, флаг of всегда сбрасывается в ноль в операциях сдвига на один разряд.
Команду shr можно использовать для деления целочисленных операндов без знака на степени 2.

mov cl,4 shr eax,cl ;(eax) разделить на 2 в степени 4

rcr, rcl, ror, rol, sal, shl, sar

24. Перечислите команды обработки бит. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры использования команд работы с битами.

 

25. Перечислите команды линейного сдвига. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры использования команд линейного сдвига.

 

SHL

(SHift logical Left)

Сдвиг логический операнда влево

 

Схема команды: shl операнд,количество_сдвигов

Назначение: логический сдвиг операнда влево.

Синтаксис
Алгоритм работы:

  • сдвиг всех битов операнда влево на один разряд, при этом выдвигаемый слева бит становится значением флага переноса cf;
  • одновременно слева в операнд вдвигается нулевой бит;
  • указанные выше два действия повторяются количество раз, равное значению второго операнда.

Состояние флагов после выполнения команды:

11 00
OF CF
?r r

Применение:
Команда shl используется для сдвига разрядов операнда влево. Ее машинный код идентичен коду sal, поэтому вся информация, приведенная для sal, относится и к команде shl. Команда shl используется для сдвига разрядов операнда влево. Так же, как и для других сдвигов, значение второго операнда (счетчикк сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество_разрядов. Аналогично другим командам сдвига сохраняется эффект, связанный с поведением флага of, значение которого имеет смысл только в операциях сдвига на один разряд:

  • если of=1, то текущее значение флага cf и выдвигаемого слева бита операнда различны;
  • если of=0, то текущее значение флага cf и выдвигаемого слева бита операнда совпадают.

Этот эффект, как вы помните, обусловлен тем, что флаг of устанавливается в единицу всякий раз при изменении знакового разряда операнда.
Команду shl удобно использовать для умножения целочисленных операндов без знака на степени 2. Кстати сказать, это самый быстрый способ умножения; умножить содержимое ax на 16 (2 в степени 4).

mov ax,17 shl ax,4

См. также: урок 9 и команды rcr, rcl, ror, rol, sar, sal, shr

SHR

Сдвиг логический операнда вправо

ASCII-коррекция после сложения

 

Схема команды: shr операнд,кол-во_сдвигов

Назначение: логический сдвиг операнда вправо.

Синтаксис
Алгоритм работы:

  • сдвиг всех битов операнда вправо на один разряд; при этом выдвигаемый справа бит становится значением флага переноса cf;
  • одновременно слева в операнд вдвигается нулевой бит;
  • указанные выше два действия повторяются количество раз, равное значению второго операнда.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
?r r r ? r r

Применение:
Команда shr используется для логического сдвига разрядов операнда вправо. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество_разрядов. В отличие от других команд сдвига, флаг of всегда сбрасывается в ноль в операциях сдвига на один разряд.
Команду shr можно использовать для деления целочисленных операндов без знака на степени 2.

mov cl,4 shr eax,cl ;(eax) разделить на 2 в степени 4

 

26. Перечислите команды циклического сдвига. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры использования команд циклического сдвига.

ROL

(Rotate operand Left)

Циклический сдвиг операнда влево

 

Схема команды: rol операнд,количество_сдвигов

Назначение: операция циклического сдвига операнда влево.

Синтаксис
Алгоритм работы:

  • сдвиг всех битов операнда влево на один разряд, при этом старший бит операнда вдвигается в операнд справа и становится значением младшего бита операнда;
  • одновременно выдвигаемый бит становится значением флага переноса cf;
  • указанные выше два действия повторяются количество раз, равное значению второго операнда.

Состояние флагов после выполнения команды:

11 00
OF CF
?r r

Применение:
Команда rol используется для циклического сдвига разрядов операнда влево. Отличие этого сдвига от rcl в том, что очередной сдвигаемый бит одновременно вдвигается в операнд справа и становится значением флага cf. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество_разрядов. Аналогично другим командам сдвига сохраняется эффект, связанный с поведением флага of, значение которого имеет смысл только в операциях сдвига на один разряд:

  • если of=1, то текущее значение флага cf и выдвигаемого слева бита операнда различны;
  • если of=0, то текущее значение флага cf и выдвигаемого слева бита операнда совпадают.

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

;поменять местами половинки регистра eax: mov ax,0ffff0000h mov cl,16 rol eax,cl ;eax=0000ffffh

ROR

Циклический сдвиг операнда вправо

ASCII-коррекция после сложения

 

Схема команды: ror операнд,количество_сдвигов

Назначение: операция циклического сдвига операнда вправо.

Синтаксис
Алгоритм работы:

  • сдвиг всех битов операнда вправо на один разряд, при этом младший бит операнда вдвигается в операнд слева и становится значением старшего бита операнда;
  • одновременно этот младший бит операнда становится значением флага переноса cf;
  • старое значение флага переноса cf вдвигается в операнд слева и становится значением старшего бита операнда;
  • указанные выше два действия повторяются количество раз, равное значению второго операнда.

Состояние флагов после выполнения команды:

11 00
OF CF
?r r

Применение:
Команда ror используется для циклического сдвига разрядов операнда вправо. Отличие этого сдвига от rcr в том, что очередной сдвигаемый бит одновременно вдвигается в операнд слева и становится значением флага cf. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...31. Это объясняется тем, что микропроцессор использует только пять младших разрядов операнда количество_разрядов. Аналогично другим командам сдвига сохраняется эффект, связанный с поведением флага of, значение которого имеет смысл только в операциях сдвига на один разряд:

  • если of=1, то текущее значение флага cf и вдвигаемого слева бита операнда различны;
  • если of=0, то текущее значение флага cf и вдвигаемого слева бита операнда совпадают;

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

;поместить четыре младших бита ax на место старших битов: ror ax,4

RCL

(Rotate operand through Carry flag Left)

Циклический сдвиг операнда влево через флаг переноса

 

Схема команды: rcl операнд,количество_сдвигов

Назначение: операция циклического сдвига операнда влево через флаг переноса cf.

Синтаксис
Алгоритм работы:

  • сдвиг всех битов операнда влево на один разряд, при этом старший бит операнда становится значением флага переноса cf;
  • одновременно старое значение флага переноса cf вдвигается в операнд справа и становится значением младшего бита операнда;
  • указанные выше два действия повторяются количество раз, равное значению второго операнда команды rcl.

Состояние флагов после выполнения команды:

11 00
OF CF
?r r

Здесь обозначение ?r означает то, что анализ состояния флага имеет смысл при определенном сочетании операндов. В случае команды rcl флаг of представляет интерес, если сдвиг осуществляется на один разряд (см. ниже описание применения команды rcl).
Применение:
Команда rcl используется для циклического сдвига разрядов операнда влево. Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда. В это время можно произвести его извлечение и (или) подмену. Другой важный момент заключается в том, что для счетчика сдвига микропроцессор использует только пять младших разрядов операнда количество_разрядов. Таким образом, значение, большее 31, микропроцессором не допускается (аппаратно это ограничение реализуется тем, что игнорируются значения всех битов счетчика, кроме первых пяти). Обратите внимание на еще один интересный эффект, связанный с поведением флага of. В операциях сдвига на один разряд по изменению этого флага можно судить о факте изменения знакового (старшего) разряда операнда:

  • of=1, если текущее значение флага cf и выдвигаемого бита операнда слева различны;
  • of=0, если текущее значение флага cf и выдвигаемого бита операнда слева совпадают.

 

;сдвиг операнда, занимающего два двойных слова;на четыре разряда влевоch_l dd ... ;младшая часть 64-битного операндаch-2 dd ... ;старшая часть 64-битного операнда... mov cx,4 ;счетчик сдвигов в cx mov eax,ch_l mov edx,ch_hm1: clc ;очисткафлага cf rcl eax,1 ;старшийбит eax в cf rcl edx,1 ;cf вмладшийбит edx, старшийбит edx в cf loop m1

operand through Carry flag Right)

Циклический сдвиг операнда вправо через флаг переноса

 

Схема команды: rcr операнд,количество_сдвигов

Назначение: операция циклического сдвига операнда вправо через флаг переноса cf.

Синтаксис
Алгоритм работы:

  • сдвиг всех битов операнда вправо на один разряд; при этом младший бит операнда становится значением флага переноса cf;
  • одновременно старое значение флага переноса — в операнд слева и становится значением старшего бита операнда;
  • указанные выше два действия повторяются количество раз, равное значению второго операнда команды rcr.

Состояние флагов после выполнения команды:

11 00
OF CF
?r r

Здесь обозначение ?r означает то, что анализ состояния флага имеет смысл при определенном сочетании операндов. В случае команды rcr флаг of представляет интерес, если сдвиг осуществляется на один разряд (см. ниже описание применения команды rcr).
Применение:
Команда rcr используется для циклического сдвига разрядов операнда вправо. Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда. В это время можно произвести его извлечение и (или) подмену. Другой важный момент заключается в том, что для счетчика сдвига микропроцессор использует только пять младших разрядов операнда количество_разрядов. Таким образом, значение, большее 31, не допускается (аппаратно это ограничение реализуется тем, что игнорируются значения битов счетчика старше пятого). Обратите внимание на еще один интересный эффект, связанный с поведением флага of, — его значение имеет смысл только в операциях сдвига на один разряд и обусловлено тем, что по изменению этого флага можно судить о факте изменения знакового разряда операнда:

  • of=1, если текущие (то есть до операции сдвига) значения флага cf и старшего, левого бита операнда различны;
  • of=0, если текущие (то есть до операции сдвига) значения флага cf и старшего, левого бита операнда слева совпадают.

 

;подсчет числа единичных битов в операндеoperand dw ...... mov cx,16 ;размер операнда xor al,al ;счетчик единичных битовcycl: rcr operand,1 jc $+4 ;переход, если очередной выдвинутый бит равен 1 jmp $+4 ;переход, если очередной выдвинутый бит равен 0 inc al ;увеличить счетчик единичных битов loop cycl

 

 

27. Перечислите команды безусловной передачи управления. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры использования этих команд.

JMP

(JuMP)

Переход безусловный

 

Схема команды: jmp метка

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

Синтаксис
Алгоритм работы:
Команда jmp в зависимости от типа своего операнда изменяет содержимое либо только одного регистра eip, либо обоих регистров cs и eip:

  • если операнд в команде jmp — метка в текущем сегменте команд (a8, 16, 32), то ассемблер формирует машинную команду, операнд которой является значением со знаком, являющимся смещением перехода относительно следующей за jmp команды. При этом виде перехода изменяется только регистр eip/ip;
  • если операнд в команде jmp — символический идентификатор ячейки памяти (m16, 32, 48), то ассемблер предполагает, что в ней находится адрес, по которому необходимо передать управление. Этот адрес может быть трех видов:
    • значением абсолютного смещения метки перехода относительно начала сегмента кода. Размер этого смещения может быть 16 или 32 бит в зависимости от режима адресации;
    • дальним указателем на метку перехода в реальном и защищенном режимах, содержащим два компонента адреса — сегментный и смещение. Размеры этих компонентов также зависят от установленного режима адресации (use16 или use32). Если текущим режимом является use16, то адрес сегмента и смещение занимают по 16 бит, причем смещение располагается в младшем слове двойного слова, отводимого под этот полный адрес метки перехода. Если текущим режимом является use32, то адрес сегмента и смещение занимают, соответственно, 16 и 32 бит, — в младшем двойном слове находится смещение, в старшем — адрес сегмента;
    • адресом в одном из 16 или 32-разрядных регистров — этот адрес представляет собой абсолютное смещение метки, на которую необходимо передать управление, относительно начала сегмента команд.

Для понимания различий механизмов перехода в реальном и защищенном режимах нужно помнить следующее. В реальном режиме микропроцессор просто изменяет cs и eip/ip в соответствии с содержимым указателя в памяти. В защищенном режиме микропроцессор предварительно анализирует байт прав доступа AR в дескрипторе, номер которого определяется по содержимому сегментной части указателя. В зависимости от состояния байта AR микропроцессор выполняет либо переход, либо переключение задач.
Состояние флагов после выполнения команды (за исключением случая переключения задач):

выполнение команды не влияет на флаги

Применение:
Команду jmp применяют для осуществления ближних и дальних безусловных переходов без сохранения контекста точки перехода.CALL

(CALL)

Вызов процедуры или задачи

 

Схема команды: call цель

Назначение:

  • передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата;
  • переключение задач.

Синтаксис
Алгоритм работы:
определяется типом операнда:

  • метка ближняя — в стек заносится содержимое указателя команд eip/ip и в этот же регистр загружается новое значение адреса, соответствующее метке;
  • метка дальняя — в стек заносится содержимое указателя команд eip/ip и cs. Затем в эти же регистры загружаются новые значения адресов, соответствующие дальней метке;
  • r16, 32 или m16, 32 — определяют регистр или ячейку памяти, содержащие смещения в текущем сегменте команд, куда передается управление. При передаче управления в стек заносится содержимое указателя команд eip/ip;
  • указатель на память — определяет ячейку памяти, содержащую 4 или 6-байтный указатель на вызываемую процедуру. Структура такого указателя 2+2 или 2+4 байта. Интерпретация такого указателя зависит от режима работы микропроцессора:
  • в реальном режиме — в зависимости от размера адреса (use16 или use32) первые два байта трактуются как сегментный адрес, вторые два/четыре байта, как смещение целевой метки передачи управления. В стеке запоминается содержимое регистров cs и eip/ip;
  • в защищенном режиме — интерпретация цели передачи управления зависит от значения байта AR дескриптора, определяемого селекторной частью указателя. Целью здесь являются дальний вызов процедуры без изменения уровня привилегий, дальний вызов процедуры с изменением уровня привилегий или переключение задачи.

Состояние флагов после выполнения команды (кроме переключения задачи):

выполнение команды не влияет на флаги

При переключении задачи значения флажков изменяются в соответствии с информацией о регистре eflags в сегменте состояния TSS задачи, на которую производится переключение.
Применение:
Как видно из описания алгоритма, команда call позволяет организовать гибкую и многовариантную передачу управления на подпрограмму с сохранением адреса точки возврата. Подробно типовые примеры использования рассмотрены на уроках 10 и 14.

28. Перечислите команды условной передачи управления. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры использования этих команд.

JCC
JCXZ/JECXZ

(Jump if condition)

(Jump if CX=Zero/ Jump if ECX=Zero)

Переход, если выполнено условие

Переход, если CX/ECX равен нулю

 

Схема команды: jcc метка jcxz метка jecxz метка

Назначение: переход внутри текущего сегмента команд в зависимости от некоторого условия.

Синтаксис
Алгоритм работы команд (кроме jcxz/jecxz):
Проверка состояния флагов в зависимости от кода операции (оно отражает проверяемое условие):

  • если проверяемое условие истинно, то перейти к ячейке, обозначенной операндом;
  • если проверяемое условие ложно, то передать управление следующей команде.

Алгоритм работы команды jcxz/jecxz:
Проверка условия равенства нулю содержимого регистра ecx/cx:

  • если проверяемое условие истинно, то есть содержимое ecx/cx равно 0, то перейти к ячейке, обозначенной операндом метка;
  • если проверяемое условие ложно, то есть содержимое ecx/cx не равно 0, то передать управление следующей за jcxz/jecxz команде программы.

Состояние флагов после выполнения команды:

11 07 06 05 04 03 02 01 00
OF SF ZF 0 AF 0 PF 1 CF
? ? ?   r   ?   r

Применение (кроме jcxz/jecxz):
Команды условного перехода удобно применять для проверки различных условий, возникающих в ходе выполнения программы. Как известно, многие команды формируют признаки результатов своей работы в регистре eflags/flags. Это обстоятельство и используется командами условного перехода для работы. Ниже приведены перечень команд условного перехода, анализируемые ими флаги и соответствующие им логические условия перехода.

Команда Состояние проверяемых флагов Условие перехода
JA CF = 0 и ZF = 0 если выше
JAE CF = 0 если выше или равно
JB CF = 1 если ниже
JBE CF = 1 или ZF = 1 если ниже или равно
JC CF = 1 если перенос
JE ZF = 1 если равно
JZ ZF = 1 если 0
JG ZF = 0 и SF = OF если больше
JGE SF = OF если больше или равно
JL SF <> OF если меньше
JLE ZF=1 или SF <> OF если меньше или равно
JNA CF = 1 и ZF = 1 если не выше
JNAE CF = 1 если не выше или равно
JNB CF = 0 если не ниже
JNBE CF=0 и ZF=0 если не ниже или равно
JNC CF = 0 если нет переноса
JNE ZF = 0 если не равно
JNG ZF = 1 или SF <> OF если не больше
JNGE SF <> OF если не больше или равно
JNL SF = OF если не меньше
JNLE ZF=0 и SF=OF если не меньше или равно
JNO OF=0 если нет переполнения
JNP PF = 0 если количество единичных битов результата нечетно (нечетный паритет)
JNS SF = 0 если знак плюс (знаковый (старший) бит результата равен 0)
JNZ ZF = 0 если нет нуля
JO OF = 1 если переполнение
JP PF = 1 если количество единичных битов результата четно (четный паритет)
JPE PF = 1 то же, что и JP, то есть четный паритет
JPO PF = 0 то же, что и JNP
JS SF = 1 если знак минус (знаковый (старший) бит результата равен 1)
JZ ZF = 1 если ноль

Логические условия "больше" и "меньше" относятся к сравнениям целочисленных значений со знаком, а "выше и "ниже" — к сравнениям целочисленных значений без знака. Если внимательно посмотреть, то у многих команд можно заметить одинаковые значения флагов для перехода. Это объясняется наличием нескольких ситуаций, которые могут вызвать одинаковое состояние флагов. В этом случае с целью удобства ассемблер допускает несколько различных мнемонических обозначений одной и той же машинной команды условного перехода. Эти команды ассемблера по действию абсолютно равнозначны, так как это одна и та же машинная команда. Изначально в микропроцессоре i8086 команды условного перехода могли осуществлять только короткие переходы в пределах -128...+127 байт, считая от следующей команды. Начиная с микропроцессора i386, эти команды уже могли выполнять любые переходы в пределах текущего сегмента команд. Это стало возможным за счет введения в систему команд микропроцессора дополнительных машинных команд. Для реализации межсегментных переходов необходимо комбинировать команды условного перехода и команду безусловного перехода jmp. При этом можно воспользоваться тем, что практически все команды условного перехода парные, то есть имеют команды, проверяющие обратные условия.
Применение jcxz/jecxz:

Команда Состояние флагов в eflags/flags Условие перехода
JCXZ не влияет если регистр CX=0
JECXZ не влияет если регистр ECX=0

Команду jcxz/jecxz удобно использовать со всеми командами, использующими регистр ecx/cx для своей работы. Это команды организации цикла и цепочечные команды. Очень важно отметить то, что команда jcxz/jecxz, в отличие от других команд перехода, может выполнять только близкие переходы в пределах -128...+127 байт, считая от следующей команды. Поэтому для нее особенно актуальна проблема передачи управления далее чем в указанном диапазоне. Для этого можно привлечь команду безусловного перехода jmp. Например, команду jcxz/jecxz можно использовать для предварительной проверки счетчика цикла в регистре cx для обхода цикла, если его счетчик нулевой.

... jcxz m1 ;обойти цикл, если cx=0cycl:;некоторый цикл loop cyclm1: ...

См. также: уроки 10, 11 и команду jmp

29. Перечислите командыуправления циклом. Опишите синтаксис каждой из команд и алгоритм ее работы. Приведите примеры использования этих команд.

30. Дайте определение понятий«масив», «индекс элемента массива» в ассемблере. Опишите способы описания, инициализации и организации доступа к элементаммассива в программе на ассемблере. Перечислите способы адресации, которые могут использоваться при работе с массивами в ассемблере.

31. Поясните механизм процедур в ассемблере: цель использования процедуры, синтаксис описания процедуры, размещение в тексте программы, технология отработки. Приведите пример использования процедуры.

32. Опишите команду вызова процедуры с детальным описанием алгоритма ее работы на примере.

33. Перечислите способы передачи аргументов в процедуру. Опишите способ передачи аргументов через регистры.

34. Перечислите способы передачи аргументов в процедуру. Опишите способ передачи аргументов через общую память.

35. Перечислите способы передачи аргументов в процедуру. Опишите способ передачи аргументов через стек.

 


Дата добавления: 2018-04-05; просмотров: 1203; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!