| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Проблема со стеком |
| Автор: alex_andr 20.2.2007, 07:13 |
| Здравствуйте! Прошу подсказать начинающему. Делаю начальные шаги в АСМе. Для простоты понимания тренируюсь в ДОСе. Исходные: ДОС 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 Что у меня не так? Прошу помочь добрым словом. С уважением. Александр. |
| Автор: JAPH 20.2.2007, 18:34 | ||||
| Сегмент стэка в маленьких программах необязателен, но его присутствие желательно, вот линковщик и предупреждает (! - заметьте, исполняемый файл-то он создаёт, это всего лишь warning). Сегмент стэка выглядит так:
В cseg надо прописать
Настраивать SS и SP не надо, они настраиваются автоматически при загрузке программы в память. |
| Автор: alex_andr 21.2.2007, 18:00 |
| Здравствуйте! Честно говоря, я не понял в чем моя ошибка. В размере стека? В Вашем примере 400h, это больше чем мои 60, или в прописывании оператора "assume"? Но в Вашем примере нет отличий от моего, просто Вы применяеете немного другие имена - cseg (у меня codseg) и sseg (у меня stseg) Что касается настройки сегментных регистров, то я пробовал и без этого, результат не меняется. Исполняемый файл, как Вы подметили, создается всегда, просто предупреждает. Кажется у Пирогова я читал, что без стека программа работать будет, она будет использовать системный стек. Но интересен сам факт, ведь я же все описываю, почему оно не принимает? Все остальное понимает, а это нет. И вот еще что меня смущает. Я как-то набрал пример из другой книжки, там синтаксис видимо от MASMа, а может и еще чего, я не знаю, хочу разобраться, так там он не ругался, все сделал без предупреждений. Примерно так было: model small .stack 100 .datseg ... ну и так далее. Я попробовал в свою программу поставить строку .steck 100, она потребовала model. Я прописал и про модель, все оттранслировалось без предупреждений, но программа не работала. В общем, я запутался. Если знаете подробнее, прошу пояснить. С уважением. Александр. |
| Автор: JAPH 22.2.2007, 21:47 | ||||
Sorry, невнимательно прочитал первый пост - прога разбита на куски, и я не заметил assume. В нём параметры разделяются запятыми, которых у вас в примере я не вижу.
Далее, что касается моделей памяти. Тут одно из двух - либо всюду полное определение сегментов, либо всюду .code, .data, .data? и т.п. Кстати, .model small P.S. У меня без ошибок и предупреждений отрабатывает
Да, и приводите полный пример программы - вдруг её работонеспособность обусловлена ошибками в коде (книги пишут люди)? |