Затирание данных в DS

Тема в разделе "WASM.BEGINNERS", создана пользователем Nikankin, 24 апр 2008.

  1. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Здравствуйте.
    Мне необходимо считать с клавиатуры строку, с помощью 0Ah. Эта процедура у меня находится в отдельном модуле.
    В нем объявляю сегмент данных, где описывается переменная (которая понадобится для обращения к полям структуры, заполняемой функцией 0Ah). В главной программе также объявлен сегмент данных, заполненный полезной информацией. Из главной программы вызывается процедура считывания, и выходит так, что этот буфер, объявленный в подпрограмме начинает при заполнении перетерать данные моей главной программы.
    Как можно этого избежать? И как вариант решения, можно объявить глобально этот буфер. Но "нормально" ли это.
    Такой момент. В главной программе регистры DS, ES настроены на один сегмент, так нужно.
    Подскажите пожалуйста.

    Если нужна дополнительная информация, в частности исходный код, скажите .
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Я на вас Nikankin удивляюсь... Таки я думал, шо это не форум телепатов, покажи свой код, фрагмет кода - тогда можно будет подумать, стоит ли там что-либо обсуждать;)
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Nikankin
    Если программа написана с соблюдением определенных правил, то компилятор позаботится, что никто ничего не затриал. 0Ah - это число 10 и функцией быть не может - максимум адресом ее в памяти. Если писать с абсолютными адресами, то тоже ничего не затрешь, но нужно проделать ту работу , которую делает компилятор. Собственно так сначала и делали, а потом сделали компилятор. Потом поняли, что возникли новые проблемы, пришлось делать ОС и пошло и поехало :)
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Компилятор ассемблера ни о чём не заботится.
    Для того у программиста голова на плечах есть чтоб заботиться :)
    Без исходного кода можна долго тут гадать, а в итоге у него написано что-то вроди
    Код (Text):
    1. buffer db 0
    а читает он в этот буфер строку и удивляется почему что-то затирает.
    Он не первый такой, были уже такие вопросы :)
    Код в студию, там видно будет.
    Как раз таки это и есть номер функции DOS.
    Функция 0Ah INT21h - Buffered input.
     
  5. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Ну что же код теперь сразу буду скидывать :)
    А вообще проблема была в неправильной адресации. В процедуру передавал не тот адрес, поэтому происходило
    затирание. исправил, теперь все правильно работает.

    cppasm, а сегмент данных был такой:
    В вызывающей программе -
    Код (Text):
    1. data segment
    2. _s1 db 10 dup ('+')
    3. _s2 db 10 dup ('-')
    4. data ends
    В модуле описана структура -
    Код (Text):
    1. STRBUFFER STRUC
    2.     STRMAX  DB 255
    3.     STRLEN  DB 0
    4.     STRCHAR DB 255 DUP ('*')
    5. STRBUFFER ENDS
    и в ее сегменте данных
    Код (Text):
    1. data segment
    2.  buffer strbuffer <>
    3. data ends
    При компоновке данные располагаются в памяти так:
    ++++++++++
    ----------
    ******** и далее символ * 255 раз
    При вызове функции 0ah в модуле нужно было передать в DX адрес этого буфера, т.е. mov dx, offset buffer.strchar
    а я совсем не то закинул, проглядел. Поэтому данные писались в начало сегмента данных, а не по адресу буфера
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    cppasm
    Так все-таки номер, но никак не функция. Тов. Nikankin
    проглотил половину слов из вопроса - вот и начались неясности.