Cześć, chciałem napisać sobie funkcję "silnia" w asmie w środowisku Borland Delphi 6.
Napisałem coś takiego:
function silnia_asm(x: integer): int64; assembler;
asm
mov EAX, 1 {Ustawiam EAX na 1 - pierwszy czynnik}
mov EBX, 1 {i drugi czynnik - licznik pęrli}
@loop:
mul EBX {EDX:EAX = EBX * EAX}
inc EBX {EBX = EBX + 1}
cmp EBX, X {czy EBX = X}
jle @loop {if EBX<=x goto loop}
{mov Result, EDX:EAX}
end;
Wg mnie wszystko powinno działać. Jednak problem pojawia się przy skoku warunkowym. Nigdy nie wykonuje się pętla po raz drugi. Nieważne co jest w EBX, a co w X. Nigdy się nie wykonuje. Jeśli zamiast X dam konkretną liczbę, to wtedy działa. O co tu chodzi?
[dopisane]
OK, okazało się, że na początku w EAX jest wartość X, więc wystarczy ją przenieść do innego rejestru - ja użyłem ECX. Ale dlaczego nie mogę tutaj bezpośrednio posługiwać się X?
Drugie pytanie, co zrobić, żeby zwrócić wartość EDX:EAX? Zakomentowany kod zwraca błąd kompilacji: Inline assembler syntax error