Вопрос № 37485: Программа считывает строку символов в буфер, затем отображает на экране.
Функция DOS 0Ah - Считать строку символов из STDIN в буфер
Вопрос! . Программа работает правильно если буфер заполнен полностью, все 10 символов..Если ввести меньше...Вопрос № 37518: Здравствуйте уважаемые эксперты. Я пишу программу которая должна
выполнять некоторые действия, а затем создовать com-файл. Пробле-
ма в том, что я не знаю как писать com-файл в тело своей програм-
мы. Если прописываю так:
Имя файла ...
Вопрос № 37.485
Программа считывает строку символов в буфер, затем отображает на экране.
Функция DOS 0Ah - Считать строку символов из STDIN в буфер
Вопрос! . Программа работает правильно если буфер заполнен полностью, все 10 символов..Если ввести меньшее кол-во символов, функция 9h, int 21h не выводит первые 4 символа...
В отладчике TD - прекрасно видно, что программа работает...буфер заполняется...
Где ошибка. ?
Спасибо!
Приложение:
Отправлен: 14.03.2006, 11:58
Вопрос задал: Ruslanm (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: EPDSota
Здравствуйте, Ruslanm!
Последним символом в буфер заносится переход на начало строки.
Итого - ты печатаешь: свои введенные буквы, потом курсор переходит на начало строки - потом печатаються нули до достижения знака $.
правильней будет:
text db 10 dup('$') ; фактически ввод размещается здесь
--------- Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 14.03.2006, 12:32
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Ruslanm!
Или признак конца (символ '$' ) вставлять в конец введенной строки
Ответ отправил: Лысков Игорь Витальевич (статус: Студент)
Ответ отправлен: 14.03.2006, 13:02
Отвечает: Пан Павел Константинович
Здравствуйте, Ruslanm!
Как дела у вас? у вас проблемы с '$'. Ниже рабочая версия.
Смотрите:
.model tiny
.code
org 100h
start:
mov ah,0ah
mov dx,offset buffer
int 21h
;======================================
inc dx
mov di,dx
mov bl,[di]
mov [di],ah
xor bh,bh ;Можно и без этого, но! лучше так.
inc di
mov byte ptr [di+bx],'$'
dec ah
;======================================
int 21h
ret
buffer db 10 ; максимальная длина ввода строки
dlina db 0 ; фактическая длина ввода
text db 10 dup() ; фактически ввод размещается здесь
end start
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 3-ий класс)
Ответ отправлен: 15.03.2006, 00:09
Вопрос № 37.518
Здравствуйте уважаемые эксперты. Я пишу программу которая должна
выполнять некоторые действия, а затем создовать com-файл. Пробле-
ма в том, что я не знаю как писать com-файл в тело своей програм-
мы. Если прописываю так:
Имя файла proc
текст файла
ret
Имя файла endp
То файл создается, но не работает. Это понятно, нет ни кода, ни сегмента.
Но если я пишу:
.286
CSEG segment
org 100h
и т.д. ассемблер пишет ошибку. Подскажите пожалуйста как быть?
Отправлен: 14.03.2006, 20:35
Вопрос задал: Gogenot (статус: 1-ый класс)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 10)
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Gogenot!
1. Тебе же надо писать исполняемый модуль, зачем писать текст? Надо писать сам код!
2. Будем писать файл (а программа является обычным файлом), начиная с некоторой метки и необходимой длины.
3. Основная программа будет включать и записываемый участок, который должен
лежать одним куском. Компилироваться будут вместе.
4. Не забывать, что адреса COM-программы начинаются с 100h!
Это значит, что надо очень аккуратно использовать адреса.
Можно использовать следующие подходы:
- косвенную адресацию через регистр. Например,так
comprogramme: ; начало записываемой программы
call near start
start:
pop bx ; ВХ содержит адрес метки start при любом значении IP
jmp short next
db ; адрес этого байта - BX+3
;...
next: ;Кстати, подобный подход широко использовали ДОСовские вирусы, когда приклеивались к программам
- Формировать нужный адрес путем добавления необходимой константы. Например:
mov dx, offset buffer - offset comprogramme + 100h
...
buffer db 10h dup(0)
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Студент)
Ответ отправлен: 14.03.2006, 21:36 Оценка за ответ: 5
Отвечает: Пан Павел Константинович
Здравствуйте, Gogenot!
Я плохо понел ваш вопрос, но всё таки что-то понел.
Вы хотите создать *.COM содержимое которого находится в вашей программе?
Если это так, то сделайте отдельную рабочую версию вашего *.COM файла которого хотите создать и дезасеммблируйте его HIEW'вом затем запешите все байты которые выдал вам HIEW и просто вставьте в вашу программу эти байты как данные, ну типа так:
data db 0cdh,21h,0c3h - int 21h, ret
А затем при записи в *.COM файл который вы создали укажите этот буфер(data).
С, Уважением MnEm0n!C.
--------- Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 3-ий класс)
Ответ отправлен: 15.03.2006, 00:29 Оценка за ответ: 5