|
|
| Посл.отвђт | Сообщен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 |