100hahahaha

Untitled

May 24th, 2024
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;***************************************************************************************************
  2. ; MLAB1.ASM - учебный пример для выполнения
  3.  
  4. ; лабораторной работы N2 по машинно-ориентированному программированию
  5. ; 10.09.02: Негода В.Н.
  6. ;***************************************************************************************************
  7. .MODEL SMALL
  8. .STACK 200h
  9. .386
  10. ;       Используются декларации констант и макросов
  11. INCLUDE MLAB1.INC    
  12. INCLUDE MLAB1.MAC
  13.  
  14. ; Декларации данных
  15.         .DATA    
  16. SLINE    DB    78 DUP (CHSEP), 0
  17. REQ    DB    "Фамилия И.О.: ",0FFh
  18. MINIS    DB    "МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ",0
  19. ULSTU    DB    "УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ",0
  20. DEPT    DB    "Кафедра вычислительной техники",0
  21. MOP    DB    "Машинно-ориентированное программирование",0
  22. LABR    DB    "Лабораторная работа N 2",0
  23. REQ1    DB      "Замедлить(-),ускорить(+), перейти к тестированию(f), выйти(ESC)? ",0FFh
  24. TACTS   DB    "Время работы в тактах: ",0FFh
  25. EMPTYS    DB    0
  26. BUFLEN = 70
  27. BUF    DB    BUFLEN
  28. LENS    DB    ?
  29. SNAME    DB    BUFLEN DUP (0)
  30. PAUSE    DW    0, 0 ; младшее и старшее слова задержки при выводе строки
  31. TI    DB    LENNUM+LENNUM/2 DUP(?), 0 ; строка вывода числа тактов
  32. LAB2_MSG_IN_KEYWORD DB "Введите ключевое слово",0
  33. LAB2_MSG_IN_WORDS DB "Введите последовательность слов",0
  34. LAB2_MSG_N_WORD DB "Слово номер: ","$"
  35. LAB2_MSG_N_ERR DB "Слово не найдено",0
  36. WORD_SIZE equ 10
  37. KEYWORD_SIZE DB 0
  38. KEYWORD_DEFAULT DB WORD_SIZE dup(0)
  39. KEYWORD_BIN DB WORD_SIZE dup(0)
  40. WORDS_ARRAY_SIZE equ 10
  41. WORDS_ARRAY DB WORDS_ARRAY_SIZE DUP(WORD_SIZE dup(0))
  42. TEMP DB 0
  43. IN_TYPE DB 0
  44. IN_TYPE_MSG DB "Нажмите любую кнопку",0
  45. FILENAME    db  "file.txt", 0
  46. HANDLE    dw  ?
  47. lnt=$-buf
  48. ; запас для разделительных "`"
  49.  
  50. ;========================= Программа =========================
  51. .CODE
  52. ; Макрос заполнения строки LINE от позиции POS содержимым CNT объектов,
  53. ; адресуемых адресом ADR при ширине поля вывода WFLD
  54. GET_STRING_STD PROC     ; функция получения строки в массив из консоли
  55.     mov TEMP, 0
  56. input:
  57.     CALL GETCH
  58.     CALL PUTC
  59.     CMP AL, 13
  60.     JE next_in
  61.     mov [di],  AL
  62.     inc DI
  63.     inc TEMP
  64.     CMP TEMP, WORD_SIZE
  65.     JL input
  66. next_in:
  67.     MOV AL, 0Ah
  68.     CALL PUTC
  69.     mov dx,WORD_SIZE
  70.     mov al, TEMP
  71.     mov ah, 0
  72.     sub dx, ax
  73.     mov TEMP, 0
  74.     add di, dx
  75.     dec cx
  76.     cmp cx,0
  77.     jg input
  78.     RET
  79. GET_STRING_STD ENDP
  80.  
  81. GET_STRING_FIN PROC     ;функция получения строки в массив из файла
  82.    mov TEMP, 0
  83. input_file:
  84.     mov ah,3fh              ; чтение из файла
  85.     push cx
  86.     mov cx,1                ; 1 байт
  87.     lea dx,buf              ; в buf
  88.     int 21h
  89.     cmp ax,cx               ; если достигнуть EoF или ошибка чтения
  90.     jnz close
  91.     pop cx
  92.     mov al, buf[0]
  93.     CMP AL, 13
  94.     JE next_in_file
  95.     CALL PUTC
  96.     mov [di],  AL
  97.     inc DI
  98.     inc TEMP
  99.     CMP TEMP, WORD_SIZE
  100.     JLE input_file
  101. next_in_file:
  102.     mov ah,3fh              ;чтение символа 10
  103.     push cx
  104.     mov cx,1
  105.     lea dx,buf      
  106.     int 21h
  107.     cmp ax,cx
  108.     jnz close
  109.    
  110.     pop cx
  111.     MOV AL, 0Ah
  112.     CALL PUTC
  113.  
  114.     mov dx,WORD_SIZE
  115.     mov al, TEMP
  116.     mov ah, 0
  117.     sub dx, ax
  118.  
  119.     mov TEMP, 0
  120.     add di, dx
  121.     dec cx
  122.     cmp cx,0
  123.     jg input_file
  124.     RET
  125. GET_STRING_FIN ENDP
  126.  
  127. formatAX proc near      ; функция превращения значения ax в строку, которая лежит в di
  128.     push ax cx dx si di
  129.     mov cx, 4               ; 4 цифры в шестнадцатеричном формате
  130.     mov si, dx              ; si - указатель на буфер
  131.     mov dl, 0               ; флаг, указывающий на начало числа
  132. next_digit:
  133.     rol ax, 4               ; сдвигаем значение регистра для получения следующей цифры
  134.     mov dl, al              ; берем младшую часть результата
  135.     and dl, 0Fh             ; оставляем только младшие буквы
  136.     cmp dl, 0
  137.     je skip_zero
  138.     add dl, '0'             ; преобразуем в символ
  139.     cmp dl, '9'
  140.     jbe skip_add
  141.     add dl, 7               ; для A-F
  142. skip_add:
  143.     mov [si], dl            ; сохраняем цифру в буфере
  144.     inc si
  145. skip_zero:
  146.     loop next_digit
  147.     mov byte ptr [si], 0    ; завершаем строку в буфере
  148.     pop di si dx cx ax
  149.     ret
  150. formatAX endp
  151.  
  152. findSring proc near     ; поиск номер слова di в строке si
  153.     mov cx, 1
  154.     mov dx,0
  155. find_word:
  156.     mov bl,[si]
  157.     cmp bl,[di]
  158.     JNE error_word
  159.     inc dx
  160.     inc di
  161.     inc si
  162.     cmp dx,WORD_SIZE
  163.     JGE end_find
  164.     jmp find_word
  165. error_word:
  166.     sub di, dx
  167.     inc cx
  168.     mov dx, 0
  169.     lea si, WORDS_ARRAY
  170.     mov bx, cx
  171.     dec bx
  172.     imul bx, WORD_SIZE
  173.     add si, bx
  174.     cmp cx, WORDS_ARRAY_SIZE + 1
  175.     JL find_word
  176. end_find:
  177.     ret
  178. findSring endp
  179.  
  180. BEGIN    LABEL    NEAR
  181.     ; инициализация сегментного регистра
  182.     MOV    AX,    @DATA
  183.     MOV    DS,    AX
  184.     ; инициализация задержки
  185.     MOV    PAUSE,    PAUSE_L
  186.     MOV    PAUSE+2,PAUSE_H
  187.     PUTLS    REQ    ; запрос имени
  188.     ; ввод имени
  189.     LEA    DX,    BUF
  190.     CALL    GETS    
  191. @@L:    ; циклический процесс повторения вывода заставки
  192.     ; вывод заставки
  193.     ; ИЗМЕРЕНИЕ ВРЕМЕНИ НАЧАТЬ ЗДЕСЬ
  194.     FIXTIME
  195.     PUTL    EMPTYS
  196.     PUTL    SLINE    ; разделительная черта
  197.     PUTL    EMPTYS
  198.     PUTLSC    MINIS    ; первая
  199.     PUTL    EMPTYS
  200.     PUTLSC    ULSTU    ;  и  
  201.     PUTL    EMPTYS
  202.     PUTLSC    DEPT    ;   последующие
  203.     PUTL    EMPTYS
  204.     PUTLSC    MOP    ;    строки  
  205.     PUTL    EMPTYS
  206.     PUTLSC    LABR    ;     заставки
  207.     PUTL    EMPTYS
  208.     ; приветствие
  209.     PUTLSC    SNAME   ; ФИО студента
  210.     PUTL    EMPTYS
  211.     ; разделительная черта
  212.     PUTL    SLINE
  213.     ; ИЗМЕРЕНИЕ ВРЕМЕНИ ЗАКОНЧИТЬ ЗДЕСЬ
  214.     DURAT        ; подсчет затраченного времени
  215.     ; Преобразование числа тиков в строку и вывод
  216.     LEA    DI,    TI
  217.     CALL    UTOA10    
  218.     PUTL    TACTS
  219.     PUTL    TI      ; вывод числа тактов
  220.     ; обработка команды
  221.     PUTL    REQ1
  222.     CALL    GETCH
  223.     CMP    AL,    '-'    ; удлиннять задержку?
  224.     JNE    CMINUS
  225.     INC    PAUSE+2        ; добавить 65536 мкс
  226.     JMP    @@L
  227. CMINUS:    CMP    AL,    '+'    ; укорачивать задержку?
  228.     JNE    LAB2_CFUNC
  229.     CMP    WORD PTR PAUSE+2, 0        
  230.     JE    BACK
  231.     DEC    PAUSE+2        ; убавить 65536 мкс
  232. BACK:    JMP    @@L
  233. LAB2_CFUNC:
  234.     CMP AL, 'f'
  235.     JE LAB2_CODE
  236.     CMP AL, 'F'
  237.     JE LAB2_CODE
  238.     JMP CEXIT
  239. LAB2_CODE:
  240.     ; обнуление массива KEYWORD_DEFAULT
  241.     mov di, OFFSET KEYWORD_DEFAULT
  242.     mov cx, WORD_SIZE
  243.     xor al, al              ; Заполняем AL нулем
  244. fill_keyword_default:
  245.     stosb
  246.     loop fill_keyword_default
  247.    
  248.     ; обнуление массива KEYWORD_BIN
  249.     mov di, OFFSET KEYWORD_BIN
  250.     mov cx, WORD_SIZE
  251.     xor al, al              ; Заполняем AL нулем
  252. fill_keyword_bin:
  253.     stosb
  254.     loop fill_keyword_bin
  255.    
  256.     ; обнуление массива WORDS_ARRAY
  257.     mov di, OFFSET WORDS_ARRAY
  258.     mov cx, WORDS_ARRAY_SIZE * WORD_SIZE
  259.     xor al, al              ; Заполняем AL нулем
  260. fill_words_array:
  261.     stosb
  262.     loop fill_words_array
  263.    
  264.     ; начало программы
  265.     PUTL IN_TYPE_MSG
  266.     CALL    GETCH           ; Выбор тип ввода
  267.     CALL PUTC
  268.     mov IN_TYPE,AL
  269.     sub IN_TYPE,'0'
  270.     CMP IN_TYPE,1
  271.     JNE LAB2_MAIN_CODE
  272.     mov ah,3Dh              ; Функция DOS 3Dh (открытие файла)
  273.     xor al,al               ; Режим открытия - только чтение
  274.     lea dx,FILENAME         ; Имя файла
  275.     xor cx,cx               ; Нет атрибутов - обычный файл
  276.     int 21h                 ; Обращение к функции DOS
  277.     jc CEXIT                ; Если поднят флаг С, то ошибка открытия
  278.      
  279.     mov bx,ax               ; Копируем в bx указатель файла
  280.     xor cx,cx
  281.     xor dx,dx
  282.     mov ax,4200h
  283.     int 21h                 ; Идем к началу файла
  284. LAB2_MAIN_CODE:  
  285.     MOV ECX, 5
  286.     MOV AL, 0Ah
  287.     CALL PUTC
  288.    
  289.     PUTL LAB2_MSG_IN_KEYWORD
  290.  
  291.     mov cx, 1
  292.     lea di, KEYWORD_DEFAULT
  293.    
  294.     cmp IN_TYPE,1           ; Проверка на ввод с консоли или с клавиатуры
  295.     JNE STD_IN_1
  296.     CALL GET_STRING_FIN
  297.     JMP FILE_IN_1
  298.    
  299. STD_IN_1:
  300.     CALL GET_STRING_STD
  301. FILE_IN_1:
  302.     push bx                 ; В стек временно закидывается указатель на файл
  303.     PUTL LAB2_MSG_IN_WORDS  ; Используется bx в функции, поэтому надо сохранить указатель на файл
  304.     pop bx
  305.    
  306.     mov cx, WORDS_ARRAY_SIZE
  307.     lea di, WORDS_ARRAY
  308.    
  309.     cmp IN_TYPE,1           ; Проверка на ввод с консоли или с клавиатуры
  310.     JNE STD_IN_2
  311.     CALL GET_STRING_FIN
  312. close:
  313.     mov ah,3eh              ; Закрытие файла после ввода
  314.     int 21h    
  315.     jmp FILE_IN
  316. STD_IN_2:
  317.     CALL GET_STRING_STD
  318. FILE_IN:
  319.     lea di, KEYWORD_DEFAULT
  320.     mov ax, 0
  321.     mov cx, WORD_SIZE
  322. is_bin_loop:                ; Проверка на то что это бинарное число или нет
  323.     shl ax,1
  324.     cmp byte ptr [di], 0    ; Проверка на конец слова
  325.     JE clear_cx
  326.     cmp byte ptr [di],"0"
  327.     JE is_bin_loop_end
  328.     cmp byte ptr [di],"1"
  329.     JE is_bin_loop_end
  330.     JMP start_find
  331. is_bin_loop_end:
  332.     add al, byte ptr [di]
  333.     sub ax,'0'
  334.     dec cx
  335.     inc di
  336.     cmp cx, 0
  337.     JG is_bin_loop
  338.     JLE format_ax
  339. clear_cx:
  340.     shr ax, 1               ; Убрать лишнее смещение после конца слова
  341.     mov cx,0
  342. format_ax:
  343.     push ax
  344.     lea dx, KEYWORD_BIN
  345.     call formatAX
  346.     pop ax
  347.    
  348.    
  349. start_find:
  350.     lea si, WORDS_ARRAY
  351.     lea di, KEYWORD_DEFAULT
  352.  
  353.     CALL findSring
  354.     push cx
  355.    
  356.     lea si, WORDS_ARRAY
  357.     lea di, KEYWORD_BIN
  358.    
  359.     CALL findSring
  360.    
  361.     xor ax,ax
  362.     pop ax
  363.    
  364.     cmp ax,cx
  365.     JGE ax_greater
  366. ax_less:                    ; Поиск минимального номера слова
  367.     mov cx, ax
  368. ax_greater:    
  369.     cmp cx, WORDS_ARRAY_SIZE
  370.     JG LAB2_EXIT_ERR
  371.    
  372.     xor dx, dx
  373.     lea dx, LAB2_MSG_N_WORD
  374.     mov ah, 09h
  375.     int 21h
  376.        
  377.     mov ax, cx              ; Вывод ax в десятичном формате
  378.     mov bx, 10
  379.     mov si, 0
  380.  
  381. convert_loop:
  382.     xor dx, dx
  383.     div bx
  384.     add dl, '0'
  385.     mov BUF[si], dl
  386.     inc si
  387.     cmp ax, 0
  388.     jnz convert_loop
  389.  
  390. print_loop:
  391.     dec si
  392.     mov dl, BUF[si]
  393.     mov ah, 02h
  394.     int 21h
  395.     cmp si, 0
  396.     jnz print_loop
  397.  
  398.     JMP CEXIT
  399. LAB2_EXIT_ERR:
  400.     PUTL LAB2_MSG_N_ERR
  401.    
  402. CEXIT:    CMP    AL,    CHESC    
  403.     JE    @@E
  404.     TEST    AL,    AL
  405.     JNE    BACK
  406.     CALL    GETCH
  407.     JMP    @@L
  408.     ; Выход из программы
  409. @@E:    EXIT    
  410.     EXTRN    PUTSS:  NEAR
  411.     EXTRN    PUTC:   NEAR
  412.     EXTRN   GETCH:  NEAR
  413.     EXTRN   GETS:   NEAR
  414.     EXTRN   SLEN:   NEAR
  415.     EXTRN   UTOA10: NEAR
  416.     END    BEGIN
  417.  
  418.  
Add Comment
Please, Sign In to add comment