Ввод-вывод с клавиатуры и обработка строк - 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
Объяснение кода листинга программы
- Ввод с клавиатуры в буфер:
- Код читает в буфер из клавиатуры, используя порт 21h и сегмент данных 0, используя команду int 21h.
- Копирование из буфера в переменную строки:
- Код копирует данные из буфера в переменную строки, используя команду stosb для копирования байтов.
- Затем он добавляет символ конца строки '$' в конец строки.
- Перевод на новую строку:
- Код переводит курсор на новую строку, используя команду int 21h с аргументами 09h и сегментом данных 0.
- Вывод строки:
- Код выводит строку на экран, используя команду int 21h с аргументами 09h и сегментом данных 0.
- Завершение программы:
- Код завершает программу, используя команду int 20h.
- Указатели на сегменты данных:
- Код использует сегменты данных 0 для всех сегментов данных, что означает, что все переменные располагаются в сегменте данных 0.
- Размер буфера клавиатуры:
- Размер буфера клавиатуры составляет 255 байт, что означает, что он может хранить до 255 символов.
- Размер переменных строк:
- Размер переменных строк составляет 256 байт, что означает, что они могут хранить до 256 символов.
- Значение порта 21h:
- Порт 21h используется для ввода-вывода с клавиатуры и дисплея.
- Значение порта 16h:
- Порт 16h используется для вывода символов на экран.
- Значение порта 9h:
- Порт 9h используется для перемещения курсора на новую строку.
- Значение порта 0Dh:
- Порт 0Dh используется для перемещения курсора на новую строку.
- Значение порта 0Ah:
- Порт 0Ah используется для перемещения курсора на новую строку.
- Значение символа конца строки '$':
- Символ конца строки '$' используется для обозначения конца строки.
- Значение команды int 21h:
- Команда int 21h используется для ввода-вывода с клавиатуры и дисплея.
- Значение команды stosb:
- Команда stosb используется для копирования байтов из одного места в другое.
- Значение команды movsb:
- Команда movsb используется для перемещения байтов из одного места в другое.
- Значение команды int 20h:
- Команда int 20h используется для завершение программы.
- Значение сегмента данных 0:
- Сегмент данных 0 используется для всех сегментов данных в этом коде.
- Значение сегмента данных 10h:
- Сегмент данных 10h используется для сегмента данных регистровых переменных в этом коде.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д