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