Здравствуйте. Мне необходимо считать с клавиатуры строку, с помощью 0Ah. Эта процедура у меня находится в отдельном модуле. В нем объявляю сегмент данных, где описывается переменная (которая понадобится для обращения к полям структуры, заполняемой функцией 0Ah). В главной программе также объявлен сегмент данных, заполненный полезной информацией. Из главной программы вызывается процедура считывания, и выходит так, что этот буфер, объявленный в подпрограмме начинает при заполнении перетерать данные моей главной программы. Как можно этого избежать? И как вариант решения, можно объявить глобально этот буфер. Но "нормально" ли это. Такой момент. В главной программе регистры DS, ES настроены на один сегмент, так нужно. Подскажите пожалуйста. Если нужна дополнительная информация, в частности исходный код, скажите .
Я на вас Nikankin удивляюсь... Таки я думал, шо это не форум телепатов, покажи свой код, фрагмет кода - тогда можно будет подумать, стоит ли там что-либо обсуждать
Nikankin Если программа написана с соблюдением определенных правил, то компилятор позаботится, что никто ничего не затриал. 0Ah - это число 10 и функцией быть не может - максимум адресом ее в памяти. Если писать с абсолютными адресами, то тоже ничего не затрешь, но нужно проделать ту работу , которую делает компилятор. Собственно так сначала и делали, а потом сделали компилятор. Потом поняли, что возникли новые проблемы, пришлось делать ОС и пошло и поехало
Компилятор ассемблера ни о чём не заботится. Для того у программиста голова на плечах есть чтоб заботиться Без исходного кода можна долго тут гадать, а в итоге у него написано что-то вроди Код (Text): buffer db 0 а читает он в этот буфер строку и удивляется почему что-то затирает. Он не первый такой, были уже такие вопросы Код в студию, там видно будет. Как раз таки это и есть номер функции DOS. Функция 0Ah INT21h - Buffered input.
Ну что же код теперь сразу буду скидывать А вообще проблема была в неправильной адресации. В процедуру передавал не тот адрес, поэтому происходило затирание. исправил, теперь все правильно работает. cppasm, а сегмент данных был такой: В вызывающей программе - Код (Text): data segment _s1 db 10 dup ('+') _s2 db 10 dup ('-') data ends В модуле описана структура - Код (Text): STRBUFFER STRUC STRMAX DB 255 STRLEN DB 0 STRCHAR DB 255 DUP ('*') STRBUFFER ENDS и в ее сегменте данных Код (Text): data segment buffer strbuffer <> data ends При компоновке данные располагаются в памяти так: ++++++++++ ---------- ******** и далее символ * 255 раз При вызове функции 0ah в модуле нужно было передать в DX адрес этого буфера, т.е. mov dx, offset buffer.strchar а я совсем не то закинул, проглядел. Поэтому данные писались в начало сегмента данных, а не по адресу буфера
cppasm Так все-таки номер, но никак не функция. Тов. Nikankin проглотил половину слов из вопроса - вот и начались неясности.