Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа по курсу ОФЭВМ №4.doc
Скачиваний:
16
Добавлен:
16.12.2014
Размер:
239.62 Кб
Скачать

5. Методические указания

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

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

5.1. Описание команд ассемблера

Ассемблер является машинно-ориентированным языком - это символическое представление машинного языка. Поэтому рассматривать команды ассемблера необходимо на конкретной структуре ПЭВМ, в которой эти команды и будут реализовываться. Но в нашу задачу не входит разработка процессора ПЭВМ в полном объёме, а требуется разработать операционные автоматы, которые будут являться некоторыми фрагментами реального процессора ПЭВМ, выполняющего три заданные команды. Поэтому мы дадим здесь подробный комментарий к выполнению заданных команд, которым и следует руководствоваться при выполнении лабораторной работы. Описание команд в данном руководстве лишь частично соответствует ассемблеровским командам по указанной причине. Полное описание команд ассемблера можно найти в [4]. Размерность операндов полагается длиной 32 бита (слово).

Сложение двоичных чисел без знака. Автомат выполняет сложение операндов, размещённых в регистрах А и В по правилам сложения двоичных чисел, размещение результата оговаривается отдельно. Если при сложении происходит переполнение, то результат оказывается неверен. Этот факт фиксируется автоматом за счёт того, что в регистре флагов Ф в разряде 0 устанавливается 1. Таким образом, обрабатывать ситуации, связанные с переполнением, обязан сам программист. В таблице 1 даны три команды двоичного сложения:

inc A - операция инкремента, то есть увеличение значения операнда в регистре А на 1. Результат операции пересылается в регистр А;

add A B - команда сложения : А = А + В;

adc А В - команда сложения с учётом флага переноса Ф(0): А = А + В+ +Ф(0). Последняя команда позволяет складывать длинные числа, размерность которых превосходит форматы регистров в автомате.

Сложение двоичных чисел со знаком. В нашем автомате положительные числа представляются двоичным кодом, а отрицательные в дополнительном коде. При сложении чисел с учётом их знаков необходимо рассматривать все возможные случаи, связанные с возможным переполнением при сложении чисел с одинаковыми знаками. В соответствии с известным алгоритмом, при сложении чисел с учётом их знаков необходимо анализировать переносы в знаковый разряд и из знакового разряда. Перенос из знакового разряда в старший разряд у нас уже фиксируется с помощью флага Ф(0) = 1. Перенос в знаковый разряд фиксируется с помощью флага Ф(11) = 1.

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

Команды сложения со знаком и без знака в автомате не различаются.

Команды вычитания двоичных чисел с учётом знака. Вычитание чисел соответствует операции сложения чисел с разными знаками, при условии, что знак второго операнда изменён на противоположный. Если второй операнд при вычитании был положительным, то его необходимо представить в дополнительном коде. Если операнд был отрицательным, то он в дополнительном коде и его необходимо представить в прямом коде. Сами коды хранятся в регистрах. Мы будем полагать, что в автомате доступно считывание из регистров в прямом и обратном кодах. Тогда для перехода к дополнительному коду необходимо прочитать обратный код и добавить к нему 1. Для перехода к прямому коду необходимо вычесть единицу (сложить с единицей в дополнительном коде - 1111...1) и инвертировать результат, то есть считать его в обратном коде. После чего выполняется операция сложения с учётом знаков. Следует помнить, что если при сложении получился отрицательный результат, то он в дополнительном коде.

Таким образом, перед вычитанием изменяем знак второго операнда на противоположный и преобразуем, где это необходимо, коды операндов, после чего выполняем операцию сложения с рассылкой значений флагов Ф(0) и Ф(11).

Команды вычитания:

dec А - операция декремента, уменьшение операнда А на 1: А = А - 1;

sub A B - команда вычитания: А = А - В;

sbb A B - команда вычитания с учётом переполнения: А = А - В - Ф(0).

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

