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