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