Возврат результата в eax (язык ассемблера IA-32) - PullRequest
6 голосов
/ 05 мая 2011

Я немного запутался в том, как вернуть значение из метода на языке ассемблера. Насколько я знаю, регистр eax используется для хранения результата, который должен быть возвращен.

Например, скажем, мой результат 4 и я использую:

mov eax, 4

Теперь у меня 4 в EAX, и я хочу вернуть этот метод. Что мне нужно сделать, или инструкция ret автоматически вернет результат?

Дело в том, что я не знаю, что особенного в регистре eax, так как, когда я использую ret, я возвращаюсь к вызывающей стороне, и вызывающая сторона может получить доступ к любому из регистров, в которых я сохранила результат так почему я не мог просто использовать ebx или ecx с сохраненным результатом?

Ответы [ 2 ]

9 голосов
/ 05 мая 2011

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

4 голосов
/ 05 мая 2011

Вы описываете соглашение , используемое по крайней мере компиляторами Microsoft.Там нет ничего конкретного о eax в себе.Если ваша функция на языке ассемблера вызывается кодом C / C ++, скомпилированным с одним из обычных соглашений о вызовах, она будет ожидать, что результат будет передан в eax.

ret просто возвращает управление в точку, где была вызвана ваша функция.На регистры не влияют (кроме ESP и указателя инструкций, конечно).

...