2015-04-17 3 views
0

Естественно, в i386% eax содержит возвращаемое значение функций, да? Однако, по-видимому, это только конвенция. Можно ли изменить это соглашение и сделать возвращаемое значение равным% ebx или что-то еще? И если вы это сделаете, это также приведет к возврату значений% ebx в систему?Возвращаемое значение% eax Convention

+0

Я мог бы добавить, что соглашения о вызовах обычно рассматриваются в двоичном интерфейсе приложения (ABI), если вы посмотрите на различные соглашения, которые вы можете определить, если вы можете изменить то, что использует ваша система для статуса выхода, но я не уверен если это даже возможно. – James

ответ

4

Это соглашение только, да. Поскольку инструкция ret не изменяет никаких регистров, кроме esp, вы можете использовать любые другие для возврата значений. Однако как вызывающий, так и вызываемый должны согласовать, где должно быть возвращаемое значение, поэтому, если вы хотите взаимодействовать с другим кодом, используемые соглашения о вызовах должны быть совместимы. Между вашими собственными функциями вы можете использовать все, что хотите. Составители также изобретают специальные соглашения для частных функций по соображениям эффективности.

+0

Возможно, это очевидно, но как вы используете разные регистры для возвращаемых значений в коде? Когда ret выполняется, он помещает возвращаемое значение в% eax независимо. Вам нужно изменить соглашения во время компиляции или написать свои собственные соглашения, и если да, то как? – WhiteMask

+1

Как я уже сказал, 'ret' не изменяет регистры, кроме' esp'. Как таковой он ничего не помещает в 'eax'. Вызываемая функция помещает возвращаемое значение в 'eax' (или где угодно), а' ret' не затрагивает его и не заботится об этом. 'ret' - это чуть больше, чем прославленный' jmp'. Вызывающий должен смотреть в нужном месте. Да, это компиляция. – Jester

Смежные вопросы