Jak stosować wstawki assemblerowe jako funkcje
AndRew
Mamy na to prosty sposób :
function MonoAlfa(source, dest, fade : word) : byte; // deklarujemy funkcje (tak jak w pascalu, mamy dane wejściowe i wyjściowe)
asm // zaczynamy ("asm" zamiast "begin"
push ebx // gdy zmieniamy wartość jakiegoś rejestru, pamiętajmy aby po zakończeniu działania funkcji przywrócić jego poprzedni stan (push, pop)
mov ebx, 0 // wykonujemy operacje..
mov bx, source // możemy wykorzystywać zadeklarowane wcześniej zmienne
sub dest, source // jak wyżej..
mov ax, dest // dalsze operacje..
mul fade
shr ax, 8
add ax, bx // wartość result funkcji pobierana jest z rejestru eax lub ax
pop ebx
end;
I jak teraz z tego skorzystać ? Oto przykład :
var x, dana1, dana2, dana3 : byte;
begin
x := MonoAlfa(dana1, dana2, dana3);
end;
Troszkę za dużo kombinujesz.
Jeżeli jest przekazywanych mniej niż 4 parametry o rozmiarach co najwyżej 32-bity, to odpowiednio al/ax/eax, dl/dx/edx, cl/cx/ecx. Jeżeli jest to funkcja, która zwraca wartość także co najwyżej 32-bitową to umieszczana ona jest w rejestrze al/ax/eax. Tak więc w przypadku twojej funkcji powinno być tak:
function MonoAlfa(source, dest, fade : word) : byte;
asm
push ebx
mov ebx, 0
mov bx, ax
sub dx, ax
mov ax, dx
mul cx
shr ax, 8
add ax, bx //Można też zrobić add result, bl, ale jest to wolniejsze.
pop ebx
end;