Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Assembler in Delphi! Speichersack?

  Alt 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
  Mit Zitat antworten Zitat