Моделирование операций пересылки данных и сравнения процессора
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лабораторная работа 6
6.
Моделирование операций пересылки данных и сравнения
процессора
6.1.
Общая информация
Целью данной работы является моделирование ряда операций, выполняемых
микропроцессорам
и на программном уровне.
В ходе лабораторной работы необходимо реализовать 8 однобайтных регистров
процессора общего назначения, 16 однобайтных ячеек памяти и регистр флагов.
Моделированию подлежат следующие операции:
1.
Операция заполнения данных MOV.
2.
Операция сравнения CMP
3.
Цепочечные команды MOVS, REP MOV
4.
Операция обмена ниблов SWAP
5.
Операция тестирования TEST
6.
Операция смены знака NEG
7.
Операции инкремента/декремента INC/DEC
Примечание:
1.
Желательно выполнять данную лабораторную работу на основе программы,
созданной для решения заданий лабораторной работы №5.
2.
Следует учесть, что конечной целью ряда лабораторных работ, посвященных
моделированию различных операций процессора, является создание мини-эмулятора
процессора с возможностью выполнения в режиме интерпретации небольших программ,
написанных на псевдо-ассемблере.
3.
В случае, если выполнение данной лабораторной работы производится на
базе программы из предыдущей л.р., желательно переобозначить регистры 1- 8: ah, al, bh,
bl, dh, dl, ch, cl.
4.
При цепочечных командах регистр ch служит в качестве счетчика числа
повторений.
5.
Все
операции
пересылки
выполняются
для
данных
вида
<регистр>,<регистр>; <регистр>,<память>; <регистр>,<непосредственный операнд>;
<память>, <непосредственный операнд>; <память>, <память>.
«Непосредственный операнд» - это числовая константа.
<Память> обозначается как #НОМЕР, где НОМЕР – номер ячейки памяти.
6.
Операция сравнения выполняется для данных вида <регистр>,<регистр>;
<регистр>,<непосредственный операнд>; <память>, <непосредственный операнд>.
7.
Операция обмена ниблов выполняется для данных вида <регистр>; <память>.
8.
Операция тестирования выполняется для данных вида <регистр>, <регистр>;
<регистр>,
<память>;
<регистр>,
<непосредственный
операнд>;
<память>,
<непосредственный операнд>.
9.
Операция смены знака выполняется для данных вида <регистр>; <память>.
10. Операции инкремента/декремента выполняется для данных вида <регистр>;
<память>.
11. Формат регистра флагов: |0|0|0|DF|OF|SF|ZF|CF|, где:
CF – Carry Flag – флаг переноса. Содержит значение переносов (0 или 1) из
старшего разряда при арифметических операциях и операциях сдвига и циклического
сдвига.
Если переноса не происходит, значение флага не меняется, если операция не
влияет на флаг. Если переноса нет, но операция влияет на флаг (см. описание операций),
флаг сбрасывается.
ZF – Zero Flag – флаг нуля.
Устанавливается в качестве результата при арифметических операциях и
операциях сдвига, циклического сдвига, логических операциях, если их результат равен
нулю. Сбрасывается при ненулевом результате.
SF – Sign Flag – флаг знака.
Устанавливается в качестве результата при арифметических операциях и
операциях сдвига, циклического сдвига, логических операциях, если их результат
отрицателен. Сбрасывается при положительном результате.
OF – Overflow Flag – флаг переполнения.
Устанавливается в качестве результата при арифметических операциях, если их
результат превосходит 255 для беззнаковых данных, 127 для знаковых (соответственно
меньше 0 или меньше -128), т.е. переполнение происходит при переносе в/из 8-ого бита
для беззнаковых данных, в/из 7-ого бита для знаковых. Сбрасывается в остальных
случаях.
DF – Direction flag – флаг направления.
Устанавливается и сбрасывается программистом. Служит для указания
направления данных при операциях пересылки.
Все остальные биты регистра флагов зарезервированы и всегда равны нулю.
12. Все числа являются знаковыми (-128-0-127).
13. При выполнении данной лабораторной работы запрещается использовать
машинно-зависимые и зависимые от компилятора и языка программирования операции и
типы данных. Программы должны быть переносимы. Эмуляция всех указанных выше
операций и типов данных осуществляется вручную.
14. В программе должно быть предусмотрены ручной сброс и установка
отдельных флагов.
15. Программа должна обладать удобным и понятным интерфейсом.
16. Все входные данные корректны.
6.2.
Операция заполнения данных MOV
Операция пересылки данных MOV служит для заполнения ячеек памяти и
регистров данными и пересылки значений ячеек памяти/регистров друг между другом.
Формат команды [rep] mov dest,scr. Команда выполняет пересылку значения из
источника scr (если он задает адрес ячейки памяти или регистр) в получатель dest. Если
источник представляет из себя непосредственный операнд, то получатель заполняется
значением этой константы. Смысл необязательного префикса rep будет рассмотрен ниже.
Команда не влияет ни на какие флаги.
6.3.
Операция сравнения CMP
Сравнивает содержимое двух полей данных. Фактически команда CMP выполняет
вычитание второго операнда из первого, но их содержимое не меняется. Для этого
используются внутренние регистры процессора, недоступные программисту ни для
записи, ни для чтения, и не отображаемые на экране (см. лабораторную работу № 5).
Команда воздействует на флаги CF, SF и ZF, OF.
Внимание! Флаг ZF устанавливается в случае равенства первого операнда второму.
Флаг SF устанавливается в случае, когда первый операнд отрицателен. Флаг CF
устанавливается, если первый операнд меньше второго, сбрасывается в
противоположном случае.
6.4.
Цепочечные команды MOVS, REP MOV
Две цепочечные команды эквивалентны друг другу. Они выполняют операцию
пересылки строк данных. Цепочечные команды выполняются для данных вида <память>,
<память>; <память>, <регистр>; <память>, <непосредственное значение>.
Рассмотрим эти команды более подробно для случая <память>, <регистр>.
При выполнении такой команды сначала значение регистра пересылается в ячейку
с адресом <память>. Затем значение регистра ch уменьшается на единицу. На
следующем шаге это значение записывается в следующую ячейку, если флаг DF
установлен, или в предыдущую, если флаг сброшен. Операция повторяется до тех пор,
пока значение регистра ch не станет равным 0.
Случай <память>, <непосредственное значение> аналогичен.
Эти два случая служат для заполнения области памяти каким-то значением
(например, для инициализации или обнуления).
Случай <память>, <память> более сложен. На первом шаге происходит
копирование значения из ячейки-источника в ячейку-получатель, затем уменьшается
счетчик числа пересылок (регистр ch). На следующем шаге ячейкой-источником
становится следующая по отношению к начальному источнику, если флаг DF
установлен, или предыдущая, если флаг сброшен. Аналогично с источником.
6.5.
Операция тестирования TEST
Команда выполняет проверку байта на определенную битовую комбинцию.
Команда TEST действует аналогично команде AND, но не изменяет результирующий
операнд. Команда выставляет флаги аналогично команде AND, т.е. воздействует на
флаги ZF и SF.
6.6.
Операция СМЕНЫ ЗНАКА NEG
Меняет двоичное значение из положительного в отрицательное и наоборот.
Команда NEG вычисляет двоичное дополнение от указанного операнда: вычитает
операнд из нуля и прибавляет единицу. Команда воздействует на флаги CF, SF, ZF, OF.
6.7.
Операция обмена ниблов SWAP
Операция меняет ниблы (группы из четырех бит) в байте. Воздействует на флаги
SF, ZF, CF, OF.
Пример: MOV AH, 01011111
SWAP AH
AH=11110101
6.8.
Операции инкремента/декремента INC/DEC
Операции служат для увеличения/уменьшения значения аргумента на 1 и
эквивалентны командам ADD <операнд>,1 и DEC <операнд>,1. Воздействуют на флаги
OF, CF, SF, ZF.
6.9.
Задание на лабораторную работу
Реализовать программу, моделирующую указанные операции в процессоре.
Для простоты реализации принять, что все входные данные корректны.
Программа должна вводить с клавиатуры или из файла состояние ячеек памяти и
регистров процессора. После этого с клавиатуры вводится операция и операнды
(непосредственные данные в двоичном виде или номера ячеек/регистров процессора).
Затем программа выводит на экран операнды в двоичном и десятичном виде, операцию,
результат в двоичном и десятичном виде, состояние ячеек и регистров процессора в
двоичном и десятичном виде и регистра флагов в двоичном виде с подписями флажков.
Учесть, что хотя точный внешний вид программы и формат входных данных не
регламентируются, ввод данных, и вывод на экран должны быть реализованы
максимально удобно и интуитивно понятно для пользователя.