mul A B двоичных чисел выполняется над операндами, хранящимися в регистре А и В. Регистр В имеет двойную длину. Это сделано для того, чтобы при умножении можно было сохранить весь результат, который при умножении удваивается: В = А*В.

Операция умножения выполняется с помощью операции сложения, которая производится неоднократно со сдвигом по известному алгоритму. При вычислении суммы частичных произведений также, как и при сложении формируются значения флагов Ф(0) и Ф(11). Если результат умножения умещается в одном слове, то флаги Ф(0) и Ф(11) будут равны 0. Если при сложении частичных произведений было переполнение, то результат умножения будет размещаться в двойном слове, используя старшие разряды регистра В.

Умножение двоичных чисел со знаком. Код команды imul A B:

В = А*В. Если результат умещается в младших разрядах регистра В (Ф(0) = Ф(11) = 0), то старшие разряды этого регистра заполняются содержимом знакового разряда младшей части. Если результат размещается в двойном слове (Ф(0) = Ф(11) = 1), то знаком результата является знаковый бит старших разрядов регистра В.

Знак результата формируется на основании знаков операндов.

Деление двоичных чисел без знака. Для деления чисел без знака используется команда div A B.

Делимое находится в регистре А, делитель в регистре В. Результат выполнения операции: А = А/В.

При делении возможно прерывание. Признак прерывания заносится в 0 разряд регистра прерываний П: П(0) = 1. Прерывание возникает при делении на 0 или при невозможности разместить частное в отведённом для него поле. Поэтому при выполнении операции “деление” необходимо проверять делитель на 0. Операция деления выполняется с помощью операции “вычитание” со сдвигом. Значения флагов при этом не определены.

Деление двоичных чисел со знаком. Операция деления выполняется точно так же, как и без учёта знака. Код операции idiv A B.

Результат операции А = А/В.

Знак результата формируется на основе знаков операндов.

Команда преобразования типов cbw. Эта команда преобразования байта в слово в регистре А путём распространения значения старшего бита в байте на все остальные биты этого регистра.

Команда преобразования типов cwd. Эта команда преобразования слова в регистре А в двойное слово, размещаемое в регистрах А и В. Она производится за счёт распространения значения старшего бита регистра А на все биты регистра В.

Команда преобразования типов cwde. Эта команда преобразования слова в регистре А в двойное слово в регистрах А и В путём распространения значения старшего бита регистра А на все биты старшей половины регистра В.

Команда преобразования типов cdq. Эта команда преобразования двойного слова в регистре А в учетверённое слово в регистрах А и В (4х32) путём распространения значения старшего бита регистра А на все биты регистра В.

Команда neg. Команда выполняет инвертирование значения, записанного в регистре А, то есть выполняет действие А = 0 - А. Служит для смены знака операнда.

Логическая команда and. Операция логического умножения. Команда имеет формат and A B.

Команда выполняет поразрядно логическую операцию конъюнкции над битами операндов А и В. Результат записывается на место операнда А.

Логическая команда or. Операция логического сложения. Формат команды or A B.

Команда выполняет поразрядно операцию ИЛИ (дизъюнкцию) над битами операндов А и В. Результат записывается в А.

Логическая команда xor. Команда сложения по модулю 2. Выполняет поразрядное сложение по модулю2 над операндами А и В. Результат записывается в А. Формат команды:xor A B.

Логическая команда test. Команда проверить. Команда выполняет поразрядное логическое умножение над битами операнда А и операнда В.

Формат команды test A B.

Результат умножения никуда не записывается. Формируются значения флага: Ф(1), что даёт возможность анализировать состояние отдельных битов операнда без изменения их состояния. Эта команда позволяет сравнивать содержимое регистра с некоторым заданным кодом - маской. Если при умножении получится нулевой результат, то, следовательно, нет полного совпадения и Ф(1) = 0. Если есть полное совпадение, то Ф(1) = 1.