Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
|
Re: Assembler in Delphi! Speichersack?
30. Sep 2003, 12:41
Du vergisst den Stack korrekt aufzuräumen.
Delphi-Quellcode:
asm
// apt.x div 17
mov eax, apt.x
mov ecx, 17
push edx <--- hier EDX auf Stack
mov edx, 0
div ecx
cmp edx, 14
jns @nowhere <---- hier EXIT ohne EDX vom Stack zu holen
mov x, eax
// apt.y div 17
pop edx <---- hier EDX vom Stack
mov eax, apt.y
mov edx, 0
div ecx
cmp edx, 14
jns @nowhere
// Result := x + y(eax) * 8
shl eax, 3
or eax, x
cmp eax, 40
jns @nowhere
mov @Result, eax
jmp @1
@nowhere:
mov @Result, -1 // Result := -1 <----- wenn obiges JNS True ist wird EDX nicht vom Stack geholt
@1:
end;
Zudem verstehe ich nicht warum du
Result := (apt.x div 17) + (apt.y div 17) * 8
in Assembler als
Result := (apt.x div 17) or (apt.y div 17) * 8
codiert hast.
Zudem JNS = Jump if not sign, Springe wenn EAX < 0 ! ist falsch
Delphi-Quellcode:
function TColorPalette.HitColorText(apt: TPoint): Integer;
{
var x : Integer;
begin
if PtInRect(ClientRect, apt) then
if ((apt.x mod 17) > 14) or ((apt.y mod 17) > 14) then
Result := -1
else
Result := (apt.x div 17) + (apt.y div 17) * 8
else
Result := -1;
end;}
asm
// in EAX = Self, EDX = @TPoint
PUSH EDI
MOV ECX,17
MOV EAX,[EDX].TPoint.X
MOV EDI,[EDX].TPoint.Y
TEST EAX,EAX
JS @@Nowhere // P.X < 0 ??
TEST EDI,EDI
JS @@Nowhere // P.Y < 0 ??
XOR EDX,EDX
DIV ECX
CMP EDX,14
JA @@Nowhere // P.X mod 17 > 14 ??
XCHG EAX,EDI // EDI = P.X div 17
XOR EDX,EDX
DIV ECX
CMP EDX,14
JA @@Nowhere
LEA EAX,[EDI + EAX * 8] // Result = P.X div 17 + P.Y div 17 * 8
JMP @@Exit
@@Nowhere:
XOR EAX,EAX
DEC EAX
@@Exit
POP EDI
end;
Gruß Hagen
|
|
Zitat
|