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



ЗНАЕТЕ ЛИ ВЫ?

Разработка программы для ГМ.

Поиск

Отметим, что программа для ГМ должна быть написана на языке символического кодирования, т.е. на уровне ее ассемблера. Поэтому требуется достаточно большая детализация выполняемых действий и описания данных. Формально, на данном этапе, мы можем пока не учитывать особенности реализации этих команд на реальной ЭВМ (РМ), а сконцентрировать внимание на функциях разрабатываемых команд ГМ. Однако, в действительности, разработчику требуется учитывать все эти факторы, включая и те, которые диктуются особенностями реализации программы на РМ. Например, при разработке команд значение разрядности ГМ (параметр fw) практически не фигурирует в их алгоритмах. Но как только встанет задача их реализации на РМ, свойства fw (такие как, кратность или не кратность значения fw байту или полубайту РМ) могут оказать существенное влияние не только на алгоритмы реализации команд ГМ, но и на их номенклатуру. Поэтому, данный этап является наиболее сложным и ответственным.

 

Определение данных.

Разработку программы ГМ начнем с определения данных для нее.

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

Определение конца секции кода.

 

Определие команд ГМ.

Команды ГМ формируются на основе анализа тех необходимых действий, которые стали очевидными при создании программы 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; конец секции кода

;---------------------------------------------------------------

 



Поделиться:


Последнее изменение этой страницы: 2016-12-13; просмотров: 199; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.158.84 (0.008 с.)