Для чего директива LOCAL, кроме общего выравнивания esp на 4, выравнивает внутри еще и структуры с нечетным размером, и только если размер меньше кратного 4 на 1 байт (3,7,11), А вот напр. - LOCAL name[3]:BYTE - не выравнивается.
LOCAL создаёт локальную переменную, если используется в рамках PROC с дефолтовым прологом. Выравнивание - это уже другая тема. В чём вопрос? Выравнивание обычно осуществляется на границу кратную размеру ячейки, которая в данном случае - 1 байт. Т.к. любой адрес кратен 1, выравнивания как-бы нет. Но его можно задать через структуру или директиву ALIGN, если нужно.
То бишь some proc LOCAL stru3: STRU3B ; это структура размером 3 байт(или 7, 11); ;она выравнивается на границу dword ... some proc LOCAL stru5: STRU3B ; это структура 5 байт(6,9) ; не выравнивается ... some proc LOCAL mas3[3]:byte ; не выравнивается
Зря я назвал это выравниванием, точнее может адресация через ebp по именам переменных Написал себе для интереса единый макрос именованных локальных переменных, как инициализируемых - через push, так и неинициализируемых (уменьшение esp) Второе сделал, поскольку LOCAL отпал из-за отмены стандартного пролога. И для этого второго случая хотел добавить "выравнивание", и посмотрел как работает LOCAL с разными типами. Отсюда непонятки. Адрес name:dword равняется на 4, name:word на 2, а вот нечетные структуры как-то непонятно. Может в этом особого смысла и нет - так, для порядка.
rain Мне бы терпение leo, чтобы браться описывать такие обьёмные темы... В 2х словах могу сказать лишь следующее: В некоторых случаях без выравнивания просто нельзя (примеры: стек в Win32, DMA). Иногда выравнивание помогает оптимизировать ещё и размер кода.
nickye не парся , нет там выйгрыша. Мерял получалось разница поподающая в погрешность. может на разных процах по разному? Кэш разный и доступ к нему. Quantum Спецом ложил ерунду все работает. как ? !!!! может от разных камней и мостов зависит, нет у меня время выснять, кто на примере покажет?
_SaNitAr Ты это о чём? Сначала без выравнивания: array: a0,b0,c0,d0,e0,f0,a1,b1,c1,d1,e1,f1,... Вычисляем адрес array.b: Значение i хранится в регистре reg32. [array + reg32*6 + 1] Код (Text): 8DXXXX lea reg32,[reg32*2+reg32] 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): 8DXXXX XXXXXXXX lea reg32,[reg32*8+array+1] Итого: 7 байт.
_SaNitAr Что будет зависеть от значений в массиве? Уж не размер ли кода? Что-то я тебя совсем не понимаю.
_SaNitAr Нет, у Квантума всё пучком, там используется поле масштаба в SIB байте, которое может быть 1,2,4,8. За счет этого поля размер опкода уменьшается.
Quantum ienybu шутниг имелось ввиду размерность операндов типа dw Dostoevsky пониль я вроде пришлось кныжки паштудировать.