Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






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





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

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

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

 

Date: 2015-10-21; view: 279; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию