@sddvxd

Сколько будут занимать места параметры в данном случае?

Добрый день!

Как будет выглядеть запись названия функции в декорированной форме в данном случае?

void _stdcall foo(short a, short b);

Если известно, что будь второй тип не short, а int, то при компиляции в 32 битную программу декорированная форма имела бы вид _foo@8, поскольку занесение в стек увеличивает его размер на 4, а short и int так не уместится. Значит 2+4=8
Теперь вернусь к верхнему прототипу, почему он вызывает вопросы: казалось бы, если я уже точно знаю, что команда push увеличит размер стека на машинное слово, тогда почему бы мне тоже на написать _foo@8 ?

Я решил запустить программу на асме, подобного вида:

push word 1
push word 1
push word 1
push word 1
push 1
push 1
push 1
push 1

Мне казалось, будто стек увеличится на 8 * 8 байт, однако, вот содержимое стека после выполнения верхних строк:

0031F844   00000001
0031F848   00000001
0031F84C   00000001
0031F850   00000001
0031F854   00010001
0031F858   00010001


Верхний код увеличил не на 64 байта, а на 48. Видимо так процессор экономит память, если видит 2 подряд идущих слова - просто помещает 1 часть в младшие 2 байта, а вторую часть в старшие 2 байта

Теперь вопрос: как будет выглядеть декорированная форма _stdcall функции foo в 32 битном объектном файле, если она принимает 2 short'a?

UPD:

Как выяснилось, стек растет не только на 4 байта, а на 2. Теперь ума не приложу, почему размер void _stdcall foo(short a, short b); параметров равен 8, а не 6. Подумываю на выравнивание данных, но все-равно до конца не понятно
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
ума не приложу, почему размер void _stdcall foo(short a, short b); параметров равен 8

Потому что аргументы размером меньше 4 байт расширяются до 4 байт. См.

Как выяснилось, стек растет не только на 4 байта, а на 2.

То, что в стек физически можно положить 2 байта (а можно ведь и 1, и 3 -- sub $imm, %esp) не означает, что это следует делать. См:
The stack will always be maintained 16-byte aligned, except within
the prolog (for example, after the return address is pushed), and except where
indicated in Function Types for a certain class of frame functions
Для венды на x86 я такого описания на том же сайте не нашёл, но точно выравнивание должно быть не меньше 4.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы