Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсач гофаров 5 вариант.doc
Скачиваний:
6
Добавлен:
03.05.2019
Размер:
608.77 Кб
Скачать

2.4.2. Макроопрделения для команд гм.

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

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

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