Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ввод вывод на Ассемблере

Славик Раченко Знаток (385), закрыт 13 лет назад
Есть такой код для вывода слова которое только что было введено. Все выводит но впереди дорисовывает два символа (карточные масти) . У меня вопрос почему размер буфера 5, а можно ввести только 4 символа. Зачем нужна строка string "$$$$$" ? И как убрать те два символа?
TITLE helcom4.asm
.model medium

.data
message1 DB "Vvedit slovo!", 0dh, 0ah, "$"
message2 db "Vuvid na ekran", 0dh, 0ah, "$"
bufer db 5
len db 0
string db "$$$$$"

.code
start:
mov ax, @data
mov ds, ax
mov es, ax

mov ah, 9 ; vuvestu na ekran
mov dx, OFFSET message1 ; textove povidomlenna
int 21h

mov ah,0Ah
mov dx, OFFSET bufer
int 21h ; считать строку символов в буфер

mov ah, 9h ; vuvestu na ekran
mov dx, OFFSET message2 ; textove povidomlenna
int 21h

mov ah, 9h
mov dx, OFFSET bufer
int 21h

mov ax, 4C00h ; zavershutu
int 21h ; programy

.stack
stk db 256 dup ("stack")

end start ; vkazue na tochky vhody
Лучший ответ
Миоко Таканава Гений (51598) 13 лет назад
Это особенности работы функции 0Ah прерывания 21h MS-DOS. Для своей работы она требует буфер определённой структуры.
1-й байт: размер буфера для ввода строки с клавиатуры + 1. +1 - потому что эта функция всегда вставляет в конце введённой строки маркер с кодом 0Dh.
2-й байт: реальная длина введённой строки без учёта маркера 0Dh.
Начиная с 3-го байта сам буфер для ввода.

Два карточных символа у вас получаются потому что вы передаёте функции вывода строки на экран (09h прерывания DOS 21h) не адрес начала строки, а адрес начала буфера ввода, два первых байта которого это длина буфера и длина введённой строки.
Нужно передавать адрес на 2 байта больше:
mov dx, OFFSET bufer + 2
или (не зря же у вас поля буфера разделены и имеют собственные метки) :
mov dx, OFFSET string

Доллары нужны для функции 9, так как она выводит на экран подряд все символы, пока не встретится символ с кодом 24h, то есть "доллар". Сам доллар на экран не выводится.
А так как заранее неизвестно, сколько символов введёт пользователь, то для упрощения последующего вывода на экран, буфер ввода предварительно заполнен долларами.
Но у вас долларов не хватает. Для ввода строки из 4-х символов нужен буфер длиной 5 байт (4 символа + маркер 0Dh). В этом случае все 5 долларов будут стёрты и для функции вывода не останется маркера окончания, и она будет выводить на экран весь хранящийся в памяти мусор, пока где-то не попадётся байт 24h. Поэтому строка string должна быть длиной 6 байт:
string db '$$$$$$'

Дополнительно с примером смотрите здесь.
Остальные ответы
Похожие вопросы