Вивчаю то, як структури передаються в функції і повертаються з функцій. Такий код:
Помічаємо, що функція main виділяє в стеці 16 байт, але при вирівнюванні стека звільняються тільки 8 байт. Решта 8 байт зайняті структурою.
Ще раз подивимося на це місце в main:
А що відбувається далі в makepoint. Складно розібратися в цьому коді.
Ще є така штука як вирівнювання полів структури. Можна це поспостерігати в лістингу? З чим пов'язана така позиція вирівнювання?
заданий 25 Квітня '16 о 14:07
Усередині функції makepoint відбувається наступне
це ні що інше як заповнення полів локальної структури з DWORD PTR [ebp + 0xc] і DWORD PTR [ebp + 0x10] (параметри x і y відповідно), тобто це
Ваше припущення з приводу
не вірно (якщо я його правильно зрозумів).
Ви з самого початку не з того боку почали дослідження. В залежності від побажань компілятора, він може зробити з вашої структурою все, що забажає. Однак є так звані угоди про виклики. які встановлюють ряд правил на те, як передавати параметри. Я б на Вашому місці почав з вивчення цього питання. Краще відразу шукати матеріал англійською (там це називається Calling convention). Крім того, Ви напевно дизасемблювати код в режимі налагодження, а в режимі повної оптимізації він може виявитися зовсім-зовсім іншим. Притому навіть питання вирівнювання компілятор може вирішувати різними способами, щоб підказати йому, існують спеціальні директиви. Питання з приводу того хто виділяє пам'ять і хто її звільняє теж вирішується по різному. Наприклад, в угоді __fastcall звільняє стек саме викликається,.
відповідь дан 25 Квітня '16 о 14:38
@typemoon, взагалі, однозначно відновити вихідний код мовою високого рівня по ассемблерного / машинного коду неможливо. Структури можна визначити за непрямими ознаками. Так, тут використовується покажчик, що може говорити, про те, що це структура. Але все одно присутній неоднозначність: як визначити, наприклад, це структура була з двома однотипними полями або масив з двох елементів? - insolor 25 Квітня '16 о 19:35
Формально мова ніяк не визначає, як саме (в яких машинних командах) компілятор буде виконувати ті чи інші дії.
Я не здивуюся, якщо компілятор ось це
зробить так - відразу почне писати в те місце в пам'яті, де знаходиться pt. не створюючи локальної tmp - в C ++ це стандартна, тобто обумовлена в стандарті, оптимізація. І, при побіжному погляді на код, створюється враження, що так він і робить. Втім, асемблер з листа я читаю неважливо :(
відповідь дан 25 Квітня '16 о 15:11