Programowanie w języku Delphi » FAQ

Jak stosować wstawki assemblerowe jako funkcje

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

Dryobates 2003-04-15 19:45

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;