// Bei Bildmanipulationen (speziell bei RGB-Werten) muss meist das Ergebnis
// einer Berechnung in den Grenzen eines Bytes bleiben, sprich: Was kleiner
// als Null ist, muss Null werden und was größer als 255 ist, muss 255 werden.
// Eine Lösung wäre beispielsweise:
function SetByte(i: integer): byte;
begin
if i > 255 then result := 255
else if i < 0 then result := 0
else result := i;
end;
// Die folgende Lösung ist etwa 1,2 mal schneller, was bei einem Bild mit mehreren
// tausend Pixeln und jeweils drei RGB-Werten schon zur Zeitersparnis beitragen
// kann.
function SetByteX(i: integer): byte;
asm
CMP EAX, 255
JG @MAX
CMP EAX, 0
JGE @OK
MOV EAX, 0
JMP @OK
@MAX:
MOV EAX,255
@OK:
MOV @RESULT, AL
end;
// Beispielaufruf
procedure TForm1.Button2Click(Sender: TObject);
var
b, c: byte;
i: integer;
begin
c := 100;
i := 120;
b := SetByteX(c - i);
showmessage(inttostr(b));
end;
// Wer will, kann die Addition auch mit in den Assemblerteil verlagern.
function SetByteX2(a, b: integer): byte;
asm
ADD EAX, b
CMP EAX, 255
JG @MAX
CMP EAX, 0
JGE @OK
MOV EAX, 0
JMP @OK
@MAX:
MOV EAX,255
@OK:
MOV @RESULT, AL
end;
// Beispielaufruf
procedure TForm1.Button3Click(Sender: TObject);
var
b, c: byte;
i: integer;
begin
c := 100;
i := -120;
b := SetByteX2(c, i);
showmessage(inttostr(b));
end;