Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Моделирование программы ГМ на реальной эвм.Содержание книги
Поиск на нашем сайте
Выборка и запиь слов ГМ. Чтобы выполнить программу на реальной ЭВМ необходимо для всех ее операторов написать макроопределения. На их сложность и объем в первую очередь влияет величина fw – формат слова ГМ. С методической точки зрения выберем fw как параметр и укажем диапазон его изменения: 8..255. Наиболее сложными операциями (макрокомандами) в такой постановке являются выборка и запись слова ГМ по заданному индексу в массиве. Алгоритмы выборки и записи поясняются ниже. Пусть в качестве исходных данных выбраны значения из некоторой области памяти. Шестнадцатеричные и двоичные коды этой области приведены на рис.5.
а) 1E 33 C0 50 B8 BD 13 8E D8 1E 07 B4 06 B0 00 B7 07 BA 4F 18 B9 00 00 CD 10 B4 02 B7 00 BA 00 00 CD 10 06 1E B8 1E 12 33 24 C0 2E 50 0E B8 28 BD 04 13 26 8E 1A D8 FF 1E 46 07 20 B4 32 06 44 B0 16 00 2A B7 36 07 30 BA б) 00011110 00110011 1100000 0 01010000 10111000 101111 01 00010011 10001110 11011 000 00011110 00000111 1011 0100 00000110 10110000 000 00000 10110111 00000111 10 111010 01001111 00011000 1 0111001 00000000 00000000 11001101 00010000 1011010 0 00000010 10110111 000000 00 Рис.5. Пример исходных данных для списка (объектный код в начале кодового сегмента)
Пусть для примера разрядность ГМ fw выбрана равной 23 бита. Тогда массив слов ГМ можно рассматривать как непрерывную последовательность бит. На рис.5б. выделены слова ГМ с индексами 0,2,4,… Разберем алгоритм выборки слова ГМ из массива S в регистр или переменную R по заданному индексу i (команда MovSR R,S,i)(рис.6).
S[i] – слово ГМ S байт байт байт байт байт байт байт байт
fw разрядов Рис.6. Схема копирования слова ГМ в регистр или переменную.
Поскольку значение fw заранее неизвестно, выбираем наиболее универсальный алгоритм побитового копирование S[i] -> R. Выделение и копирование битов ведется от конца к началу с помощью двух двоичных масок maskS и maskR. Вначале maskS настраивается на последний бит S[i] (см. макроопределение InitMov). Адрес этого бита вычисляется по формуле A = fw*(i+1)-1 и представляет величину битового смещения в S, младшие 3 бита которого являются номером бита в байте, а старшие биты – смещением для этого байта. Таким образом, позиция «1» в maskS настраивается на выделение последнего бита слова ГМ в S. Аналогично позиция «1» в maskR соответствует младшему разряду R. После копирования очередного бита maskS и maskR подвергаются циклическому сдвигу влево настраиваясь на следующий бит. Когда биты очередного байта S или R скопированы, происходит уменьшение адреса этого байта. Момент уменьшения адреса определяется по единичному состоянию флага CF, в котором, как известно, дублируется выдвигаемый бит при циклическом сдвиге маски. Очевидно, что в общем случае, уменьшение адреса байта S или R может происходить асинхронно. Алгоритмы выборки и записи слова ГМ во многом совпадают, поэтому их общие части объединены в макрокоманде InitMov. В алгоритме выборки R предварительно обнуляется, поэтому если бит S в «1», то соответствующий бит R устанавливается в «1» командой OR. При записи (макрокоманда MovRS) копирование сводится к инвертированию некоторых бит S. Действительно, если соответствующие биты S и R совпадают, то копирования не нужно. Если же они имеют противоположные значения, то требуется инвертировать бит S. На рис.7 приведены значения слов ГМ после выборки их из области памяти, показанной на рис.5б.
0F19E0 142E2F 2271DB 01E07B 203580 02DC1E 749E31 390000 66885A 00ADC0
Рис.7. 23-разрядные слова ГМ в 16 с/c после их выборки из массива.
Алгоритмы остальных макрокоманд несложные и достаточно подробно прокомментированы в макроопределениях, поэтому предлагается изучить их самостоятельно. Все макроопределения помещены в файл macros.inc и подключаются к головной программе директивой include. Макрокоманда InitRealComputer осуществляет настройку программы ГМ для ее выполнения на реальной ЭВМ. Макроопрделения для команд ГМ. ;-------------------------------------------------------------- InitRealComputer MACRO .286 fw = 23; разряность слова ГМ; fw = 8..255 fb = 8; разряность байта kByte = fw/fb - ((fw - (fw/fb)*fb) GT 0); к-во байт для хранения 1 слова ГМ ; --2-- 23 ----16---- ; -------7-------- ; ----- --------true---------- (true= -1, false=0) ;при fw=23 2 - (-1) = 3; kByte=3 EndLine EQU 10,13,'$'; код перевода строки при выводе EndSTR EQU ' ','$'; признак конца строки ENDM ;-------------------------------------------------------------- CONSTsection MACRO ENDM ;-------------------------------------------------------------- STACKsection MACRO n; описание стека Stack1 SEGMENT STACK dw n*kByte dup (?) Stack1 ENDS ENDM ;-------------------------------------------------------------- DATAsection MACRO; описание сегмента данных Data1 SEGMENT ENDM ;-------------------------------------------------------------- ENDdata MACRO; описание конца сегмента данных Data1 ENDS ENDM ;-------------------------------------------------------------- CODEsection MACRO; описание сегмента кода Code1 SEGMENT ENDM ;-------------------------------------------------------------- FINISH MACRO; описание завершения программы ret Primer endp ENDM ;-------------------------------------------------------------- ENDcode MACRO; описание конца сегмента кода Code1 ENDS END Primer ENDM ;-------------------------------------------------------------- START MACRO; стандартная инициализация EXE-программы Assume ds:Data1,ss:Stack1,cs:Code1 Primer PROC far push ds xor ax,ax push ax mov ax,Data1 mov ds,ax push ds;ds и es будут указывать на наш сегмент данных, pop es;это необходимо для использования цепочечных команд ENDM ;-------------------------------------------------------------- DW_ MACRO Name,n; описание слова ГМ в памяти РМ IFB <n>; если параметр n не указан, Name db kByte Dup (0); то резервируется 1 слово ГМ, ELSE; иначе Name db n*kByte Dup (0); резервируется n слов ГМ, ENDIF ENDM ;-------------------------------------------------------------- DB_ MACRO Name,str,n; описание строки ГМ в памяти РМ IFB <n>; если параметр n не указан Name db str; то резервируется строка со значением str ELSE; иначе Name db n*kByte Dup (str); резервируется (n*kByte) байт со значением str ENDIF ENDM ;-------------------------------------------------------------- DF_ MACRO Name; резервируем слово для флагового DW_ FF; регистра ГМ и присваиваем имя Name Name EQU FF+kByte-1; его последнему байту ENDM ;-------------------------------------------------------------- MovI MACRO R,jj ; пересылка непосредственного значения jj в R ГМ; диапазон jj = 0..255 ClReg R; очистка R mov byte ptr R+kByte-1,jj;jj -> мл. байт R ГМ ENDM ;-------------------------------------------------------------- Mov_ MACRO Rd,Rs; пересылка Rs -> Rd j5=0; j5 играет роль смещения REPT kByte; цикл копирования mov al,Rs+j5; mov Rd+j5,al; j5=j5+1; ENDM; ENDM ;-------------------------------------------------------------- CLReg MACRO Reg; очистка регистра push di; сохранить di в стеке ; настройка цепочечной команды (ЦК) stosb lea di,Reg; прм - es:di cld; флаг направления DF:=0 xor al,al; очистка аккумулятора mov cx,kByte; cx:=к-во повторения ЦК REP STOSB; ЦК записи pop di; восстановление di из стека ENDM ;--------------------------------------------------------------- CMP_ MACRO Rd,Rs; сравнение Rd с Rs. (Rd-Rs)-> флаги LOCAL mE,mG,mL,all; описание локальных меткок ; настройка цепочечной команды (ЦК) CMPSB lea di,Rs; прм es:di lea si,Rd; ист ds:si cld; флаг направления DF:=0 mov cx,kByte; cx:=к-во повторений ЦК mov byte ptr FL,0; обнуление флагового регистра REP CMPSB; ЦК побайтного сравнения je mE; If Rd=Rs Then mE ja mG; If Rd>Rs Then mG Else mL mL: or FL,maskL; FL:="меньше" jmp all; завершение сравнения mE: or FL,maskE; FL:="равно" jmp all; завершение сравнения mG: or FL,maskG; FL:="больше" all: ENDM ;--------------------------------------------------------------- JUMP MACRO metka; безусловный переход на metka jmp metka ENDM ;--------------------------------------------------------------- gmEQ MACRO metka; условный переход по "равно" LOCAL m1 test FL,maskE; проверка флага "равно" jz m1; If "равно" Then metka jmp metka; Else m1 m1: ENDM ;--------------------------------------------------------------- gmGT MACRO metka; условный переход по "больше" LOCAL m1 test FL,maskG; проверка флага "больше" jz m1; If "больше" Then metka jmp metka; Else m1 m1: ENDM ;--------------------------------------------------------------- gmGE MACRO metka; условный переход по "больше или равно" LOCAL m1 test FL,maskE OR maskG; проверка флагов "больше" и "равно" jz m1; If "больше или равно" Then metka jmp metka; Else m1 m1: ENDM ;--------------------------------------------------------------- Move MACRO dest,source,n ;копирование блока памяти source -> dest; n число копируемых слов ГМ ; настройка цепочечной команды (ЦК) MOVSB push es; сохранение es и ds push ds; mov ax,seg dest; сегм. адрес прм -> es mov es,ax; mov di,offset dest; прм es:di mov ax,seg source; сегм. адрес ист -> ds mov ds,ax; mov si,offset source; ист ds:si cld; DF:=0 mov cx,n*kByte; уст-ка сч-ка цикла копирования REP MOVSB; ЦК копирования pop ds; восстановление es и ds pop es; ENDM ;--------------------------------------------------------------- INC_ MACRO R; инкремент R (R:=R+1) j1 = kByte-1; j1:= смещение для последнего байта add R+j1,1; прибавляем 1 к мл. байту; перенос -> CF REPT kByte-1; цикл распространения возможного j1 = j1 - 1; преноса в старшие байты R adc R+j1,0; прм:=прм+ист+CF ENDM ENDM ;--------------------------------------------------------------- InitMov MACRO R,S,i ;предварит. настройка передачи R <--> S[i]; i - индекс слова ГМ в S lea di,R+kByte-1; адрес последнего байта R -> di lea si,S; адрес S -> si mov al,fw; далее вычисляется адр. байта, содержащего mov dl,i+kByte-1; последние биты S[i]; i -> dl inc dl; (i+1) -> dl mul dl; fw*(i+1) -> ax dec ax; получили адрес последнего бита слова ГМ mov bx,ax; в ax мл. 3 разряда определяют № бита в байте shr bx,3; в bx выделили адрес байта add si,bx; получаем смещение этого байта в сегм. данных and al,7; al <- № последнего бита в байте mov cl,al; далее формируем маску для выделения mov dl,80h; этого бита shr dl,cl; maskS -> dl для выделения бит S mov dh,1; maskR -> dh для выделения бит R ENDM ;--------------------------------------------------------------- MovSR MACRO R,S,i; пересылка S[i] -> R ;пересылка побитовая, начиная с последних бит S[i] от конца к началу LOCAL S_to_R,kon,no1,no2; локальные метки InitMov R,S,i; начальная настройка копирования CLReg R; 0 -> R mov cx,fw; fw -> cx к-во копируемых бит S_to_R:; цикл копирования test [si],dl; проверили состояние текущ. бита S[i] jz kon; If S_bit=0 Then goto kon (don't copy) or [di],dh; Else R_bit:= 1 kon: rol dl,1; циклич. сдвиг маски dl влево jnc no1; If CF=0 Then адр.тек. байта S[i] не менять dec si; Else уменьшаем адр. байта S[i] no1: rol dh,1; циклич. сдвиг маски dh влево jnc no2; If CF=0 Then адр.текущ. байта R не менять dec di; Else уменьшаем адр. байта R no2: loop S_to_R; конец цикла ENDM ;--------------------------------------------------------------- MovRS MACRO S,R,i; пересылка R -> S[i] ; копирование побитовое, начиная с последних бит R от конца к началу ; если копируемый бит R совпадает с соотв. битом S[i], то нет копирования, ; если биты не совпадают, то инвертируется соотв. бит S[i] LOCAL R_to_S,kon,m1x,m0x,toXOR,no1,no2; локальные метки InitMov R,S,i; начальная настройка копирования mov cx,fw; fw -> cx к-во копируемых бит R_to_S:; цикл копирования test [si],dl; проверили состояние текущ. бита S[i] jz m0x; If S_bit=0 Then m0x m1x: test [di],dh; Else If R_bit=1 Then goto kon (don't copy) jnz kon; Else toXor jmp toXOR; m0x: test [di],dh; If R_bit=0 Then goto kon (don't copy) jz kon; Else toXor toXor: xor [si],dl; инвертирование бита S[i] kon: rol dl,1; циклич. сдвиг маски dl влево jnc no1; If CF=0 Then адр.тек.байта S[i]не менять dec si; Else уменьшаем адр. байта S[i] no1: rol dh,1; циклич. сдвиг маски dh влево jnc no2; If CF=0 Then адр.тек. байта R не менять dec di; Else уменьшаем адр. байта R no2: loop R_to_S; конец цикла ENDM ;--------------------------------------------------------------- New MACRO Pointer; возвращает указатель на новое слово ГМ Mov_ Pointer,ih; индекс ih -> указатель Pointer INC_ ih; ih:= ih+2 новое знач-е ih INC_ ih; ENDM ;-------------------------------------------------------------- Write MACRO txt lea dx,txt; вывод txt на экран mov ah,9h int 21h ENDM ;-------------------------------------------------------------- WriteUz MACRO t; вывод узла списка на экран (t - указатель) MovSR Rtmp,Spis,t; тек. узел -> Rtmp j3=0; j3 - смещение в Rtmp REPT kByte; цикл перевода Rtmp в 16с/c xor bx,bx; 0 -> bx mov bl,Rtmp+j3; взяли текущ. байт в bl shr bl,4; выделили ст. тетраду mov al,num[bx]; взяли соотв-ю цифру из табл. num mov Output+2*j3,al; и поместили в буфер вывода mov bl,Rtmp+j3; еще раз взяли этот байт and bl,0Fh; выделили мл. тетраду mov al,num[bx]; взяли соотв-ю цифру из табл. num mov Output+2*j3+1,al; и поместили в буфер вывода j3=j3+1; переход к след. байту Rtmp ENDM; конец цикла Write Output; вывод буфера ENDM ;-------------------------------------------------------------- ClrScr MACRO; очистка экрана mov ah,06; код функции mov al,0; mov bh,07; mov dx,184Fh; mov cx,0; int 10h; mov ah,02; установка курсора в поз. (0,0) mov bh,0; (ah:=03 --> получить коорд. курсора) mov dx,0; dh - №строки, dl - №столбца, int 10h; ENDM ;-------------------------------------------------------------- ReadKey MACRO; ждать нажатия клавиши mov ah,0; в al получим код нажатой клавиши int 16h ENDM ;------------------------------------------------------------
2.5.Технология подготовки программы к выполнению и ее отладка. Тексты головной программы и файла с макросами могут набираться в любом текстовом редакторе. Так как отладка связана с многократными запусками транслятора, компановщика и отладчика, желательно предварительно создать пакет задания в виде ВАТ-файла, например: Файл primer.bat tasm /zi /l primer,,primer tlink /v primer td primer rem primer
Ключи /zi и /v необходимы для сохранения отладочной информации в ехе-файле, которая в свою очередь используется отладчиком td.exe, ключ /l позволяет создать файл primer.lst с листингом, содержащим макрорасширения после макроподстановок, а также ошибки времени трансляции. Основные отладочные действия выполняются с помощью стандартного отладчика td.exe. С практической точки зрения желательно все файлы, связанные с созданием и отладкой программы сконцентрировать в одной директории, например:
tasm.exe tlink.exe td.exe dpmimem.dll dpmiload.exe primer.asm macros.inc primer.bat
Результаты работы программы Работа программы демонстрируется на рис.8. В качестве исходных данных используется объектный код программы Primer.
Отсортированный список
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-12-13; просмотров: 166; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.15.49.90 (0.007 с.) |