Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема со стеком 
:(
    Опции темы
alex_andr
Дата 20.2.2007, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.2.2007

Репутация: нет
Всего: нет



   Здравствуйте!

   Прошу подсказать начинающему.
Делаю начальные шаги в АСМе. Для простоты понимания тренируюсь в ДОСе.

   Исходные: ДОС 6.22, ТАСМ 3.0, Вот линкер не помню версию, но достался мне
в одном пакете с ТАСМом.

   Проблема в том, что линковщик всегда ругается на отсутствие стека, хотя
я добросовестно, один к одному из книги Пирогова вырисовываю скелет
программы вот в таком примерно виде:

    datseg    segment
mem1    db    ?    ;для запоминания какой нибудь фигни
    ...    ...    ;бла бла бла
    datseg    ends

    stseg    segment stack
    db    60 dup (?)
    stseg    ends

    codseg    segment
    assume    cs:codseg ds:datseg ss:stseg

Затем, как положено провожу настройку сегментных регистров
begin:    mov    ax,stseg
    mov    ss,ax
    mov    ax,datseg
    mov    ds,ax

Ну дальше там код программы
    бла
    бла
    бла

Ну и завершающий штрих
    codseg    ends
    end    begin


    Что у меня не так? Прошу помочь добрым словом.

    С уважением. Александр.
PM MAIL   Вверх
JAPH
Дата 20.2.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



Сегмент стэка в маленьких программах необязателен, но его присутствие желательно, вот линковщик и предупреждает (! - заметьте, исполняемый файл-то он создаёт, это всего лишь warning).
Сегмент стэка выглядит так:
Код

sseg segment stack
     db 400h dup (?) ;400h - размер стэка
sseg ends

В cseg надо прописать
Код
assume cs:cseg, ss:sseg

Настраивать SS и SP не надо, они настраиваются автоматически при загрузке программы в память.


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
alex_andr
Дата 21.2.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.2.2007

Репутация: нет
Всего: нет



     Здравствуйте!

   Честно говоря, я не понял в чем моя ошибка. В размере стека? В Вашем примере 400h,
это больше чем мои 60, или в прописывании оператора "assume"? Но в Вашем примере
нет отличий от моего, просто Вы применяеете немного другие имена - cseg (у меня codseg)
и sseg (у меня stseg)
   Что касается настройки сегментных регистров, то я пробовал и без этого, результат не
меняется. Исполняемый файл, как Вы подметили, создается всегда, просто предупреждает.
Кажется у Пирогова я читал, что без стека программа работать будет, она будет
использовать системный стек. Но интересен сам факт, ведь я же все описываю, почему
оно не принимает? Все остальное понимает, а это нет.
   И вот еще что меня смущает. Я как-то набрал пример из другой книжки, там синтаксис
видимо от MASMа, а может и еще чего, я не знаю, хочу разобраться, так там он не
ругался, все сделал без предупреждений. Примерно так было:

model     small
.stack     100
.datseg   ...

ну и так далее.

     Я попробовал в свою программу поставить строку .steck   100, она потребовала model.
Я прописал и про модель, все оттранслировалось без предупреждений, но программа не
работала.
   В общем, я запутался. Если знаете подробнее, прошу пояснить.

     С уважением. Александр.
PM MAIL   Вверх
JAPH
Дата 22.2.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



Sorry, невнимательно прочитал первый пост - прога разбита на куски, и я не заметил assume. В нём параметры разделяются запятыми, которых у вас в примере я не вижу. 
Код
assume cs:codseg, ds:datseg, ss:stseg

Далее, что касается моделей памяти. Тут одно из двух - либо всюду полное определение сегментов, либо всюду .code, .data, .data? и т.п. Кстати, .model small smile


P.S. У меня без ошибок и предупреждений отрабатывает
Код

sseg segment para public stack use16 'stack'
     db   20h dup (?)
sseg ends
cseg segment para public use16 'code'
     assume  cs:cseg, ds:dseg, ss:sseg
@:   mov  ax, dseg
     mov  ds, ax
     mov  dx, offset strn
     mov  ah, 09h
     int  21h
     mov  ax, 4C00h
     int  21h
cseg ends
dseg segment para public use16 'data'
strn db   'Opit', 0Dh, 0Ah, 24h
dseg ends
     end @


Да, и приводите полный пример программы - вдруг её работонеспособность обусловлена ошибками в коде (книги пишут люди)? smile



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.