Возвращает значение функции C в ASM - PullRequest
11 голосов
/ 30 мая 2011

Я пытаюсь вызвать функцию из ASM. Я знаю, как это назвать, но у меня возникают проблемы с поиском, как получить возвращаемое значение этой функции. Вот пример:

C код:

int dummy() {  
    return 5;  
}  

(N) Код ASM:

dummyFunction:
    call dummy
    ;grab return into eax
    inc eax ; eax should be 6 now
    ret  

Есть идеи?

Ответы [ 3 ]

14 голосов
/ 30 мая 2011

Возвращаемое значение в eax.Если вы вызвали функцию C из asm, вы можете прочитать возвращаемое значение из eax.Если вы пытаетесь вернуться из функции asm в C, сохраните предполагаемое возвращаемое значение в eax.

. Ситуация становится немного сложнее для возврата значений с плавающей запятой, long long значений или структур.поэтому спросите, нужно ли вам это, и кто-то (может быть, я) поможет вам.

8 голосов
/ 13 сентября 2014

Хотя ответов достаточно, чтобы ответить на вопрос ОП, вот выдержка, охватывающая большинство случаев из справочной страницы DJPP для полноты:

Возвращаемое значение

  • Целые числа (любого размера до 32 бит) и указатели возвращаются в регистре %eax.
  • Значения с плавающей запятой возвращаются в регистре 387 с вершины стека, st(0).
  • Возвращаемые значения типа long long int возвращаются в %edx:%eax (самое значимое слово в %edx и наименее значимое в %eax).
  • Возвращение структуры сложно и редко полезно;попытаться избежать этого.(Обратите внимание, что это отличается от возврата указателя на структуру.)

Если ваша функция возвращает void (например, без значения), содержимое этих регистров не используется.

2 голосов
/ 30 мая 2011

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

...