Нет, хранилище dword для [esp+0xF]
записывает 4 байта в [esp + 0x0f .. 0x12]
, что даже не выровнено по dword.
Если вас смущает Отношение между порядком байтов и стеком- направление роста и старые ответы там, это понятно;они были совершенно неверными, поэтому я отправил правильный.
Адрес меча всегда является самым низким адресом любого из его компонентных байтов. (Это относится к старшему и младшему порядковому порядку байтов)систем).
Резервирование 16 байтов и сохранение в [esp+0xc]
сохраняет до 4 байтов с наибольшим адресом из этих 16.
Меч в [esp+0xc]
есть (в порядке отОт LSB к MSB) байты по адресам ESP +0xc
, +0xd
, +0xe
и +0xf
.
Для (гипотетического) старшего байта x86 это будут те же байты,но этот порядок будет MSB для LSB.Адрес меча все равно будет [esp+0xc]
.
. Ничто из этого не имеет никакого отношения к push
, делающему esp-=4
вместо esp+=4
.Системы с растущими вверх стеками по-прежнему используют адрес младшего байта в слове / слове в качестве адреса этого многобайтового целого числа.Как и в C, адрес массива или структуры является адресом первого элемента.На самом деле это , почему C-адреса работают именно так.
Так как стек растет вниз, есть некоторый смысл, что gcc выберет, чтобы поместить туда локальный, прямо под сохраненным EBPзначение и оставьте оставшуюся часть пространства неиспользованной как заполнитель для выравнивания стека перед call
(для вспомогательной функции CRT ___main
).
Даже если для 32-разрядного ABI Windows не требуется 16-байтовое выравнивание стека, gcc выбирает делать это в любом случае (по умолчанию -mpreferred-stack-boundary=4
: 2 ^ 4 = 16)
И кстати, очевидно, весь этот шум исчезнет, если вы компилируете с включенной оптимизацией.Тогда основной может просто ret
.Или, возможно, все еще должен позвонить ___main
, но может оптимизировать местный.
Вы можете уменьшить шум, но все же сделать GCC init локальным, сделав его volatile
и скомпилировав с -O3
.Или передайте его адрес другой не встроенной функции.
Почему ESP указывает на [esp + 0xc]?
А?Это даже не имеет смысла.ESP указывает на [esp]
.Вы на самом деле спрашиваете, почему GCC решил использовать режим адресации [esp+0xc]
, а не какое-либо другое смещение.