Составить программу ввода символов с клавиатуры - Assembler

Узнай цену своей работы

Формулировка задачи:

Составить программу ввода символов с клавиатуры. Вывести полученные символы на дисплей в режиме мигания с периодом 1 секунда в заданную позицию, вводимую с клавиатуры. Прерывание программы по нажатию клавиш Left –Shift.

Решение задачи: «Составить программу ввода символов с клавиатуры»

textual
Листинг программы
  1. TITLE   PROGNAME (EXE)                  ; вызов программы
  2.  
  3. STACKSG SEGMENT PARA STACK 'Stack'
  4.     DW  32 DUP(?)  
  5. STACKSG ENDS
  6.  
  7. DATASG  SEGMENT PARA 'Data'
  8.     BMAX       DB  3
  9.     BSize      DB  ?   
  10.     BContent:                 ;
  11.     MESPOS     DB 'Введите номер строки:','$'
  12.     MESPOS2    DB 'Введите номер столбца:','$'
  13.         err_msg    DB  "Ошибка ввода"
  14.         POSX       DB   0                 ;Номер столбца ввода
  15.         POSY       DB   0             ;Номер строки ввода
  16.         EN         DB 'Введите строку*: ','$'
  17.         STROKA     DB 20 DUP    ('$')             ;мигающая строка
  18.     Timer      DW 1000
  19. DATASG  ENDS
  20.  
  21. CODESG  SEGMENT PARA 'Code'
  22. BEGIN   PROC    FAR
  23.         ASSUME  CS:CODESG, DS:DATASG, SS:STACKSG
  24.         PUSH    DS
  25.         XOR     AX,AX                   ; запись в стек
  26.         PUSH    AX                      ;    нулевого адреса
  27.         MOV     AX,DATASG               ; засылка адреса
  28.         MOV     DS,AX                   ;    DATASG в регистр DS
  29.  
  30. ;Очистка экрана
  31.  
  32.     MOV AX,0600H       
  33.     MOV BH,07
  34.     MOV CX,0000
  35.     MOV DX,184FH
  36.     INT 10H
  37.  
  38. ;Установка курсора в левый верхний угол
  39.  
  40.     MOV AH,02
  41.     MOV BH,00
  42.     MOV DH,00
  43.     MOV DL,00
  44.     INT 10H
  45.  
  46. ;Вывод приглашения номер строки
  47.  
  48.     MOV     AH,09
  49.     LEA DX,MESPOS
  50.     INT 21H
  51.  
  52. ;Ввод позиции: номера строки   
  53.  
  54.         CALL    VVODPOS
  55.         MOV     POSY,AL
  56.  
  57.     mov AX,0600H        ;Очистка экрана
  58.     MOV BH,07
  59.     MOV CX,0000
  60.     MOV DX,184FH
  61.     INT 10H
  62.  
  63. ; Вывод приглашения номер столбца  
  64.  
  65.     MOV AH,09
  66.     MOV AL,00              
  67.     LEA DX,MESPOS2                 
  68.     INT 21H                        
  69.  
  70. ;Ввод позиции: номера столбца  
  71.  
  72.     CALL    VVODPOS
  73.     MOV POSX,AL
  74.  
  75.     mov AX,0600H        ;Очистка экрана
  76.     MOV BH,07
  77.     MOV CX,0000
  78.     MOV DX,184FH
  79.     INT 10H
  80.  
  81. ; вывод "Введите строку: "
  82.    
  83.     MOV     AH,09          
  84.         LEA     DX,EN
  85.         INT     21H
  86.  
  87. ;Ввод строки                                       
  88.        
  89.     MOV     AH,3FH         
  90.         MOV     BX,00                              
  91.         MOV     CX,20                  
  92.     LEA     DX,STROKA      
  93.     INT     21H
  94.                                                                                                    
  95. ;Очистка экрана                                        
  96.  
  97.     mov AX,0600H       
  98.     MOV BH,07
  99.     MOV CX,0000
  100.     MOV DX,184FH
  101.     INT 10H
  102.  
  103. ;Установка позиции исходя из введенных данных
  104.                    
  105. LoopVivod: 
  106.     MOV AH,02      
  107.     MOV BH,00
  108.     MOV DH,POSY
  109.     MOV DL,POSX
  110.     INT     10H
  111.  
  112. ;Вывод мигающей строки
  113.  
  114.     MOV AH,09
  115.     LEA DX,STROKA
  116.     MOV BL,0F0H
  117.     INT 21H
  118.     .386
  119.         xor     al,al           ; Аl - байт состояния клавиатуры 1
  120.     mov     ah,02h      ;Проверка состояния клавиатуры перед
  121.     int 16h     ;Задержкой очистки                                         
  122.     bt  ax,3            ;проверка 1-го бита
  123.                
  124.         JNZ ExitB           ;Выход по нажатию клавиши Left Shift
  125.     .8086
  126.  
  127.     mov CL,10       ; пауза на 1 секунду
  128.     mov DX,Timer
  129.     mov ah,86h
  130.     int 15h
  131.  
  132.  
  133.     mov AX,0600H    ;Очистка экрана
  134.     MOV BH,07
  135.     MOV CX,0000
  136.     MOV DX,184FH
  137.     INT 10H
  138.  
  139.         mov     CL,10            ; пауза на 1 секунду
  140.     mov     DX,Timer
  141.         mov     ah,86h  
  142.         int     15h              ; задержка
  143.    
  144.         xor     al,al           ; Аl = 0
  145.     mov     ah,02h      ;Проверка состояния клавиатуры перед
  146.     int 16h     ;Выводом строки                                            
  147.     cmp al,02h      ;проверка 1-го бита
  148.                
  149.         JZ  ExitB       ;Выход по нажатию клавиши Left Shift
  150.                                    
  151.  
  152. ;Зацикливание, если не нажата Left Shift
  153.                
  154.       jmp  LoopVivod   
  155.                        
  156. ExitB:  RET                             ; завершение программы
  157. BEGIN   ENDP
  158.  
  159.                                                                                                                                                        
  160. VVODPOS PROC    NEAR
  161.  
  162. ;Процедура буферизированного ввода с переводам в десятичное число,
  163. ;которое будет храниться в регистре АХ
  164.  
  165.       mov       dx,offset BMAX
  166.       mov       ah,0Ah
  167.       int       21h           ; считать строку символов в буфер
  168.  
  169. ; перевод числа в ASCII-формате из буфера в бинарное число в АХ
  170.       xor       di,di         ; DI = 0 - номер байта в буфере
  171.       XOR       AX,AX         ; АХ = 0 - текущее значение результата
  172.       mov       cl,BSIZE
  173.       xor       ch,ch
  174.       xor       bx,bx
  175.       mov       si,cx         ; SI - длина буфера
  176.       mov       cl,10         ; CL = 10, множитель для MUL
  177. asc2hex:
  178.       mov       bl,byte ptr BCONTENT[di]
  179.       sub       bl,'0'        ; цифра = код цифры - код символа "0",
  180.       jb        asc_error     ; если код символа был меньше, чем код "0",
  181.       cmp       bl,9          ; или больше, чем "9",
  182.       ja        asc_error     ; значит неправильно ввели, обнуляем позицию
  183.       mul       cx            ; иначе: умножить текущий результат на 10,
  184.       add       ax,bx         ; добавить к нему новую цифру,
  185.       inc       di            ; увеличить счетчик
  186.       cmp       di,si         ; если счетчик+1 меньше числа символов -
  187.       jb        asc2hex       ; продолжить (счетчик считается от 0)
  188.       RET                     ; возврат из подпрограммы
  189. asc_error:
  190.         xor      ax,ax         ; обнулить позицию
  191.       ret                 ; Возврат
  192. VVODPOS  ENDP                                                                                      
  193.  
  194. CODESG  ENDS
  195.         END     BEGIN

Объяснение кода листинга программы

  1. Программа начинается с вывода приглашения Введите номер строки:$иВведите номер столбца: $.
  2. Пользователю предлагается ввести номер строки и номер столбца.
  3. Если введенные данные некорректны (например, введено число больше 20), программа выведет сообщение об ошибке и запросит повторный ввод.
  4. После корректного ввода, программа выводит приглашение Введите строку:$`.
  5. Пользователю предлагается ввести строку.
  6. Введенная строка выводится на экран.
  7. Если введенная строка некорректна (например, содержит недопустимые символы), программа выведет сообщение об ошибке и запросит повторный ввод.
  8. После корректного ввода, программа выводит приглашение Введите строку:$`.
  9. Пользователю предлагается ввести строку.
  10. Программа завершается после ввода строки.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы