- •Методические указания
- •«Моделирование программы гипотетической машины с помощью макросредств»
- •1.Введение.
- •2.Пример выполнения курсовой работы.
- •2.1.Задание.
- •2.2.Анализ задачи и разработка алгоритма.
- •2.3.Разработка программы для гм.
- •2.3.1. Определение данных.
- •2.3.2.Определие команд гм.
- •2.4.Моделирование программы гм на реальной эвм.
- •2.4.1.Выборка и запиь слов гм.
- •2.4.2. Макроопрделения для команд гм.
- •2.5.Технология подготовки программы к выполнению и ее отладка.
- •2.6. Результаты работы программы
- •3. Варианты курсовой работы
- •4.Приложения
- •2. Блоки повторения
- •2.1. Rept-блоки
- •Irpc-блоки
- •2.4 Макрооператоры
- •3. Макросы
- •113.1. Макроопределения
- •3.1. Макрокоманды
- •3. 3. Макроподстановки и макрорасширения
- •3. 5. Макросы и процедуры
- •3. 6. Определение макроса через макрос
- •3.7. Директива local
- •113.8. Директива ехiтм
- •3. 9. Переопределение и отмена макросов
- •4. Условное ассемблирование
- •4. 1. Директивы if и ife
- •4.2. Операторы отношения. Логические операторы
- •4.3. Директивы ifidn ,ifdif , ifb и ifnb
2.3.Разработка программы для гм.
Отметим, что программа для ГМ должна быть написана на языке символического кодирования, т.е. на уровне ее ассемблера. Поэтому требуется достаточно большая детализация выполняемых действий и описания данных. Формально, на данном этапе, мы можем пока не учитывать особенности реализации этих команд на реальной ЭВМ (РМ), а сконцентрировать внимание на функциях разрабатываемых команд ГМ. Однако, в действительности, разработчику требуется учитывать все эти факторы, включая и те, которые диктуются особенностями реализации программы на РМ. Например, при разработке команд значение разрядности ГМ (параметр fw) практически не фигурирует в их алгоритмах. Но как только встанет задача их реализации на РМ, свойства fw (такие как, кратность или не кратность значения fw байту или полубайту РМ) могут оказать существенное влияние не только на алгоритмы реализации команд ГМ, но и на их номенклатуру. Поэтому, данный этап является наиболее сложным и ответственным.
2.3.1. Определение данных.
Разработку программы ГМ начнем с определения данных для нее.
1. DW_ name,n
Директива определения n слов ГМ, первому из них присваивается
имя name. Если n=1, то этот параметр можно не указывать. С помощью
этой директивы могут объявляться массивы,переменные и регистры
общего назначения ГМ.
2. DB_ name,str,n
Директива определения строки символов ГМ с именем name. Если
параметр n не указан, то резервируется память под строку со
значением str, иначе резервируется n слов ГМ, отводимых под
строку, а str интерпретируется как подсторка заполнения этой
строки.
3. DF_ Fl
Директива определения флагового регистра Fl ГМ.
4. CONSTsection
Определение секции констант (псевдодиректива)
5. STACKsection n
Определение стека; n – размер стека.
6. DATAsection
Определение начала секции данных.
7. ENDdata
Определение конца секции данных.
8. CODEsection
Определение начала секции кода.
9. ENDcode
Определение конца секции кода.
2.3.2.Определие команд гм.
Команды ГМ формируются на основе анализа тех необходимых действий, которые стали очевидными при создании программы Prototip2.
1. START
Команда начальной инициализации программы.
2. ClrScr
Команда очистки экрана.
3. Write txt
Команда вывод заданного текста txt на экран.
4. Move dest,source,n
Команда копирования области памяти source в область памяти
dest, n – число копируемых слов ГМ.
5. ClReg R
Команда очистки регистра или переменной.
6. MovI R,%c
Пересылка непосредственного значения c в регистр или
переменную.
7. MovSR R,S,i
Пересылка память-регистр,i индексирует память S( R <- S[i] ).
8. MovRS S,R,i
Пересылка регистр-память,i индексирует память S( S[i] <- R ).
9. Mov_ v,w
Команда пересылки v <- w , где v и w могут быть регистрами
или одиночными переменными.
10. NEW p
Команда резервирования нового узла. В р возвращается указатель
на вновь созданный узел. Неявно использует и автоматически
модифицирует указатель ih.
11. CMP_ v,w
Команда сравнения и установки флагов. Флаги устанавливаются
по результатам вычитания v-w.
12. JUMP metka
Команда безусловного перехода.
13. gmGT metka
Команда перехода по условию «больше».
14. gmEQ metka
Команда перехода по условию «равно».
15. INC_ R
Команда инкрементирования (R:=R+1), где R – регистр или
одиночная переменная.
16. WriteUz p
Команда вывода узла списка, р – указатель на узел.
17. ReadKey
Команда ожидания нажатия клавиши.
18. FINISH
Команда завершения работы программы
Ниже приведена программа для ГМ.
; " Создание отсортированного списка"
INCLUDE macros.inc ; подключение файла с макросами
InitRealComputer ; настройка на реальную ЭВМ
; две предыдущие макрокоманды обеспечивают выполнение программы ГМ на реальной ЭВМ
;************* Программа для гипотетической машины ***************
CONSTsection
kuz = 10 ; к-во узлов списка (kuz=1..127)
maskG = 1 ; маски для анализа флагового регистра на «больше»,
maskL = 2 ; «меньше» и
maskE = 4 ; «равно»
nil = 0FFh ; признак конца списка
;---------------------------------------------------------------
STACKsection 100 ; объявление стека
;---------------------------------------------------------------
DATAsection ; раздел описания данных ГМ
DW_ R0 ; R0-R3 -регистры общего назначения ГМ
DW_ R1 ;
DW_ R2 ;
DW_ R3 ;
DW_ Rtmp ; рабочий регистр
DW_ h ; указатель головы списка
DW_ t ; указатель на текущий узел списка
DW_ p ; указатель на предыдущий узел
DW_ s ; указатель на новый узел
DW_ ih ; индекс для резервирования нового узла
DW_ cNIL ; переменная для хран-я знач-я NIL
DW_ i ; рабочий индекс
DW_ Buf,kuz ; буфер - источник информации для списка
DW_ Spis,2*kuz ; память под список
DB_ eoLn,EndLine ; признак конца строки для вывода
DB_ OutPut,endSTR,2 ; буфер вывода
DB_ num,'0123456789ABCDEF' ;табл. перевода в 16с/c
DB_ zag,<' Отсортированный список',EndLine>
DF_ Fl ; флаговый регистр ГМ
ENDdata ; конец секции данных ГМ
;---------------------------------------------------------------
CODEsection ; секция кода ГМ
START ; нач. инициализация программы
ClrScr ; очистка экрана
Move Buf,Primer,kuz ; загрузка буфера исх. инф-ей из сегмента кода
ClReg R1 ; R1 сч. цикла := 0
MovI R2,%kuz ; к-во узлов -> R2
MovI h,%NIL ; h := NIL
MovI Cnil,%NIL ; Cnil := NIL
ClReg ih ; нач. знач-е индекса равно 0
Repeat: ; Цикл создания списка
MovSR R0,Buf,R1 ; очередной inf взяли из Buf -> R0
NEW s ; создали новый узел
MovRS Spis,R0,s ; s^.i:=R0; inf-> в новый узел
Mov_ t,h ; t:=h;
MovI p,%NIL ; p:=nil
While1: ; Цикл поиска и вставки узла в список
CMP_ t,Cnil ; While t<> NIL Do
gmEQ EndWhile ;
MovSR R3,Spis,t ; R3 := t^.i
CMP_ R3,R0 ; if t^.i > R0
gmGT InsUz ; Then InsUz
NextUz: ; Else NextUz продолжаем искать место вставки
Mov_ p,t ; p:=t
INC_ t ; t:=t+1 для получения доступа в поле link
MovSR t,Spis,t ; t:=t^.l переход к след. узлу
JUMP While1 ; повторение цикла поиска
InsUz: ; Реализация различных вариантов вставки
CMP_ p,Cnil ; If p=Nil Then InsFirst вставка в начало
gmEQ InsFirst ; Else InsMed вставка в середину
InsMed: ; вставка в середину списка
INC_ p ; p:=p+1 для получения доступа в поле link
MovSR R0,Spis,p ; R0 := p^.l
MovRS Spis,s,p ; p^.l := s
INC_ s ; s:=s+1 для получения доступа в поле link
MovRS Spis,R0,s ; s^.l := R0
JUMP EndRepeat ; завершение этого варианта вставки
InsFirst: ; вставка в начало списка
Mov_ h,s ; h:=s
INC_ s ; s:=s+1 для получения доступа в поле link
MovRS Spis,t,s ; s^.l := t
JUMP EndRepeat ; завершение этого варианта вставки
EndWhile: ; реализация других вариантов
CMP_ p,Cnil ; If p=NIL Then Empty - в пустой список
gmEQ Empty ; Else InsEnd - в конец списка
InsEnd: ; вставка в конец списка
INC_ p ; p:=p+1 для получения доступа в поле link
MovRS Spis,s,p ; p^.l := s
INC_ s ; s:=s+1 для получения доступа в поле link
MovRS Spis,Cnil,s ; s^.l := NIL
JUMP EndRepeat ; завершение этого варианта вставки
Empty: ; вставка в пустой список
Mov_ h,s ; h:=s
INC_ s ; s:=s+1 для получения доступа в поле link
MovRS Spis,Cnil,s ; s^.l:=NIL
EndRepeat:
INC_ R1 ; увеличение счетчика цикла
CMP_ R2,R1 ; сравнение с kuz
gmGT Repeat ; If счетчик < kuz Then Repeat на начало цикла
Write zag ; вывод заголовка списка
Mov_ t,h ; t:=h
Wcycl: ; Прохождение и печать списка
CMP_ t,Cnil ; While t <> NIL Do
gmEQ endPRN
WriteUz t ; Печать узла
INC_ t ; t:=t+1 для получения доступа в поле link
MovSR t,Spis,t ; t:=t^.l
JUMP Wcycl ; Goto Wcycl
endPRN:
ReadKey ; ждать нажатия клавиши
FINISH ; завершение программы
ENDcode ; конец секции кода
;---------------------------------------------------------------