пара нубских вопросов про стек

Тема в разделе "WASM.BEGINNERS", создана пользователем Guru_of_Zen, 16 фев 2010.

  1. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    вопрос 1)

    вот читаю у Абеля - "стек определен как DW 32H", "стек определен как 64H". какое значение при этом содержится в SP (изначально, т.е. без заталкивания чего-либо в стек) ?

    я так понимаю что в SP содержатся именно 32H, 64H соответственно ?

    вопрос 2)

    у того же Абеля - что содержится в SP после PUSH'a // POP'a ?

    я понимаю что один PUSH уменьшает SP на 2, а РОР соответственно прибавляет SP на 2 но

    в какой системе считать ? в шестнадцатеричной ? если да то почему ?

    буду благодарен за ответы.
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    Guru_of_Zen
    Странный ник у ньюба :)
    У COM-файла стек, данные и команды находятся в единственном сегменте и DS=CS=ES=SS
    SP "нацелен" на дно сегмента и равен 0FFFEh. После первой команды PUSH он (SP) станет равным 0FFFCh (=0FFFEh-2)
    а если сразу после этого выполнить команду POP (0FFFCh+2=0FFFEh)
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Guru_of_Zen
    Что-то странное... DW 32H -- это всего лишь определение одного слова (16 бит) со значением 32 шестнадцатеричное, и ничего более. Нельзя ли полную цитатку?

    Что же касается до начального значения SP, то там будет то, что занесёт система при запуске программы или же что занесёт сам программист. Насчёт СОМ-файлов уже ответили, а в ЕХЕ начальное значение SS:SP хранится в заголовке ЕХЕ-файла.

    Абсолютно без разницы, в какой системе. Сами значения от этого не меняются. Система счисления -- это _способ записи_ значения, а не само значение.
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Guru_of_Zen
    вы оторвали неинфоративный кусок

    стек работает со словами, двойными словами или учетверенными словами в зависимости от режима работы и процессора
    соответственно пуши и попы вычитают и добавляют 2, 4, 8 к sp/esp

    про систему точнее не скажешь
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    *информативный
     
  6. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    Mikl___
    ыхых : ))
    лень придумывать было ))
    ну и на вырост, с заделом естественно ;)

    SII

    пожалуйста:

    книга называется "ассемблер. язык и программирования для IBM PC". 5-ое издание. (корона-век, век) (в сети пятого издания нету есличо, только какое-то древнее валяется, совсем по-другому все.)

    страница 55, "вопросы и упражнения" :

    8. если стек определен как DW 32H, каково содержимое регистра SP, если а) стек пуст? б) стек полон ?

    ==================================================================

    тоже не понял причем тут слово...

    впрочем имхо Rockphorr прав - слово определяет размер элемента стека. т.е. я так понял что по дефолту размер элемента стека == слово (2 байта == 16 бит), а можно поставить двойное слово и/или учетверенное слово.
    (кстати параграф нельзя поставить ? :))

    SII

    про систему счисления-то понятно.

    ===

    вопрос в другом:

    допустим, что ось загружает в SS адрес некой ячейки памяти (например адрес ячейки памяти 4F2A0H попадает в SS в виде 4F2AH), с этой ячейки у нас начинается сегмент стека (пример для типа .ЕХЕ).

    далее ось загружает в SP значение, равное размеру стека - т.е., значение, указывающее на байт, следующий за концом сегмента стека. например в SP загрузилось 36H.

    ==============================================================
    =================================================================
    ==============================================================

    ну и собственно вопросы:

    1) изначально в SP содержится размер стека. в нашем примере - 36H.

    на что указывает 36H - на последний байт в сегменте стека или же на первый байт, следующий за концом сегмента стека ?

    2) в SP - (16-разрядный регистр) - хранится 0011 0110. (36H).

    после PUSH'a SP равняется 0011 0110 - 0010 = 0011 0100 (34H) и т.д.

    это вроде ясно.
     
  7. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    ну и собственно вопрос из книги:

    8. если стек определен как DW 32H, каково содержимое регистра SP, если а) стек пуст? б) стек полон ?

    если плюнуть на несколько некорректную формулировку, то размер стека каков ?

    50 (в десятичной системе счисления) байт, так / нет ?

    если же стек пуст, то SP = 32H
    если стек полон, то SP = 0

    верно ?
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    Удел воина дзена -- скромность, трудолюбие и послушание
    Не правильно. Стек увеличивается/уменьшается на 2 в Real mode (DOS) при использовании 16-разрядного SP; увеличивается/уменьшается на 4 в Protect Mode (Win32 и другие 32-разрядные ОС) при использовании 32-разрядного ESP; увеличивается/уменьшается на 8 при использовании 64-разрядного RSP (x64)
    Если размер стека 50h, то наверное SP равно 50h, когда он пуст и SP=0 когда он полон, но конкретно нужно смотреть в отладчике каково содержимое SP. За состоянием SP следит не система, а программист, который должен отследить, когда SP близок к нулю и не допустить "переполнение стека" иначе последствия не предсказуемы.
     
  9. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    "наверное" - это я и сам знаю :)

    мне в первую очередь интересно - на что указывает 50H ?

    на последний байт в сегменте стека или на первый байт, следующий за концом сегмента стека ??
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    Guru_of_Zen
    При размере стека в 50h(=80d) при запуске программы SP будет указывать на 80-ый байт от начала сегмента стека
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    Guru_of_Zen
    Запасаемся терпением и отладчиком и начинаем программировать, пишу программу следующего содержания
    Код (Text):
    1. .model small
    2. .code
    3. .286
    4. Start: push ax
    5.     pop ax
    6.     mov ah,4Ch
    7.     int 21h
    8. .stack
    9. dw 20 dup (0)
    10. .data
    11. stackend db 'end of stack'
    12. end start
    компилирую MSoft'овскими ml.exe и линкую link.exe заглядываю в EXE afd-отладчиком CS=21F0h IP=0000h SS=21F4h SP=0400h хотя код программы заканчивается на 5 байте, а на 2Eh видно надпись 'end of stack' заглядываю в EXE hiew32 "SS:SP setting 0004:0400" получается для корректной работы EXE содержимое SS и SP требуется предварительно настроить, а на "определение стека, как DW 32H" компилятор чихать хотел и на что указывает SP при старте программы одному Биллу Гейтцу известно :)
     
  12. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Враньё. Посмотри заголовок.
    Размер стека прописан там, и загрузчик выделит память и SS/SP настроит.
    Тебе никто не гарантировал что сегменты будут идти в порядке объявления в программе.
    Загрузчик стэк выделить может где захочет.
    4 - это номер релока, если это смущает.
    Заменяется загрузчиком на реальный адрес сегмента при загрузке.
     
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    cppasm
    В чем вранье? Я данные взял хьювом из заголовка EXE "SS:SP setting 0004:0400" CS=21F0h SS=CS+4=21F4h SP=0400h
    Так отладчик и показывает. Длина кода 6 байт, значит до 10h код должен был дополнится нулям и при CS=21F0h SS должен быть 21F1h, далее 40 байт стека, снова выравнивание на границу параграфа и далее секция данных, а что получилось на самом деле я уже написал
     
  14. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    cppasm
    а разговор про com или exe файлы? не совсем понял из контекста вопросов
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    qqwe
    О COM я написал выше (#2), да там стек и не определяется, теперь расcматриваем EXE (.model small в примере)
     
  16. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mikl___
    Вы неверно понимаете словосочетание "стек определён как". Это не то, что Вы запихнёте в стек (Ваши dw 20 dup (0)), а то, что будет указано по смещению 10h в заголовке exe-шника (bzw. параметр /F линкера).
    Соответственно в этом и враньё. :) Т.е. явно не только Гейтс в курсе, что будет в sp. И уж точно компилятор не хотел чихать на параметр линкера, указывающий размер стека.
    Т.е. Guru_of_Zen вполне правильно ответил на вопрос.
     
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.890
    l_inc
    То есть стек по умолчанию не менее 400h, а если бы я указал dw 1024 dup (0) то по смещению 10h от "MZ" стояло бы 0004:800h? если я определяю сегмент как SEGMENT PARA STACK 'Stack' то он выравнивается по границе параграфа, а если .stack то выравнивание нужно указывать в ключах линкера? Слишком много всяких если, хотя Guru_of_Zen требовался простой и внятный ответ. Поэтому я и написал
     
  18. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mikl___
    P.S. Кстати, неясно, что Вы вообще имели в виду под dw 20 dup (0), т.к. согласно документации директива .stack лишь определяет стек, но не указывает его содержимое. Другое дело, если бы Вы указали после неё размер стека. Ну так это и было бы то самое "стек определён как".
     
  19. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mikl___
    Уже ответил в P.S. предыдущего поста. :) Это dw 1024(0) отправится в кодовый сегмент и к стеку не имеет отношения.
     
  20. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    *dw 1024 dup (0)