· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Пролог субпрограмм

Посл.отвђт Сообщенiе


Дата: Май 5, 2004 15:57:00

Если я опять не туда, то сорри...

Вобщем решил я написать свой макрос для работы с процедурами (FASM), а для этого надо бы знать как это всё работает без макросов. Вроде всё понял, но...

enter x, y

x - колличество байт резервируемых в стеке
y - чтото связанное с рекурсией

Теперь вопросы:

1) что означает аргумент y - желательно подробнее, а то в кратце написанно в книжке, но я ни чего не понял.

2) под виндой обнаружил интересный глюк, создал процедуру с прологом enter 6, 0 и в ней вызвал API функцию (конкретно WSAStartup) после чего стек был разрушен. Выровнял кадр стека (это вроде так называется?) на 4 байта (enter 8, 0) и всё стало работать на ура. Так вот, это винда вводит такое ограничение? Всегда ли нужно ему следовать? Почему винда разрушила стек?


Дата: Май 5, 2004 20:02:08

> Всегда ли нужно ему следовать?

Стэк всегда должен быть выровнян до четырех байт.


Дата: Май 9, 2004 12:23:41

JaDS
А зачем тебе эта жуткая команда enter? Ниразу не видел, чтобы ее кто-то употреблял. ИМХО, если хочешь сделать все по уму, то надо делать руками. Создавать кадр стека etc. А в конце процедуры звать retn <число параметров функции * 4> Вот тогда вопросов не возникнет.


Дата: Май 9, 2004 18:03:52

эта жуткая команда enter хотя и медленна, но может сэкономить пару байт

y -уровень вложенности - это для HLL компиляторов специально было добавленно, но они AFAIK уже давно не юзают это.
Из интеловского толмуда:
NestingLevel <- NestingLevel MOD 32
Push(EBP) ;
FrameTemp <- ESP;

IF NestingLevel = 0
   THEN GOTO CONTINUE;
FI;

IF (NestingLevel > 0)
  FOR i <- 1 TO (NestingLevel - 1)
    DO
      EBP <- EBP - 4;
      Push([EBP]); (* doubleword push *)
    OD;
  Push(FrameTemp); (* doubleword push *)
  GOTO CONTINUE;
FI;

CONTINUE:
EBP <- FrameTemp
ESP <- EBP - Size;

END;


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076