Особенности команд ENTER, RET imm16

Тема в разделе "WASM.BEGINNERS", создана пользователем SUMMONER, 9 сен 2006.

  1. SUMMONER

    SUMMONER New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    11
    Привет всем участникам форума!
    С асмом знаком довольно давно на уровне университетских лаб. Однако это не помешало мне прочитать пару книг по нему почти полностью. Т.е. не полный ньюб, но в тоже время, не сталкивался с написанием 32х битных программ.

    Раньше писал только 16и битные программы. А сейчас читал рассылку "процессор Intel в защищённом режиме" и пытался вникнуть в особенности 32х битного программирования. А посему вопросы.

    1. Основная книга по АСМу, по которой я занимался -- учебник Юрова. Там написано следующее:
    Непонятка заключается в том, что в мануале от интела, в описании команды ret imm16 (коды С2 iw и CA iw) чётко написано что из стека удаляются imm16 байт. У Зубкова тоже по этому поводу есть пару предложений:
    Кому следует верить? Проясните пожалуйста этот момент?
    Если в любом случае из стека удаляеются байты, то как быть в случае, когда параметры при вызове функции занимают больше 64 килобайт?


    2.Не могу понять как работает команда enter с уровнями вложенности более 0го. Для нулевого уровня вложенности всё ясно:
    Код (Text):
    1. push bp
    2. mov bp, sp
    3. sub sp, sizeOfLocalVariables
    А что делает команда на более высоких уровнях вложенности не ясно %( Глава "5.3.2. Вложенные процедуры с дисплеями" в Зубкове не сильно помогает :dntknw:


    3. Что происходит с командами in\out и int в защищённом режиме? Они остаются? т.е. по прежнему в нижних адресах расположена таблица векторов прерываний? И только Windows не дают к ним обратиться, т.к. обычные программы функционируют в ring3? А если программа сможет работать в ring0, то она сможет обращаться к портам устройств напрямую и вызывать прерывания?
    Проясните пожалуйста этот момент...


    4.При написании 32х битных приложений, я могу пушать в стек как слова, так и двойные слова?

    Заранее спасибо за ответы. ;))
     
  2. SUMMONER

    SUMMONER New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    11
    В догонку: если я хочу получить альтернативное руководство - описание команд процессора от компании AMD, то какой файл у них на сайте мне стоит искать? Я имею ввиду аналог "® IA-32 Intel Architecture Software Developers Manual". Меня интересует только описание команд.
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Привыкай к тому, что в 32-х битном режиме регистры 32 битные, т.е. макситальное значение регистра 0ffffffffh
    1.Из стека вытаскивается адрес возврата+число байт которое указано. К примеру ret 4 изменит стек на 8 байт 4(адрес возврата)+4(байта)
    2.leave освобождает локальнае переменные и восстанавливает старые значения ebp и esp. Она эквивалентна командам:
    mov esp,ebp
    pop ebp
    4.Толкать то ты можешь, только вот стек желательно выравнивать на 4 байтную границу.
    5.http://wasm.ru/forum/viewtopic.php?id=15932 - здесь что-то проскакивало, но я не смотрел.
     
  4. NoResponse

    NoResponse New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2005
    Сообщения:
    89
    AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions (4,76 МБ)

    если заинтересует не только описание команд - Technical Documentation
     
  5. SUMMONER

    SUMMONER New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    11
    Привык уже... это не сложно ;)
    Смотри, я имел ввиду тот факт, что товарищи из интела пишут:
    Код (Text):
    1. "® IA-32 Intel  Architecture Software Developers Manual" :
    2. C3       RET                      Near return to calling procedure.
    3.  
    4. CB       RET                      Far return to calling procedure.
    5.  
    6. C2 iw   RET imm16             Near return to calling procedure and pop imm16 bytes from stack.
    7.  
    8. CA iw   RET imm16             Far return to calling procedure and pop imm16 bytes from stack.
    Везде стоит imm16, а значит, вытолкать из стека можно максимум 64 кб. Но ведь можно адресовать до 4 Гб данных. А значит имеем ущимление прав :dntknw: Вот с этим-то и непонятки!

    Значит, всё-таки у Юрова бока в книге! А ведь у меня второе (исправленное) бумажное издание. В первом бумажном и электронном издании тоже самое написано... Это ведь критически важный момент ;) Прикиньте, что-то левое из стека по завершении процедуры вытолкнется и будешь долго искать свою ошибку ;)
    Публично извиняюсь. Думаю про команду enter, пишу в посте команду leave, a все остальное про команду enter. C leave врядли могла возникнуть проблема с пониманием...
    Итак, вопрос остаётся открытым...
    Спасибо!
    NoResponse, спасибо большое ;)
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Рамер стека гораздо меньше 64Kb.

    Код (Text):
    1. pop eax
    2. add esp,imm32
    3. jmp eax
     
  7. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Гхрм... Меньше 64Кб? А как же тогда рекурсивные процедуры? Размер стека может занимать n-ое кол-во процентов от виртуального пр-ва программы, то есть в принципе, как и в досе - до переполнения, а значит ОЧЕНЬ много!
     
  8. SUMMONER

    SUMMONER New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    11
    Как это размер стека гораздо меньше 64 кило? В заищённом режиме размер стека теоретически может быть до 4 гигов...

    Кратко повторю непрояснённые вопросы:
    --> При написании ret n, n - это всегда байты? Действительно ли таким образом можно поднять только до 64 кило данных? не зависимо от режима работы процессора?
    --> Как работает команда enter с уровнем вложенности большим нуля?
    -->
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Почитай мануалы по защищенному режиму здесь на сайте. Можешь Фроловых поискать в сети.
     
  10. NoResponse

    NoResponse New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2005
    Сообщения:
    89
    как я понял он имел ввиду что именно команда (RET im16) неможет вытолкать больше чем 64к
    никада на эту тему не филосовствовал, да и небыло повода
    плюс никада не встречался с процедурками у которых параметры в сумме 64к и больше
     
  11. SUMMONER

    SUMMONER New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    11
    Отследил работу программы -- действительно они принимают в качестве источника 16 битные значения... Странно, такая недальновидность со стороны Intel'a. А ведь введена команда enter в 80286 процессоре. Мда....
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Про ret n, честно говоря, не задумывался, но, FASM, например, на ret 0xFFFFFFFF говорит 'value out of range'. Это, конечно еще не показатель, да и вообще, такие тесты не самый лучший способ -- лучше почитать, но когда не понятно то не грех и попробовать.

    -----------------------------
    В команде 'enter n1, n2' n1 определяется уровень вложенности процедуры. По сути дела, n2 это количество указателей стековых кадров предыдущих процедур, которые будут скопированы в новый стековый кадр.

    Указатели предыдущих стековых кадров нужны для адресации переменных процедур, находящихся на более высоком лексическом уровне относительно вызванной процедуры. Максимальный уровень вложения == 32.

    Такая возможность полезна для языков, где можно определять вложенные процедуры (кажется, в Паскале такое можно?), но процедуру, скомпилированную на оределенном уровне вложенности, как я понимаю, нельзя вызвать с другого уровня (т.е., если уровень вложенности процедуры == 3, то необходимо, чтобы до этого были вызваны процедуры с уровнями 1 и 2).

    В Си, например, вложенных процедур нет, и т.к. команды 'push ebp; mov ebp, esp; sub esp, num' выполняются быстрее чем 'enter num, 0' (думаю, начиная с i486), то enter сейчас почти не используется.
    -----------------------------
    Как-то сумбурно и очень заумно получилось, если не ясно -- спрашивай :). Подробный алгоритм команды enter можно посмотреть тут: http://developer.intel.ru/download/design/Pentium4/manuals/25366617.pdf, 3-270 Vol. 2A

    Команды in/out, конечно, остались, но просто так их выполнить не получится. Когда процессор натыкается на такую команду, то он:
    1. Смотрит CPL текущего сегмента кода. Если CPL == 0, то команда выполняется.
    2. Если CPL != 0, то CPL сравнивается с IOPL в EFLAGS. Если CPL <= IOPL, то команда выполняется.
    3. Если CPL > IOPL, то проверяется таблица разрешения портов ввода/вывода (если она есть) в сегменте TSS. Если запись в этот порт разрешена, то команда выполняется.
    4. Вот она смерть, вот она :). Процессор генерирует особый случай общей защиты.
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    SUMMONER
    Да

    Застрелиться, но лучше обратиться к врачу ;)

    Организовать пикет на Красной площади, буянить, биться в истерике - люди в черном и белом не оставят тебя без внимания и помогут чем могут ;)

    Отстаешь от жизни - в 64-битном режиме теоретический размер может быть до 2^64 ;)
    Вот с братьями по разуму и обсудите этот вопрос, сначала на митинге, а потом куда определят ;)

    Теперь без шуток - бросай ньюбские амбиции, начинай шевелить мозгом и читать на досуге серьезную макулатуру ;) Ежели тебя этот вопрос так волнует, то отложи асм в сторону и для начала познакомься со страничной адресацией и принципами распределением памяти в windows. А если не терпится, то самое простое - возьми отлатдчик OllyDbg, загрузи любую прогу и кликни меню View\Memory - получишь наглядный вид Memory Map. Тут тебе сразу станет ясно где теория, а где практика. Посмотришь на расположение и размер stack of main thread и поймешь что к чему ;) Только выводы нужно делать правильные и на трезвую голову - это не "ущемление прав", а просто нормальное правило программинга - стеку стеково, хипу хипово, а рету ретово :))) В принципе, конечно можно в стек затолкать и 64К и 64М если в PE-хидере соответсвующиие значения SizeOfStackReserve прописать, но вот предавать их в качестве праметра в stdcall-функции можно только по указателю и затем удалять простым add esp, XXL - поэтому проблемы тут никакой соб-но и нет ;)
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    SUMMONER
    Странно, что человек знакомый с 16-битным досовским программированием считает, что 64К для стека может быть слишком мало.

    Мда, такую извратную крайность в Intel явно забыли учесть.

    Отладчик в помощь, раз интеловским мануалам и скромным форумчанам мы уже не доверяем.

    Хотел скопипастить описание из IA32, но передумал. Что именно в доке непонятно написано?

    Да, в Intel по той же причине забыли расширить сегментные регистры до 32 бит :)))

    ЗЫ: Пока я заползал обратно на кресло и вытирал смайлики из своего сообщения, leo успел всё популярно разьяснить.
     
  15. SUMMONER

    SUMMONER New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    11
    Пожалуйста, будь поспокойнее. Я знаю как писать нужный мне код в тех или иных ситуациях. Речь шла про конкретные команды. С целью узнать ограничения процессора. И только. Как мне поступать в ситуации (к слову сказать, довольно специфической), когда требуется выделить более 64 кило для локальных переменных я знаю и без ответов на форуме.

    Это входит в мои самые ближайшие планы. ;)
    Хорошее предложение. Посмотрел, оценил ;) В основном идут значения размера стека 0x1000 - 0x3000. Но вопрос был "взагали", а не конкретно применяя к моему коду.
     
  16. SUMMONER

    SUMMONER New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    11
    Я же в первом посте пояснил, что писал только 16и битные программы под ДОС. Собираюсь переходить на Windows. Новые проблемы, новый защищённый режим... Довольно непривычно. Где я указывал на то, что этих 64 килобайт для стека мне мало? Мне хотелось бы знать особенности процессора и команд (с их ограничениями) которые он понимает. Неужели такое позорное желание? А мне и сотой их части не нужно было использовать. Видишь ли, мне всегда для стека хватало 256 байт -- программы были небольшими, не более 3-4 тысяч строк (с комментариями).

    Не доверял бы опыту форумчан -- не спрашивал бы тут. Но доверять нужно осторожно. Вот довольно популярной книжке Юрова доверил свои первые шаги в мир низкоуровневого программирования, а в ней такой серьёзный бок обнаружился с ret'ами. А ты говоришь "доверяй"...

    Цитировать ничего не надо было. Мануал интела я читал. Теперь, после пояснений Mika0x65 стало понятно.

    А ты Питрасян, наверна? ;)

    Mika0x65, спасибо за пояснение сути ;)
     
  17. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    SUMMONER
    Помню такой прогон у Юрова в учебнике был с командой RET n - там он как раз и писал про 16 и 32 битный режимы работы этой комманды (кстати такую же иформацию можно и в Norton Guides найти мол при use16 байты выдвигаются а при use32 - слова) гон чистой воды - выдвигаются именно байты.
     
  18. SUMMONER

    SUMMONER New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    11
    Эта ошибка у него наследуется из издания в издание его книги ;)))
     
  19. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    SUMMONER
    просто его источники, выходит, совсем непроверенные и неавторитетные! хорошо что его справочник ещё не купил (точнее уже давным-давно не купил;). Зато хорошее подспорье в идеях "Нет авторитетов в нашем отечестве" - даёшь скепсис во всём и везде!
     
  20. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    SUMMONER
    Если ты называешь это ограничением, то, видимо, специфичная ситуация со стек-фреймом в 64 и более килобайт для тебя не является редкостью. Кстати, если бы ret поддерживал imm32, то размер этой инструкции вырос бы с 3х байт до целых 5и. Аналогично для enter. Мне лично больше нравится тот вариант, который предложен интелом. Всё-таки там не дураки сидят.

    Где я агитирую за слепую веру в популярные книги? В книгах полно опечаток и ошибок.

    Нет.