Ввод-вывод с клавиатуры и обработка строк - Assembler

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

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

Здравствуйте. Я недавно начал изучать ассемблер и столкнулся с проблемой, которая заключается в том, что не срабатывает 21 прерывание
Листинг программы
  1. code segment
  2. assume cs:code, ds:code, es:code, ss:code
  3. ORG 100H
  4. start:
  5.  
  6. mov ah, 0Ah ; Функция 0Ah сервисаDOS:
  7. lea dx,string1
  8. int 21h
  9. mov string1+1, 0ah
  10. lea si,string1
  11. lea di,string2
  12. mov cx,5
  13. METAN:
  14. MOV AH,[SI]
  15. INC SI
  16. MOV BH,[SI]
  17. INC SI
  18. MOV AL,[SI]
  19. INC SI
  20. MOV [DI], AL
  21. INC DI
  22. mov [DI], BH
  23. INC DI
  24. MOV [DI],AH
  25. INC DI
  26. dec cx
  27. cmp cx,0000
  28. jne METAN
  29. mov AX,03
  30. INT 10H
  31. mov ax,0000
  32.  
  33. lea dx, string2
  34. MOV AH,09h
  35. int 21h
  36. mov ah,10h
  37. int 16h
  38. mov ax,04ch ; Завершение программы с кодом0
  39. int 21h
  40.  
  41. string1 db 15 dup ('$')
  42. string2 db 15 dup ('$')
  43. code ends
  44. end Start
Не выводит к сожалению ничего...

Решение задачи: «Ввод-вывод с клавиатуры и обработка строк»

textual
Листинг программы
  1. code segment
  2. assume cs:code, ds:code, es:code, ss:code
  3. ORG 100H
  4. start:
  5.         ;чтение в буфер из клавиатуры
  6.         mov     ah,     0Ah
  7.         lea     dx,     kbdBuffer
  8.         int     21h
  9.         ;копирование из буфера в переменную строки
  10.         push    es
  11.         pushf
  12.         push    ds
  13.         pop     es
  14.         mov     cx,     0
  15.         mov     cl,     [kbdBuffer+1]
  16.         lea     si,     kbdBuffer+2
  17.         lea     di,     string1
  18.         mov     al,     cl
  19.         stosb
  20.         jcxz    @@SkipCopy
  21.         cld
  22.         rep     movsb
  23. @@SkipCopy:
  24.         ;добавление признака конца строки
  25.         mov     byte ptr [di],  '$'
  26.         popf
  27.         pop     es
  28.  
  29.         ;перевести на новую строку
  30.         mov     ah,     09h
  31.         lea     dx,     CrLf
  32.         int     21h
  33.         ;вывод строки
  34.         mov     ah,     09h
  35.         lea     dx,     string1+1
  36.         int     21h
  37.  
  38.         mov     ah,     10h
  39.         int     16h
  40.  
  41.         ;mov    ax,     04c00h         ; Завершение программы с кодом0
  42.         ;int 21h
  43.  
  44.         int     20h
  45.  
  46. string1         db 256 dup (0)
  47. string2         db 256 dup (0)
  48. kbdBuffer       db 255, 0, 255 dup (0)
  49. CrLf            db 0Dh, 0Ah, '$'
  50. code ends
  51. end Start

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

  1. Ввод с клавиатуры в буфер:
    • Код читает в буфер из клавиатуры, используя порт 21h и сегмент данных 0, используя команду int 21h.
  2. Копирование из буфера в переменную строки:
    • Код копирует данные из буфера в переменную строки, используя команду stosb для копирования байтов.
    • Затем он добавляет символ конца строки '$' в конец строки.
  3. Перевод на новую строку:
    • Код переводит курсор на новую строку, используя команду int 21h с аргументами 09h и сегментом данных 0.
  4. Вывод строки:
    • Код выводит строку на экран, используя команду int 21h с аргументами 09h и сегментом данных 0.
  5. Завершение программы:
    • Код завершает программу, используя команду int 20h.
  6. Указатели на сегменты данных:
    • Код использует сегменты данных 0 для всех сегментов данных, что означает, что все переменные располагаются в сегменте данных 0.
  7. Размер буфера клавиатуры:
    • Размер буфера клавиатуры составляет 255 байт, что означает, что он может хранить до 255 символов.
  8. Размер переменных строк:
    • Размер переменных строк составляет 256 байт, что означает, что они могут хранить до 256 символов.
  9. Значение порта 21h:
    • Порт 21h используется для ввода-вывода с клавиатуры и дисплея.
  10. Значение порта 16h:
    • Порт 16h используется для вывода символов на экран.
  11. Значение порта 9h:
    • Порт 9h используется для перемещения курсора на новую строку.
  12. Значение порта 0Dh:
    • Порт 0Dh используется для перемещения курсора на новую строку.
  13. Значение порта 0Ah:
    • Порт 0Ah используется для перемещения курсора на новую строку.
  14. Значение символа конца строки '$':
    • Символ конца строки '$' используется для обозначения конца строки.
  15. Значение команды int 21h:
    • Команда int 21h используется для ввода-вывода с клавиатуры и дисплея.
  16. Значение команды stosb:
    • Команда stosb используется для копирования байтов из одного места в другое.
  17. Значение команды movsb:
    • Команда movsb используется для перемещения байтов из одного места в другое.
  18. Значение команды int 20h:
    • Команда int 20h используется для завершение программы.
  19. Значение сегмента данных 0:
    • Сегмент данных 0 используется для всех сегментов данных в этом коде.
  20. Значение сегмента данных 10h:
    • Сегмент данных 10h используется для сегмента данных регистровых переменных в этом коде.

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


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

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

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

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

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

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