Возвращаемое значение %eax Соглашение

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


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


Ответы (1)


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

person Jester    schedule 17.04.2015
comment
Возможно, это очевидно, но как использовать разные регистры для возвращаемых значений в коде? Когда ret выполняется, он независимо помещает возвращаемое значение в %eax. Нужно ли вам изменять соглашения во время компиляции или вы можете написать свои собственные соглашения, и если да, то как? - person WhiteMask; 17.04.2015
comment
Как я уже сказал, ret не меняет регистры, кроме esp. Таким образом, он ничего не помещает в eax. Вызываемая функция помещает возвращаемое значение в eax (или куда угодно), а ret не трогает его и не заботится о нем. ret чуть больше, чем прославленный jmp. Звонящий должен смотреть в правильном месте. Да, это время компиляции. - person Jester; 17.04.2015