Естественно, в i386 %eax содержит возвращаемое значение функции, да? Однако, видимо, это всего лишь условность. Можно ли изменить это соглашение и сделать возвращаемое значение %ebx или что-то в этом роде? И если вы сделаете это, заставит ли это также возвращать значения %ebx в систему?
Возвращаемое значение %eax Соглашение
comment
Я мог бы добавить, что соглашения о вызовах обычно рассматриваются в двоичном интерфейсе приложения (ABI), если вы посмотрите на различные соглашения, вы можете выяснить, можете ли вы изменить то, что ваша система использует для статуса выхода, но я не уверен, что это даже возможный.
- person James   schedule 17.04.2015
Ответы (1)
Это условность, да. Поскольку инструкция ret
не изменяет никаких регистров, кроме esp
, вы можете использовать любой другой для возврата значений. Однако и вызывающий, и вызываемый должны согласовать, где должно быть возвращаемое значение, поэтому, если вы хотите взаимодействовать с другим кодом, используемые соглашения о вызовах должны быть совместимы. Между вашими собственными функциями вы можете использовать все, что хотите. Компиляторы также изобретают специальные соглашения для частных функций из соображений эффективности.
person
Jester
schedule
17.04.2015
Возможно, это очевидно, но как использовать разные регистры для возвращаемых значений в коде? Когда ret выполняется, он независимо помещает возвращаемое значение в %eax. Нужно ли вам изменять соглашения во время компиляции или вы можете написать свои собственные соглашения, и если да, то как?
- person WhiteMask; 17.04.2015
Как я уже сказал,
ret
не меняет регистры, кроме esp
. Таким образом, он ничего не помещает в eax
. Вызываемая функция помещает возвращаемое значение в eax
(или куда угодно), а ret
не трогает его и не заботится о нем. ret
чуть больше, чем прославленный jmp
. Звонящий должен смотреть в правильном месте. Да, это время компиляции.
- person Jester; 17.04.2015