Skip to content

Instantly share code, notes, and snippets.

@vsl-iil
Last active May 8, 2025 21:09
Show Gist options
  • Save vsl-iil/1df22dee5356cd301fc062a3101347ec to your computer and use it in GitHub Desktop.
Save vsl-iil/1df22dee5356cd301fc062a3101347ec to your computer and use it in GitHub Desktop.
Соглашения о вызовах x86-64

cdecl

Аргументы Направление передачи аргументов (стек) Очищает стек Возвращаемое значение
стек справа налево вызывающий EAX

Пример:

caller:
  push c
  push b
  push a
  call callee  ; callee(a, b, c)
  add esp, 12
  mov ret, eax

stdcall

Аргументы Направление передачи аргументов (стек) Очищает стек Возвращаемое значение
стек справа налево вызываемый EAX
  • стандартное соглашение для функций Windows API

Пример:

caller:
  push c
  push b
  push a
  call callee  ; callee(a, b, c)
  mov ret, eax

fastcall

Аргументы Направление передачи аргументов (стек) Очищает стек Возвращаемое значение
ECX, EDX, стек справа налево вызываемый EAX

Пример:

caller:
  mov ecx, a
  mov edx, b
  push d
  push c
  call callee  ; callee(a, b, c, d)
  mov ret, eax

thiscall

Аргументы Направление передачи аргументов (стек) Очищает стек Возвращаемое значение
ECX, стек справа налево вызываемый EAX
  • используется в C++ для методов; первым аргументом всегда является указатель на объект класса (this)

Пример:

caller:
  mov ecx, this
  push a
  push b
  call callee  ; Class.callee(a, b)
  mov ret, eax

См. также:

  1. Calling Conventions - learn.microsoft.com

  2. x86 calling conventions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment