Ввод-вывод с клавиатуры и обработка строк - 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 используется для сегмента данных регистровых переменных в этом коде.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д