Я думаю, что вы действительно спрашиваете о соглашении о вызовах , которое описывает, как подпрограммы в программе передают информацию друг другу, и как операционная система передает информацию в программу, и в целом, что разные регистры должны означать.
Например, соглашение о вызовах cdecl для x86 , которое используется большинством компиляторов Си, говорит, что при возврате функции возвращаемое значение попадает в регистр eax. Поэтому, если у вас есть функция int foo()
, вы знаете, что после того, как foo
выполнит свой код операции ret
, eax будет содержать тот int, который вернул foo
.
В отличие от этого, процессор PowerPC (обычно) имеет (как минимум) 32 регистра, просто называемых r0, r1, ... r31. Соглашение о вызовах AIX для этого чипа говорит, что указатель стека идет на r1, что параметры функции передаются на r3 через r11, что возвращаемые значения возвращаются на r3 и так далее.
Важно помнить, что соглашение о вызовах является своего рода соглашением между функциями в программе или между библиотеками. Это не часть аппаратного обеспечения или закон, и обычно существует много различных соглашений о вызовах, которые могут использоваться на платформе. Вот почему иногда вы увидите код типа
struct CFoo { void __stdcall method(); };
Это инструкция для MSVC, которая обычно любит использовать соглашение fastcall , говорящее ей использовать другое соглашение для этой одной функции. Это важно, если например, , функция определена в библиотеке, созданной другим компилятором, который вместо этого использует stdcall .
Когда мы говорим о том, как операционная система передает информацию в программу (или оборудование в операционную систему), мы обычно называем это ABI вместо соглашения о вызовах, но это та же идея , Так что в случае вашей программы она была написана, предполагая, что ОС передаст ей какую-то конкретную информацию на eax. Это предположение будет характерно для операционной системы, компилятора и, возможно, даже для отдельной программы.