Почему стек должен быть выровнен на 4-байтную границу ??

Тема в разделе "WASM.BEGINNERS", создана пользователем int2e, 4 фев 2009.

  1. like

    like New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    21
    Адрес:
    Чебоксары
    Не вводи в заблуждение народ - не стек должен быть выровнен, а адреса переменных.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    like
    Не вводи людей в заблуждение; так как локальные переменные находятся в стеке, следовательно стек должен быть выровнен.
     
  3. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Clerk
    Локальная переменная может быть представлена в стеке как составляющая структуры, внутри которой адрес не выровнен на 4.

    Код (Text):
    1. program Project1;
    2. {$APPTYPE CONSOLE}
    3.  
    4. uses Windows, SysUtils;
    5.  
    6. var
    7.   e: DWORD;
    8.   b1, b2: Byte;
    9.   libname: array [0..20] of Char = 'kernel32.dll'#0;
    10.  
    11. function GetAAA(p: Pointer; b: Byte): DWORD; stdcall;
    12. var
    13.   aaa: packed record
    14.     n1: Byte;
    15.     pp: PChar;
    16.     n2: Byte;
    17.   end;
    18. begin
    19.   aaa.pp := @libname;
    20.   Writeln(IntToHex(DWORD(@p), 8));
    21.   Writeln(IntToHex(DWORD(@aaa.pp), 8));   // два последних бита не нули
    22.   Result := Windows.LoadLibraryA(aaa.pp);   // возвращает не ноль
    23. end;
    24.  
    25. begin
    26.   Writeln(IntToHex(DWORD(@libname), 8));
    27.   e := GetAAA(nil, 1);
    28.   Writeln(e);
    29.   Readln;
    30. end.
    Что я делаю не так?
    Если я неправильно понял суть всей этой темы, то донесите ваши выводы в понятной форме (про x64 пока забудем).
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    T800
    В каком смысле? Работает именно потому, что всё так: т.е. стек выравнен на четырёхбайтную границу. Невыравненность aaa.pp в стеке не имеет никакого отношения к выравниванию переданного в LoadLibrary аргумента вызовом Windows.LoadLibraryA(aaa.pp).
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    T800
    Думою я уже абсолютно все аспекты в данном топике освятил насчё выравнивания(даже с примерами, где разбирается ядерный вызов), читай заново.
     
  6. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Собственно я думаю что выравнивание - чисто фича Microsoft никакой реальной почвы под собой она не имеет. Просто им так захотелось.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    AndreyMust19
    Фича может и майкрософт, только почва имеется. Это интел умеют сами обрабатывать исключения выравнивая, а моторола увы нет.
     
  8. V1lko

    V1lko New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    53
    Если бы стэк был выровнен не на 4 байта, а скаже на 3 смогли бы вы выполнить команду push еах? Или при вызвове функции передать ей адрес, указывающий на что либо в 4 гб пространстве?
    Вот и ответ на вопрос.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    V1lko
    Конечно, почему нет ?
    ИМХО бред.
    [Нужна капча и посложнее..]
     
  10. V1lko

    V1lko New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    53
    По моему выравнивание стэка диктуется разрядностью регистра и соответственно проца.
     
  11. like

    like New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2008
    Сообщения:
    21
    Адрес:
    Чебоксары
    Clerk
    Я про сегмент данных.