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;

1 komentarz

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;