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



ЗНАЕТЕ ЛИ ВЫ?

Моделирование программы ГМ на реальной эвм.

Поиск

Выборка и запиь слов ГМ.

Чтобы выполнить программу на реальной ЭВМ необходимо для всех ее операторов написать макроопределения. На их сложность и объем в первую очередь влияет величина 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

байт байт байт байт байт байт байт байт

                     
               
  ß адрес байта S ß 00010000 maskS      
      ß rotate        
  ß адрес байтаR ß 00000001 maskR      
      ß rotate        
  R              
                                 

 

 

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 Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.139.239.135 (0.008 с.)