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

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

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

Здравствуйте. Я недавно начал изучать ассемблер и столкнулся с проблемой, которая заключается в том, что не срабатывает 21 прерывание
code segment
assume cs:code, ds:code, es:code, ss:code
ORG 100H
start:

    mov ah, 0Ah         ; Функция 0Ah сервисаDOS:
    lea dx,string1
    int 21h
    mov string1+1, 0ah 
    
    lea si,string1
    lea di,string2
    mov cx,5
 
    METAN:
    MOV AH,[SI] 
    INC SI 
    MOV BH,[SI] 
    INC SI 
    MOV AL,[SI]
    INC SI
    MOV [DI], AL
    INC DI 
    mov [DI], BH
    INC DI
    MOV [DI],AH
    INC DI
        dec cx
        cmp cx,0000
    jne METAN
 
        mov AX,03
        INT 10H
    mov ax,0000

    lea dx, string2
    MOV AH,09h
    int 21h
 
    mov ah,10h
    int 16h
    mov ax,04ch         ; Завершение программы с кодом0
    int 21h

string1 db 15 dup ('$')
string2 db 15 dup ('$')
 
code ends
end Start
Не выводит к сожалению ничего...

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

textual
Листинг программы
code segment
assume cs:code, ds:code, es:code, ss:code
ORG 100H
start:
        ;чтение в буфер из клавиатуры
        mov     ah,     0Ah
        lea     dx,     kbdBuffer
        int     21h
        ;копирование из буфера в переменную строки
        push    es
        pushf
        push    ds
        pop     es
        mov     cx,     0
        mov     cl,     [kbdBuffer+1]
        lea     si,     kbdBuffer+2
        lea     di,     string1
        mov     al,     cl
        stosb
        jcxz    @@SkipCopy
        cld
        rep     movsb
@@SkipCopy:
        ;добавление признака конца строки
        mov     byte ptr [di],  '$'
        popf
        pop     es
 
        ;перевести на новую строку
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        ;вывод строки
        mov     ah,     09h
        lea     dx,     string1+1
        int     21h
 
        mov     ah,     10h
        int     16h
 
        ;mov    ax,     04c00h         ; Завершение программы с кодом0
        ;int 21h
 
        int     20h
 
string1         db 256 dup (0)
string2         db 256 dup (0)
kbdBuffer       db 255, 0, 255 dup (0)
CrLf            db 0Dh, 0Ah, '$'
code ends
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
Похожие ответы