Моделирование арифметических и логических операций процессора
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лабораторная работа 5
5.
Моделирование арифметических и логических операций процессора
5.1.
Общая информация
Целью данной работы является моделирование арифметических и логических
операций, выполняемых микропроцессорами на программном уровне.
В ходе лабораторной работы необходимо реализовать 8 однобайтных регистров
процессора общего назначения, 16 однобайтных ячеек памяти и регистр флагов.
Моделированию подлежат следующие операции:
Операции сложения ADD, ADC.
1.
2.
Операции вычитания SUB, SUBB
3.
Операцию умножения MUL
4.
Операцию деления DIV
5.
Операции сдвига вправо SHR, ROR, RRC
6.
Операции сдвига влево SHL, ROL, RLC
7.
Логические операции AND, NOT, OR, XOR
Примечание
1.
Все операции выполняются для данных вида <регистр>,<регистр>;
<регистр>,<память>;
<регистр>,<непосредственный
операнд>;
<память>,
<непосредственный операнд>. Результат выполнения команды помещается в первый
операнд. «Непосредственный операнд» - это числовая константа.
2.
Логические операции и операции сдвига выполняются для данных вида
<регистр>,<регистр>;
<регистр>,<непосредственный
операнд>;
<память>,
<непосредственный операнд>.
3.
Формат регистра флагов: |0|0|0|0|OF|SF|ZF|CF|, где:
CF – Carry Flag – флаг переноса. Содержит значение переносов (0 или 1) из
старшего разряда при арифметических операциях и операциях сдвига и циклического
сдвига. Если переноса не происходит, значение флага не меняется, если операция не
влияет на флаг. Если переноса нет, но операция влияет на флаг (см. описание операций),
флаг сбрасывается.
ZF – Zero Flag – флаг нуля. Устанавливается в качестве результата при
арифметических операциях и операциях сдвига, циклического сдвига, логических
операциях, если их результат равен нулю. Сбрасывается при ненулевом результате.
SF – Sign Flag – флаг знака. Устанавливается в качестве результата при
арифметических операциях и операциях сдвига, циклического сдвига, логических
операциях, если их результат отрицателен. Сбрасывается при положительном результате.
OF – Overflow Flag – флаг переполнения. Устанавливается в качестве
результата при арифметических операциях, если их результат превосходит 255 для
беззнаковых данных, 127 для знаковых (соответственно меньше 0 или меньше -128), т.е.
переполнение происходит при переносе в/из 8-ого бита для беззнаковых данных, в/из 7ого бита для знаковых. Сбрасывается в остальных случаях.
Все остальные биты регистра флагов зарезервированы и всегда равны нулю.
4.
Все числа являются знаковыми (-128-0-127).
5.
При выполнении данной лабораторной работы запрещается использовать
машинно-зависимые и зависимые от компилятора и языка программирования операции и
типы данных. Программы должны быть переносимы. Эмуляция всех указанных выше
операций и типов данных осуществляется вручную.
В программе должно быть предусмотрены ручной сброс и установка
6.
отдельных флагов.
7.
Программа должна обладать удобным и понятным интерфейсом.
5.2.
Арифметические операции
Команды ADD и SUB выполняют сложение и вычитание байтов, содержащих
двоичные данные, команды ADC и SUBB отличаются от них тем, что сначала
прибавляют (отнимают) от первого операнда содержимое флага переноса, что позволяет
организовать сложение/вычитание двухбайтных чисел. При переполнении команды
устанавливают флаги CF и OF (сбрасывает их при отсутствии переполнения). Команды
также влияют на флаги ZF и SF.
Команды MUL и DIV выполняют целочисленное умножение/деление байтов.
Команды влияют на все арифметические флаги. Рекомендуется при выполнении
команды DIV частное помещать в регистр1, а остаток от деления в первый операнд и не
использовать регистр1 в качестве операнда для этой команды.
5.3.
Операции сдвига
Команды SHR, SHL выполняют сдвиг вправо/влево. При этом самый правый/левый
бит числа (выдвигаемый бит) попадает во флаг переноса, а остальные биты
перемещаются на одну позицию вправо/влево. Освободившийся бит заполняется нулем.
Сдвиг на n бит эквивалентен последовательному сдвигу на 1 бит n раз. Команды также
влияют на флаг ZF. При операциях сдвига переполнения не наступает. Все команды
сдвига не влияют на флаг знака.
Пример для команды SHR: SHR 10101011,1 = 01010101, 1->CF
Команды ROR/ROL выполняют циклический сдвиг вправо/влево.
При этом самый правый/левый бит числа (выдвигаемый бит) становится самым
левым/правым, а остальные биты перемещаются на одну позицию вправо/влево.
Сдвиг на n бит эквивалентен последовательному сдвигу на 1 бит n раз.
Команды циклического сдвига не влияют ни на какие флаги, за исключением флага
нуля, если первый операнд равен нулю изначально.
Пример для команды ROR: ROR 10101011,3 = 01110101
Команды RRC/RLC выполняют арифметический сдвиг вправо/влево.
Команда RRC аналогична команде SHR за одним важным отличием:
освободившийся бит заполняется не нулем, а текущим содержимым флага переноса. Это
позволяет сохранить знак числа при сдвиге.
Команда RLC полностью аналогична команде SHL.
Пример для команды RRC: RRC 11101010,1 (CF=1) = 11110101, 0->CF
5.4.
Логические операции
Логические операции выполняются поразрядно надо всеми битами аргументов.
AND: Если оба сравниваемых бита равны 1, то результат равен 1, во всех
остальных случаях результат – 0.
OR: Если хотя бы один из сравниваемых битов равен 1, то результат равен 1, иначе
результат – 0.
XOR: Если биты не равны, то результат – 1, если равны – 0.
NOT (команда имеет только один операнд): команда инвертирует все биты
аргумента. Аргументом команды не может быть непосредственный операнд.
Логические операции влияют на флаги SF, ZF.
5.5.
Замечания по реализации
Предлагается хранить данные в виде строк символов. Значением каждого символа
могут быть только «1» или «0». Исходные данные вводятся в программу в виде
десятичных чисел, поэтому понадобится процедура конверсии целых чисел в строку
битов (лабораторная работа 1).
Очевидно, что реализация логических операций (она сводится к посимвольному
сравнению двух строк) и операций сдвига (они выполняются в виде цикла с
посимвольным перебором строки) не вызывает сложностей. Поэтому останавливаться на
них мы не будем.
Наибольший интерес представляет реализация арифметических операций.
Операции сложения и вычитания выполняются справа налево столбиком. При
моделировании этих операций целесообразно рассмотреть аналогичные операции для
десятичных чисел. Надо только учесть, что при сложении двоичных чисел в следующий
разряд происходит не при переходе через девять, а при переходе через единицу.
Вычитание также как и для десятичных чисел выполняется с заемом из более значащих
разрядов.
Умножение и деление также выполняются столбиком. Рассмотрим их более
подробно.
Умножение можно выполнить путем 8 сложений, как показано на примере в
таблице 1.
Таблица 1
Существует и другой способ:
1.
Обнулим регистр накопления суммы.
2.
Будем просматривать второй операнд справа налево со второго разряда. Если
в каком-то разряде второго операнда стоит единица, сдвигаем первый операнд влево на
число бит, равное номеру текущего разряда второго операнда. Результат сдвига
прибавляем к накопленной сумме.
3.
Прибавим к накопленной сумме младший бит второго операнда.
Очевидно, что оба способа по сути дела эквивалентны, однако второй, несмотря на
несколько большую сложность реализации, позволяет использовать меньше
промежуточных переменных.
Деление выполняется путем вычитания второго операнда из первого до тех пор,
пока первый операнд не станет меньше второго или равен нулю. Количество
произведенных операций вычитания в двоичном виде и есть частное, а текущее значение
первого операнда – остаток от деления. При реализации операции деления понадобится
реализовать сравнение чисел. Оно может быть реализовано для двоичных чисел в виде
команды CMP, сравнивающей числа и влияющей флаги ZF и SF, за исключением OF и
CF. При равенстве чисел она устанавливает флаг ZF, в противном случае сбрасывает его.
Обратите внимание: по регистру флагов можно установить только факт равенства или
неравенства операндов. Какой из них меньше узнать нельзя. Подразумевается, что эта
информация хранится внутри процессора, в регистрах, недоступных программисту.
Команда устанавливает флаг SF при отрицательном первом аргументе. Реализация
команды CMP не является обязательной для данной лабораторной работы и может
рассматриваться как выход студентом за рамки задания.
Примерный вид окна программы
Примечание
“ОП” – знак операции.
5.6.
Задание на лабораторную работу
Реализовать программу, моделирующую арифметические, логические операции и
операции сдвига в процессоре.
Задача должна быть реализована в двух вариантах:
а)
Исходные данные – однобайтные числа, результаты операций – однобайтные
числа.
б)
Исходные данные – однобайтные числа, результаты операций – однобайтные
и двухбайтные числа. При этом ячейки памяти и регистры процессора однобайтные.
Для простоты реализации принять, что все входные данные корректны.
Программа должна вводить с клавиатуры или из файла состояние ячеек памяти и
регистров процессора. После этого с клавиатуры вводится операция и операнды
(непосредственные данные в десятичном виде или номера ячеек/регистров процессора).
Затем программа выводит на экран операнды в двоичном и десятичном виде, операцию,
результат в двоичном и десятичном виде, состояние ячеек и регистров процессора в
двоичном и десятичном виде и регистра флагов в двоичном виде с подписями флажков.
Учесть, что хотя точный внешний вид программы и формат входных данных не
регламентируются, ввод данных, и вывод на экран должны быть реализованы
максимально удобно и интуитивно понятно для пользователя.