Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 402
от 19.03.2006, 21:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 284, Экспертов: 24
В номере:Вопросов: 2, Ответов: 5


Вопрос № 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!
Или признак конца (символ '$' ) вставлять в конец введенной строки

xor bx,bx
mov bl,dlina
mov text[bx],'$'
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Студент)
Ответ отправлен: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.20 (beta) от 17.03.2006
Яндекс Rambler's Top100

В избранное