- •Методические указания
- •«Моделирование программы гипотетической машины с помощью макросредств»
- •1.Введение.
- •2.Пример выполнения курсовой работы.
- •2.1.Задание.
- •2.2.Анализ задачи и разработка алгоритма.
- •2.3.Разработка программы для гм.
- •2.3.1. Определение данных.
- •2.3.2.Определие команд гм.
- •2.4.Моделирование программы гм на реальной эвм.
- •2.4.1.Выборка и запиь слов гм.
- •2.4.2. Макроопрделения для команд гм.
- •2.5.Технология подготовки программы к выполнению и ее отладка.
- •2.6. Результаты работы программы
- •3. Варианты курсовой работы
- •4.Приложения
- •2. Блоки повторения
- •2.1. Rept-блоки
- •Irpc-блоки
- •2.4 Макрооператоры
- •3. Макросы
- •113.1. Макроопределения
- •3.1. Макрокоманды
- •3. 3. Макроподстановки и макрорасширения
- •3. 5. Макросы и процедуры
- •3. 6. Определение макроса через макрос
- •3.7. Директива local
- •113.8. Директива ехiтм
- •3. 9. Переопределение и отмена макросов
- •4. Условное ассемблирование
- •4. 1. Директивы if и ife
- •4.2. Операторы отношения. Логические операторы
- •4.3. Директивы ifidn ,ifdif , ifb и ifnb
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
;------------------------------------------------------------