Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;***************************************************************************************************
- ; MOPL1.ASM - учебный пример для выполнения
- ; лабораторной работы N1 по машинно-ориентированному программированию
- ;***************************************************************************************************
- .MODEL SMALL
- .STACK 200h
- .386
- ; Используются декларации констант и макросов
- INCLUDE MOPL1.INC
- INCLUDE MOPL1.MAC
- ; Декларации данных
- .DATA
- SLINE DB 78 DUP (CHSEP), 0
- REQ DB "Фимилия И.О.: ",0FFh
- MINIS DB "МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ",0
- ULSTU DB "УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ",0
- DEPT DB "Кафедра вычислительной техники",0
- MOP DB "Машинно-ориентированное программирование",0
- LABR DB "Лабораторная работа N 1",0
- REQ1 DB "Замедлить время работы в тактах(-), ускорить время работы в тактах (+),", 0
- ;------------- Новые переменные ------------------------------------------------------------------
- REQ2 DB "вычислить функцию (f), выйти(ESC)?", 0FFh
- ;-------------------------------------------------------------------------------------------------
- EMPTYS DB 0
- BUFLEN = 70
- BUF DB BUFLEN
- LENS DB ?
- SNAME DB BUFLEN DUP (0)
- BUF_LEN_NUMBER = 21
- BUF_NUMBER DB BUF_LEN_NUMBER
- LEN_NUMBER DB ?
- W_NUMBER DB BUF_LEN_NUMBER DUP (0)
- X DD 0
- Y DD 0
- Z DD 0
- PAUSE DW 0, 0 ; младшее и старшее слова задержки при выводе строки
- TI DB LENNUM+LENNUM/2 DUP(?), 0 ; строка вывода числа тактов
- ; запас для разделительных "`"
- ARRAY_ALF DB 95 DUP(?)
- i db 0
- j dw 0
- CHAR DB 0
- ;========================= Программа =========================
- .CODE
- ; Макрос заполнения строки LINE от позиции POS содержимым CNT объектов,
- ; адресуемых адресом ADR при ширине поля вывода WFLD
- BEGIN LABEL NEAR
- ; инициализация сегментного регистра
- MOV AX, @DATA
- MOV DS, AX
- ; инициализация задержки
- MOV PAUSE, PAUSE_L
- MOV PAUSE+2,PAUSE_H
- JMP MAIN
- PUTLS REQ ; запрос имени
- ; ввод имени
- LEA DX, BUF
- CALL GETS
- @@L: ; циклический процесс повторения вывода заставки
- ; вывод заставки
- ; ИЗМЕРЕНИЕ ВРЕМЕНИ НАЧАТЬ ЗДЕСЬ
- FIXTIME
- PUTL EMPTYS
- PUTL SLINE ; разделительная черта
- PUTL EMPTYS
- PUTLSC MINIS ; первая
- PUTL EMPTYS
- PUTLSC ULSTU ; и
- PUTL EMPTYS
- PUTLSC DEPT ; последующие
- PUTL EMPTYS
- PUTLSC MOP ; строки
- PUTL EMPTYS
- PUTLSC LABR ; заставки
- PUTL EMPTYS
- ; приветствие
- PUTLSC SNAME ; ФИО студента
- PUTL EMPTYS
- ; разделительная черта
- PUTL SLINE
- ; ИЗМЕРЕНИЕ ВРЕМЕНИ ЗАКОНЧИТЬ ЗДЕСЬ
- DURAT ; подсчет затраченного времени
- ; Преобразование числа тиков в строку и вывод
- LEA DI, TI
- CALL UTOA10
- PUTL TI ; вывод числа тактов
- ; обработка команды
- PUTL REQ1
- ;------Вывод своих строк с действиями -------------------
- PUTL REQ2
- ;--------------------------------------------------------
- CALL GETCH
- CMP AL, 'f'
- JNE NOTF
- MAIN:
- lea bx, ARRAY_ALF
- ARRAY_INIT:
- mov [bx], 0;Обнуление
- call PRINT_NUMBER_EBX
- inc bx
- loop ARRAY_INIT
- FUN_READ_NUMBER:
- mov si, 0
- mov i, 0
- READLN:
- ;Начало — Считывание, определение индекса масссива
- xor eax, eax
- xor ebx, ebx
- CALL GETECH
- SUB AL, 20h
- mov CHAR, al
- PUTL EMPTYS
- xor ebx, ebx
- mov bl, CHAR
- call PRINT_NUMBER_EBX
- PUTL EMPTYS
- ;Конец — Считывание, определение индекса масссива
- ;Начало — Если это не символ
- cmp CHAR, 0
- JB COUNTING_CHARACTERS
- cmp CHAR, 95
- JA COUNTING_CHARACTERS
- ;Конец — Если это не символ
- ;Начало — получение индекса для увеличения счётчика
- xor eax, eax
- xor ebx, ebx
- mov al, CHAR
- mov si, ax
- mov bx, si
- call PRINT_NUMBER_EBX
- PUTL EMPTYS
- ;Конец — получение индекса для увеличения счётчика
- xor eax, eax
- xor ebx, ebx
- mov bl, ARRAY_ALF[si]
- call PRINT_NUMBER_EBX
- PUTL EMPTYS
- inc bl
- mov ARRAY_ALF[si], bl
- call PRINT_NUMBER_EBX
- PUTL EMPTYS
- ;mov al, ARRAY_ALF[si]
- ;xor ebx, ebx
- ;mov bl, al
- ;call PRINT_NUMBER_EBX
- ;mov si, ax
- ;add ARRAY_ALF[si], 1
- ;xor ax, ax
- ;mov si, 0
- ;mov AL, ARRAY_ALF[si]
- ;CALL PUTC
- JMP READLN
- JMP @@E
- COUNTING_CHARACTERS:
- JMP @@E
- NOTF: CMP AL, '-' ; удлиннять задержку?
- JNE CMINUS
- INC PAUSE+2 ; добавить 65536 мкс
- JMP @@L
- CMINUS: CMP AL, '+' ; укорачивать задержку?
- JNE CEXIT
- CMP WORD PTR PAUSE+2, 0
- JE BACK
- DEC PAUSE+2 ; убавить 65536 мкс
- BACK: JMP @@L
- CEXIT: CMP AL, CHESC
- JE @@E
- TEST AL, AL
- JNE BACK
- CALL GETCH
- JMP @@L
- ; Выход из программы
- @@E: EXIT
- EXTRN PUTSS: NEAR
- EXTRN PUTC: NEAR
- EXTRN GETCH: NEAR
- EXTRN GETECH: NEAR
- EXTRN GETS: NEAR
- EXTRN SLEN: NEAR
- EXTRN PRINT_NUMBER_EBX: NEAR
- EXTRN READ_NUMBER_EBX: NEAR
- EXTRN UTOA10: NEAR
- END BEGIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement