Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;***************************************************************************************************
- ; MLAB1.ASM - учебный пример для выполнения
- ; лабораторной работы N2 по машинно-ориентированному программированию
- ; 10.09.02: Негода В.Н.
- ;***************************************************************************************************
- .MODEL SMALL
- .STACK 200h
- .386
- ; Используются декларации констант и макросов
- INCLUDE MLAB1.INC
- INCLUDE MLAB1.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 2",0
- REQ1 DB "Замедлить(-),ускорить(+), перейти к тестированию(f), выйти(ESC)? ",0FFh
- TACTS DB "Время работы в тактах: ",0FFh
- EMPTYS DB 0
- BUFLEN = 70
- BUF DB BUFLEN
- LENS DB ?
- SNAME DB BUFLEN DUP (0)
- PAUSE DW 0, 0 ; младшее и старшее слова задержки при выводе строки
- TI DB LENNUM+LENNUM/2 DUP(?), 0 ; строка вывода числа тактов
- LAB2_MSG_IN_KEYWORD DB "Введите ключевое слово",0
- LAB2_MSG_IN_WORDS DB "Введите последовательность слов",0
- LAB2_MSG_N_WORD DB "Слово номер: ","$"
- LAB2_MSG_N_ERR DB "Слово не найдено",0
- WORD_SIZE equ 10
- KEYWORD_SIZE DB 0
- KEYWORD_DEFAULT DB WORD_SIZE dup(0)
- KEYWORD_BIN DB WORD_SIZE dup(0)
- WORDS_ARRAY_SIZE equ 10
- WORDS_ARRAY DB WORDS_ARRAY_SIZE DUP(WORD_SIZE dup(0))
- TEMP DB 0
- IN_TYPE DB 0
- IN_TYPE_MSG DB "Нажмите любую кнопку",0
- FILENAME db "file.txt", 0
- HANDLE dw ?
- lnt=$-buf
- ; запас для разделительных "`"
- ;========================= Программа =========================
- .CODE
- ; Макрос заполнения строки LINE от позиции POS содержимым CNT объектов,
- ; адресуемых адресом ADR при ширине поля вывода WFLD
- GET_STRING_STD PROC ; функция получения строки в массив из консоли
- mov TEMP, 0
- input:
- CALL GETCH
- CALL PUTC
- CMP AL, 13
- JE next_in
- mov [di], AL
- inc DI
- inc TEMP
- CMP TEMP, WORD_SIZE
- JL input
- next_in:
- MOV AL, 0Ah
- CALL PUTC
- mov dx,WORD_SIZE
- mov al, TEMP
- mov ah, 0
- sub dx, ax
- mov TEMP, 0
- add di, dx
- dec cx
- cmp cx,0
- jg input
- RET
- GET_STRING_STD ENDP
- GET_STRING_FIN PROC ;функция получения строки в массив из файла
- mov TEMP, 0
- input_file:
- mov ah,3fh ; чтение из файла
- push cx
- mov cx,1 ; 1 байт
- lea dx,buf ; в buf
- int 21h
- cmp ax,cx ; если достигнуть EoF или ошибка чтения
- jnz close
- pop cx
- mov al, buf[0]
- CMP AL, 13
- JE next_in_file
- CALL PUTC
- mov [di], AL
- inc DI
- inc TEMP
- CMP TEMP, WORD_SIZE
- JLE input_file
- next_in_file:
- mov ah,3fh ;чтение символа 10
- push cx
- mov cx,1
- lea dx,buf
- int 21h
- cmp ax,cx
- jnz close
- pop cx
- MOV AL, 0Ah
- CALL PUTC
- mov dx,WORD_SIZE
- mov al, TEMP
- mov ah, 0
- sub dx, ax
- mov TEMP, 0
- add di, dx
- dec cx
- cmp cx,0
- jg input_file
- RET
- GET_STRING_FIN ENDP
- formatAX proc near ; функция превращения значения ax в строку, которая лежит в di
- push ax cx dx si di
- mov cx, 4 ; 4 цифры в шестнадцатеричном формате
- mov si, dx ; si - указатель на буфер
- mov dl, 0 ; флаг, указывающий на начало числа
- next_digit:
- rol ax, 4 ; сдвигаем значение регистра для получения следующей цифры
- mov dl, al ; берем младшую часть результата
- and dl, 0Fh ; оставляем только младшие буквы
- cmp dl, 0
- je skip_zero
- add dl, '0' ; преобразуем в символ
- cmp dl, '9'
- jbe skip_add
- add dl, 7 ; для A-F
- skip_add:
- mov [si], dl ; сохраняем цифру в буфере
- inc si
- skip_zero:
- loop next_digit
- mov byte ptr [si], 0 ; завершаем строку в буфере
- pop di si dx cx ax
- ret
- formatAX endp
- findSring proc near ; поиск номер слова di в строке si
- mov cx, 1
- mov dx,0
- find_word:
- mov bl,[si]
- cmp bl,[di]
- JNE error_word
- inc dx
- inc di
- inc si
- cmp dx,WORD_SIZE
- JGE end_find
- jmp find_word
- error_word:
- sub di, dx
- inc cx
- mov dx, 0
- lea si, WORDS_ARRAY
- mov bx, cx
- dec bx
- imul bx, WORD_SIZE
- add si, bx
- cmp cx, WORDS_ARRAY_SIZE + 1
- JL find_word
- end_find:
- ret
- findSring endp
- BEGIN LABEL NEAR
- ; инициализация сегментного регистра
- MOV AX, @DATA
- MOV DS, AX
- ; инициализация задержки
- MOV PAUSE, PAUSE_L
- MOV PAUSE+2,PAUSE_H
- 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 TACTS
- PUTL TI ; вывод числа тактов
- ; обработка команды
- PUTL REQ1
- CALL GETCH
- CMP AL, '-' ; удлиннять задержку?
- JNE CMINUS
- INC PAUSE+2 ; добавить 65536 мкс
- JMP @@L
- CMINUS: CMP AL, '+' ; укорачивать задержку?
- JNE LAB2_CFUNC
- CMP WORD PTR PAUSE+2, 0
- JE BACK
- DEC PAUSE+2 ; убавить 65536 мкс
- BACK: JMP @@L
- LAB2_CFUNC:
- CMP AL, 'f'
- JE LAB2_CODE
- CMP AL, 'F'
- JE LAB2_CODE
- JMP CEXIT
- LAB2_CODE:
- ; обнуление массива KEYWORD_DEFAULT
- mov di, OFFSET KEYWORD_DEFAULT
- mov cx, WORD_SIZE
- xor al, al ; Заполняем AL нулем
- fill_keyword_default:
- stosb
- loop fill_keyword_default
- ; обнуление массива KEYWORD_BIN
- mov di, OFFSET KEYWORD_BIN
- mov cx, WORD_SIZE
- xor al, al ; Заполняем AL нулем
- fill_keyword_bin:
- stosb
- loop fill_keyword_bin
- ; обнуление массива WORDS_ARRAY
- mov di, OFFSET WORDS_ARRAY
- mov cx, WORDS_ARRAY_SIZE * WORD_SIZE
- xor al, al ; Заполняем AL нулем
- fill_words_array:
- stosb
- loop fill_words_array
- ; начало программы
- PUTL IN_TYPE_MSG
- CALL GETCH ; Выбор тип ввода
- CALL PUTC
- mov IN_TYPE,AL
- sub IN_TYPE,'0'
- CMP IN_TYPE,1
- JNE LAB2_MAIN_CODE
- mov ah,3Dh ; Функция DOS 3Dh (открытие файла)
- xor al,al ; Режим открытия - только чтение
- lea dx,FILENAME ; Имя файла
- xor cx,cx ; Нет атрибутов - обычный файл
- int 21h ; Обращение к функции DOS
- jc CEXIT ; Если поднят флаг С, то ошибка открытия
- mov bx,ax ; Копируем в bx указатель файла
- xor cx,cx
- xor dx,dx
- mov ax,4200h
- int 21h ; Идем к началу файла
- LAB2_MAIN_CODE:
- MOV ECX, 5
- MOV AL, 0Ah
- CALL PUTC
- PUTL LAB2_MSG_IN_KEYWORD
- mov cx, 1
- lea di, KEYWORD_DEFAULT
- cmp IN_TYPE,1 ; Проверка на ввод с консоли или с клавиатуры
- JNE STD_IN_1
- CALL GET_STRING_FIN
- JMP FILE_IN_1
- STD_IN_1:
- CALL GET_STRING_STD
- FILE_IN_1:
- push bx ; В стек временно закидывается указатель на файл
- PUTL LAB2_MSG_IN_WORDS ; Используется bx в функции, поэтому надо сохранить указатель на файл
- pop bx
- mov cx, WORDS_ARRAY_SIZE
- lea di, WORDS_ARRAY
- cmp IN_TYPE,1 ; Проверка на ввод с консоли или с клавиатуры
- JNE STD_IN_2
- CALL GET_STRING_FIN
- close:
- mov ah,3eh ; Закрытие файла после ввода
- int 21h
- jmp FILE_IN
- STD_IN_2:
- CALL GET_STRING_STD
- FILE_IN:
- lea di, KEYWORD_DEFAULT
- mov ax, 0
- mov cx, WORD_SIZE
- is_bin_loop: ; Проверка на то что это бинарное число или нет
- shl ax,1
- cmp byte ptr [di], 0 ; Проверка на конец слова
- JE clear_cx
- cmp byte ptr [di],"0"
- JE is_bin_loop_end
- cmp byte ptr [di],"1"
- JE is_bin_loop_end
- JMP start_find
- is_bin_loop_end:
- add al, byte ptr [di]
- sub ax,'0'
- dec cx
- inc di
- cmp cx, 0
- JG is_bin_loop
- JLE format_ax
- clear_cx:
- shr ax, 1 ; Убрать лишнее смещение после конца слова
- mov cx,0
- format_ax:
- push ax
- lea dx, KEYWORD_BIN
- call formatAX
- pop ax
- start_find:
- lea si, WORDS_ARRAY
- lea di, KEYWORD_DEFAULT
- CALL findSring
- push cx
- lea si, WORDS_ARRAY
- lea di, KEYWORD_BIN
- CALL findSring
- xor ax,ax
- pop ax
- cmp ax,cx
- JGE ax_greater
- ax_less: ; Поиск минимального номера слова
- mov cx, ax
- ax_greater:
- cmp cx, WORDS_ARRAY_SIZE
- JG LAB2_EXIT_ERR
- xor dx, dx
- lea dx, LAB2_MSG_N_WORD
- mov ah, 09h
- int 21h
- mov ax, cx ; Вывод ax в десятичном формате
- mov bx, 10
- mov si, 0
- convert_loop:
- xor dx, dx
- div bx
- add dl, '0'
- mov BUF[si], dl
- inc si
- cmp ax, 0
- jnz convert_loop
- print_loop:
- dec si
- mov dl, BUF[si]
- mov ah, 02h
- int 21h
- cmp si, 0
- jnz print_loop
- JMP CEXIT
- LAB2_EXIT_ERR:
- PUTL LAB2_MSG_N_ERR
- 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 GETS: NEAR
- EXTRN SLEN: NEAR
- EXTRN UTOA10: NEAR
- END BEGIN
Add Comment
Please, Sign In to add comment