Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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 ;------------------------------------------------------------
|