Върната стойност на C функция към ASM

Опитвам се да извикам функция от ASM. Знам как да го извикам, но имам проблем да намеря как да получа върнатата стойност на тази функция. Следва пример:

C код:

int dummy() {  
    return 5;  
}  

(N)ASM код:

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

Някакви идеи?


person Juan Pablo    schedule 29.05.2011    source източник
comment
Какъв проблем имаш?   -  person mmx    schedule 30.05.2011
comment
Наистина, кажете ни какво не е наред...   -  person R.. GitHub STOP HELPING ICE    schedule 30.05.2011
comment
@R.. Мисля, че проблемът му е просто, че той не знае, че eax вече е зададен правилно.   -  person Christian Rau    schedule 30.05.2011


Отговори (3)


Връщаната стойност е в eax. Ако сте извикали C функция от asm, можете да прочетете върнатата стойност от eax. Ако се опитвате да се върнете от asm функция към C, запазете планираната върната стойност в eax.

Нещата стават малко по-сложни за връщане на стойности с плаваща запетая, long long стойности или структури, така че попитайте дали имате нужда от това и някой (може би аз) ще ви помогне.

person R.. GitHub STOP HELPING ICE    schedule 29.05.2011

Въпреки че отговорите са достатъчни, за да отговорят на въпроса на OP, ето извадка, обхващаща повечето случаи от man страница на DJPP за пълнота:

Върната стойност

  • Цели числа (с произволен размер до 32 бита) и указатели се връщат в регистъра %eax.
  • Стойностите с плаваща запетая се връщат в регистъра 387 отгоре на стека, st(0).
  • Връщаните стойности от тип long long int се връщат в %edx:%eax (най-значимата дума в %edx и най-малко значимата в %eax).
  • Връщането на структура е сложно и рядко полезно; опитайте се да го избегнете. (Имайте предвид, че това е различно от връщането на указател към структура.)

Ако вашата функция върне void (напр. няма стойност), съдържанието на тези регистри не се използва.

person legends2k    schedule 13.09.2014

Зависи от платформата и конвенцията за извикване, но обикновено върнатата стойност вече трябва да бъде върната в eax, ако е примитивен тип или указател, и в регистъра с плаваща запетая st(0), ако е тип с плаваща запетая, мисля.

person Christian Rau    schedule 29.05.2011
comment
+1 Да, ако е тип с плаваща запетая, тогава се връща чрез st(0); виж отговора ми. - person legends2k; 13.09.2014