Не получается разобраться в экзаменационном задании - Assembler
Формулировка задачи:
Привет всем! Не удается понять смысл работы программы. Т.е. понятно, что программа нужна для вывода символов на определенно настроенный экран, но вот логику работы программы уловить не получается. Сам код:
Прошу помощи конкретно в описании работы программы, и ее комментировании.
Также привожу текст задания:
"Написать программу ввода строки с консоли. Перед вызовом, аргумент функции Buffer должен указывать на массив, размер которого должен быть достаточным для ввода строки, заверш. символом "Enter" и двух байтов. Первый байт указывает на максимальный размер строки, второй реальный размер строки. Сама строка должна завершаться символами NL - новая строка. LF - перевод строки и нулем"
use16
org 100h
jmp start
LABEL BUFFER BYTE
LONG db ? ;Текущая длина строки
BASELONG DB 99 DUP('') ;Длина буффера
MAXLONG DB 99 ;Максимальная длина буффера
prompt db 'TEXT?','$'
start:
call Q10CLR ;Настройка параметров экрана
a20:
mov dx,0000
call Q20CURS ;Установка курсора
call B10PRMP
call D10INPT ;Непосредственно ввод
call Q10CLR ;
cmp [LONG],00
je a30
call E10CODE
call F10CENT
MOV SI,BASELONG
MOV AH,0EH
MOV AL,[SI]
MOV BH,00
MOV CX,99
INT 16H
a30:
int 20h
B10PRMP:
mov ah,40h ;Видеобуффер
mov dx,prompt ;Загружаем
int 21h
ret
D10INPT:
MOV AH,0AH ;Ввод строки
MOV DX,BASELONG ;Загрузка буффера клавиатуры
INT 21H
RET
E10CODE:
MOV BH,00
MOV BL,[LONG]
MOV [BASELONG+BX],'$'
RET
F10CENT:
MOV DL,[LONG]
SHR DL,1
NEG DL
ADD DL,40
MOV DH,12
MOV AH,09H
MOV DX,BASELONG
INT 21H
RET
Q10CLR:
MOV AX,0600H
MOV BH,100
MOV CX,0000
MOV DX,184FH
INT 10H
RET
Q20CURS:
MOV AH,02
MOV BH,100
INT 10H
RETРешение задачи: «Не получается разобраться в экзаменационном задании»
textual
Листинг программы
org 100h jmp start mes0 db 13,10,'Type string: $' mes1 db 13,10,'--------------------' db 13,10,'Press any key...$' label buffer byte ; буфер для ввода строки fn.0Ah max db 80 ; len db 0 ; string db 80 dup(0) ; start: mov bh,0Ah ; цвет символов (параметр для "Setup") call setup ; настройка экрана! xor dx,dx ; параметр (DH=строка,DL=колонка) call setCursor ; установка курсора! (не обязательна) mov dx,mes0 ; адрес строки call message ; мессага (запрос на ввод строки) mov dx,buffer ; адрес буфера call dosInput ; ввод строки в буфер! xor cx,cx ; mov cl,[len] ; длина введённой строки mov di,string ; её адрес add di,cx ; перемещаемся в конец строки mov ax,240Ah ; что записывать: 0Ah,'$' stosw ; запись в хвост строки! mov dx,mes1 ; параметр.. call message ; call exit ; выход! ;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн setup: mov ax,600h ; прокрутить страницу! xor cx,cx ; левая позиция mov dx,184fh ; правая позиция int 10h ; ret ; ;---------------------------------------------------------------------- setCursor: ; mov ah,2 ; установить курсор! xor bx,bx ; страница(0) int 10h ; ret ; ;---------------------------------------------------------------------- message: ; mov ah,9 ; выдать строку! int 21h ; ret ; ;---------------------------------------------------------------------- dosInput: ; mov ah,0Ah ; ввод строки в буфер! int 21h ; ret ; ;---------------------------------------------------------------------- exit: xor ax,ax ; ожинание клавиши.. int 16h ; int 20h ; выход в DOS! ret ;