Выравнивание LOCAL в MASM

Тема в разделе "WASM.BEGINNERS", создана пользователем nickye, 6 янв 2007.

  1. nickye

    nickye New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2007
    Сообщения:
    6
    Для чего директива LOCAL, кроме общего выравнивания esp на 4, выравнивает внутри еще и структуры с нечетным размером, и только если размер меньше кратного 4 на 1 байт (3,7,11),
    А вот напр. - LOCAL name[3]:BYTE - не выравнивается.
     
  2. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    LOCAL создаёт локальную переменную, если используется в рамках PROC с дефолтовым прологом. Выравнивание - это уже другая тема. В чём вопрос?

    Выравнивание обычно осуществляется на границу кратную размеру ячейки, которая в данном случае - 1 байт. Т.к. любой адрес кратен 1, выравнивания как-бы нет. Но его можно задать через структуру или директиву ALIGN, если нужно.
     
  3. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Quantum а для чего по большому счёту нужно выранивание только ли для отпимизации скорости?
     
  4. nickye

    nickye New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2007
    Сообщения:
    6
    То бишь

    some proc
    LOCAL stru3: STRU3B ; это структура размером 3 байт(или 7, 11);
    ;она выравнивается на границу dword
    ...

    some proc
    LOCAL stru5: STRU3B ; это структура 5 байт(6,9)
    ; не выравнивается
    ...

    some proc
    LOCAL mas3[3]:byte
    ; не выравнивается
     
  5. nickye

    nickye New Member

    Публикаций:
    0
    Регистрация:
    6 янв 2007
    Сообщения:
    6
    Зря я назвал это выравниванием, точнее может адресация через ebp по именам переменных

    Написал себе для интереса единый макрос именованных
    локальных переменных, как инициализируемых -
    через push, так и неинициализируемых (уменьшение esp)
    Второе сделал, поскольку LOCAL отпал из-за отмены
    стандартного пролога.
    И для этого второго случая хотел добавить "выравнивание",
    и посмотрел как работает LOCAL с разными типами.
    Отсюда непонятки. Адрес name:dword равняется на 4,
    name:word на 2, а вот нечетные структуры как-то непонятно.
    Может в этом особого смысла и нет - так, для порядка.
     
  6. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    rain
    Мне бы терпение leo, чтобы браться описывать такие обьёмные темы...

    В 2х словах могу сказать лишь следующее:
    В некоторых случаях без выравнивания просто нельзя (примеры: стек в Win32, DMA).
    Иногда выравнивание помогает оптимизировать ещё и размер кода.
     
  7. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    nickye
    не парся , нет там выйгрыша. Мерял получалось разница поподающая в погрешность.
    может на разных процах по разному? Кэш разный и доступ к нему.
    Quantum
    Спецом ложил ерунду все работает.
    как ? !!!!
    может от разных камней и мостов зависит, нет у меня время выснять, кто на примере покажет?
     
  8. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _SaNitAr
    Ты это о чём?

    Сначала без выравнивания:

    array: a0,b0,c0,d0,e0,f0,a1,b1,c1,d1,e1,f1,...

    Вычисляем адрес array.b:

    Значение i хранится в регистре reg32.

    [array + reg32*6 + 1]

    Код (Text):
    1. 8DXXXX          lea reg32,[reg32*2+reg32]
    2. 8DXXXX XXXXXXXX lea reg32,[reg32+reg32+array+1]
    Итого: 10 байт.

    Теперь с выравниванием на x8:

    array: a0,b0,c0,d0,e0,f0,0,0,a1,b1,c1,d1,e1,f1,0,0,...

    [array + reg32*8 + 1]

    Код (Text):
    1. 8DXXXX XXXXXXXX lea reg32,[reg32*8+array+1]
    Итого: 7 байт.
     
  9. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    это случай с индексаций по регистру, будет зависить от размерности массива и значений в массиве.
     
  10. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _SaNitAr
    Что будет зависеть от значений в массиве? Уж не размер ли кода? :) Что-то я тебя совсем не понимаю.
     
  11. Dostoevsky

    Dostoevsky New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2006
    Сообщения:
    33
    _SaNitAr
    Нет, у Квантума всё пучком, там используется поле масштаба в SIB байте, которое может быть 1,2,4,8. За счет этого поля размер опкода уменьшается.
     
  12. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    Quantum
    ienybu
    шутниг
    имелось ввиду размерность операндов типа dw
    Dostoevsky
    пониль я вроде пришлось кныжки паштудировать.