Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;***************************************************************************************************
  2. ; MOPL1.ASM - учебный пример для выполнения
  3. ; лабораторной работы N1 по машинно-ориентированному программированию
  4. ;***************************************************************************************************
  5.         .MODEL SMALL
  6.         .STACK 200h
  7.     .386
  8. ;       Используются декларации констант и макросов
  9.         INCLUDE MOPL1.INC  
  10.         INCLUDE MOPL1.MAC
  11.  
  12. ; Декларации данных
  13.         .DATA    
  14. SLINE   DB  78 DUP (CHSEP), 0
  15. REQ DB  "Фимилия И.О.: ",0FFh
  16. MINIS   DB  "МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ",0
  17. ULSTU   DB  "УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ",0
  18. DEPT    DB  "Кафедра вычислительной техники",0
  19. MOP DB  "Машинно-ориентированное программирование",0
  20. LABR    DB  "Лабораторная работа N 1",0
  21. REQ1    DB      "Замедлить время работы в тактах(-), ускорить время работы в тактах (+),", 0
  22. ;------------- Новые переменные ------------------------------------------------------------------
  23. REQ2    DB  "вычислить функцию (f), выйти(ESC)?", 0FFh
  24. ;-------------------------------------------------------------------------------------------------
  25.  
  26. EMPTYS  DB  0
  27. BUFLEN = 70
  28. BUF DB  BUFLEN
  29. LENS    DB  ?
  30. SNAME   DB  BUFLEN DUP (0)
  31. BUF_LEN_NUMBER = 21
  32. BUF_NUMBER  DB  BUF_LEN_NUMBER
  33. LEN_NUMBER  DB  ?
  34. W_NUMBER    DB  BUF_LEN_NUMBER DUP (0)
  35. X DD 0
  36. Y DD 0
  37. Z DD 0
  38. PAUSE   DW  0, 0 ; младшее и старшее слова задержки при выводе строки
  39. TI  DB  LENNUM+LENNUM/2 DUP(?), 0 ; строка вывода числа тактов
  40.                                           ; запас для разделительных "`"
  41.  
  42.                                          
  43. ARRAY_ALF DB 95 DUP(?)
  44. i db 0
  45. j dw 0
  46. CHAR DB 0
  47. ;========================= Программа =========================
  48.         .CODE
  49. ; Макрос заполнения строки LINE от позиции POS содержимым CNT объектов,
  50. ; адресуемых адресом ADR при ширине поля вывода WFLD
  51. BEGIN   LABEL   NEAR
  52.     ; инициализация сегментного регистра
  53.     MOV AX, @DATA
  54.     MOV DS, AX
  55.     ; инициализация задержки
  56.     MOV PAUSE,  PAUSE_L
  57.     MOV PAUSE+2,PAUSE_H
  58.    
  59.     JMP MAIN
  60.    
  61.     PUTLS   REQ ; запрос имени
  62.     ; ввод имени
  63.     LEA DX, BUF
  64.     CALL    GETS   
  65. @@L:    ; циклический процесс повторения вывода заставки
  66.     ; вывод заставки
  67.     ; ИЗМЕРЕНИЕ ВРЕМЕНИ НАЧАТЬ ЗДЕСЬ
  68.     FIXTIME
  69.     PUTL    EMPTYS
  70.     PUTL    SLINE   ; разделительная черта
  71.     PUTL    EMPTYS
  72.     PUTLSC  MINIS   ; первая
  73.     PUTL    EMPTYS
  74.     PUTLSC  ULSTU   ;  и  
  75.     PUTL    EMPTYS
  76.     PUTLSC  DEPT    ;   последующие
  77.     PUTL    EMPTYS
  78.     PUTLSC  MOP ;    строки  
  79.     PUTL    EMPTYS
  80.     PUTLSC  LABR    ;     заставки
  81.     PUTL    EMPTYS
  82.     ; приветствие
  83.     PUTLSC  SNAME   ; ФИО студента
  84.     PUTL    EMPTYS
  85.     ; разделительная черта
  86.     PUTL    SLINE
  87.     ; ИЗМЕРЕНИЕ ВРЕМЕНИ ЗАКОНЧИТЬ ЗДЕСЬ
  88.     DURAT       ; подсчет затраченного времени
  89.     ; Преобразование числа тиков в строку и вывод
  90.     LEA DI, TI
  91.     CALL    UTOA10 
  92.     PUTL    TI      ; вывод числа тактов
  93.     ; обработка команды
  94.     PUTL    REQ1
  95. ;------Вывод своих строк с действиями -------------------
  96.     PUTL    REQ2
  97. ;--------------------------------------------------------
  98.     CALL    GETCH
  99.     CMP AL, 'f'
  100.     JNE NOTF
  101.    
  102. MAIN:
  103.     lea bx, ARRAY_ALF
  104.    
  105.    
  106. ARRAY_INIT:
  107.     mov [bx], 0;Обнуление
  108.     call PRINT_NUMBER_EBX
  109.     inc bx
  110.     loop ARRAY_INIT
  111.    
  112. FUN_READ_NUMBER:
  113.     mov si, 0
  114.     mov i, 0
  115.     READLN:
  116.         ;Начало — Считывание, определение индекса масссива
  117.         xor eax, eax
  118.         xor ebx, ebx
  119.         CALL GETECH    
  120.        
  121.         SUB AL, 20h
  122.         mov CHAR, al
  123.         PUTL    EMPTYS
  124.        
  125.         xor ebx, ebx
  126.         mov bl, CHAR
  127.         call PRINT_NUMBER_EBX
  128.         PUTL    EMPTYS
  129.         ;Конец — Считывание, определение индекса масссива
  130.        
  131.         ;Начало — Если это не символ
  132.         cmp CHAR, 0
  133.         JB COUNTING_CHARACTERS
  134.         cmp CHAR, 95
  135.         JA COUNTING_CHARACTERS
  136.         ;Конец — Если это не символ
  137.        
  138.         ;Начало — получение индекса для увеличения счётчика
  139.         xor eax, eax
  140.         xor ebx, ebx
  141.         mov al, CHAR
  142.         mov si, ax
  143.         mov bx, si
  144.         call PRINT_NUMBER_EBX
  145.         PUTL    EMPTYS
  146.         ;Конец — получение индекса для увеличения счётчика
  147.        
  148.         xor eax, eax
  149.         xor ebx, ebx       
  150.         mov bl, ARRAY_ALF[si]
  151.         call PRINT_NUMBER_EBX
  152.         PUTL    EMPTYS
  153.        
  154.         inc bl
  155.         mov ARRAY_ALF[si], bl
  156.         call PRINT_NUMBER_EBX
  157.         PUTL    EMPTYS
  158.        
  159.         ;mov al, ARRAY_ALF[si]
  160.         ;xor ebx, ebx
  161.         ;mov bl, al
  162.         ;call PRINT_NUMBER_EBX
  163.        
  164.         ;mov si, ax
  165.         ;add ARRAY_ALF[si], 1
  166.         ;xor ax, ax
  167.         ;mov si, 0
  168.         ;mov AL, ARRAY_ALF[si]
  169.         ;CALL PUTC
  170.         JMP READLN
  171.  
  172.     JMP @@E
  173.  
  174. COUNTING_CHARACTERS:
  175.     JMP @@E
  176.  
  177. NOTF:   CMP AL, '-'    ; удлиннять задержку?
  178.     JNE CMINUS
  179.     INC PAUSE+2        ; добавить 65536 мкс
  180.     JMP @@L
  181. CMINUS: CMP AL, '+'    ; укорачивать задержку?
  182.     JNE CEXIT
  183.     CMP WORD PTR PAUSE+2, 0    
  184.     JE  BACK
  185.     DEC PAUSE+2        ; убавить 65536 мкс
  186. BACK:   JMP @@L
  187. CEXIT:  CMP AL, CHESC  
  188.     JE  @@E
  189.     TEST    AL, AL
  190.     JNE BACK
  191.     CALL    GETCH
  192.     JMP @@L
  193.     ; Выход из программы
  194. @@E:    EXIT   
  195.         EXTRN   PUTSS:  NEAR
  196.         EXTRN   PUTC:   NEAR
  197.     EXTRN   GETCH:  NEAR
  198.     EXTRN   GETECH:  NEAR
  199.     EXTRN   GETS:   NEAR
  200.     EXTRN   SLEN:   NEAR
  201.     EXTRN PRINT_NUMBER_EBX: NEAR
  202.     EXTRN READ_NUMBER_EBX: NEAR
  203.     EXTRN   UTOA10: NEAR
  204.     END BEGIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement