Какой компилятор использует соглашение о вызове, которое использует EAX в качестве первого аргумента, затем толкает его в стек?


1

Недавно я задал вопрос: How can an IA-32 program seemingly compiled with MSVC send its sole argument via EAX? После публикации вопроса я обнаружил, что другая функция передала первый аргумент в EAX, а затем нажал оставшийся аргумент. Затем вызывающий пользователь очищает стек.

Вызывающий код:

.text:00402465     lea  eax, [ebp+var_4] 
    ... 
.text:00402469     push eax 
.text:0040246A     mov  eax, [ebp+hWnd] 
.text:0040246D     call openFileDialog 
.text:00402472     add  esp, 4 

И сама функция:

.text:00411730 openFileDialog proc near 
.text:00411730 
    ... 
.text:00411730 arg_0   = dword ptr 8 
.text:00411730 
.text:00411730     push ebp 
.text:00411731     mov  ebp, esp 
.text:00411733     sub  esp, 18h 
.text:00411736     cmp  byte_42AE1D, FALSE 
.text:0041173D     push ebx 
.text:0041173E     push esi 
.text:0041173F     push edi 
.text:00411740     mov  esi, eax 
    ... 
.text:00411789     mov  eax, [ebp+arg_0] 
.text:0041178C     push eax 
.text:0041178D     push esi 
.text:0041178E     call openFileDialog_Compat 
.text:00411793     add  esp, 8 

Как вы можете видеть, в функции, значение EAX сохраняется, прежде чем что-то может повлиять на него, так что это определенно используется как параметр. Позже толкаемый аргумент передается нормальной функции __cdecl.

Программа связана с использованием msvcr100.dll и использует весь стиль MSVC (например, __security_cookie, изменение имени файла MSVC и т. Д.), Поэтому он, похоже, был скомпилирован с Visual C++, но это необычное соглашение о вызове заставляет меня вопрос это.

+3

При использовании «Оптимизации всей программы» компилятор может использовать любое соглашение о вызовах для функций с внутренней связью. 06 дек. 172017-12-06 08:10:28

6

Это, вероятно, программа, составленная с помощью «Целая оптимизация программ» или «Генерация кода Link-time». From MSDN:

Когда/LTCG используется для связывания модулей, собранных с/О.Г.,/О1,/О2, или /вола, следующие оптимизации выполняются:

  • Кросс-модуль встраивание
  • (только x86)
  • Межпроцедурная распределения регистров (64-разрядные операционные системы только)

  • Пользовательские соглашение о вызовах

  • Малый TLS смещения (только x86)

  • Стек двойного выравнивания (x86 только)

  • Улучшение памяти неоднозначности (лучше информация о помехах для глобальных переменных и входных параметров)

  0

Спасибо. Это то, с чем я не сталкивался раньше. Я только думал о компиляторе и описанных стандартах. 07 дек. 172017-12-07 01:10:22


0

проверка Calling Conventions эта поддержка msvc. что касается имени функции openFileDialog, это функция C#? объединение C# и C++ через CLR ?? странные вещи могут произойти. MS не нужно подвергать эти данные публике.