Добрый день!
Как будет выглядеть запись названия функции в декорированной форме в данном случае?
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. Подумываю на выравнивание данных, но все-равно до конца не понятно