Thema: Delphi Delphi und Assembler

Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

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

Re: Delphi und Assembler

  Alt 18. Jun 2005, 11:01
Delphi-Quellcode:
function ReverseBits(Value,Len : integer) : integer;
begin
asm
    mov edx,Value
    mov ecx,Len
1.) das zusätzliche begin end muß raus
2.) Parameter überigt Delphi standardäßig in den Registern EAX,EDX,ECX
3.) ergo: EAX=Value und EDX=Len
4.) mit mov edx, Value -> mov edx,eax und
5.) mit mov ecx, Len -> mov ecx,edx überschreibst du deine Parameter so daß nachfolgender Pseudocode dies verdeutlicht
6.) mov edx, Value; mov ecx, Len; wäre also mov Len, Value; mov ecx, Len

du überschreibst also deine eigenen Parameter !! so kann das nicht funktionieren.

Mein Tipp an dich: vergiß in deiner Situation in Assembler programmieren zu wollen. Der Compiler erzeugt aus reinem PASCAL Code sehr wohl ausreichend guten Assembler.

Delphi-Quellcode:
function GetReversedBits(AValue: Cardinal; ALen: Byte): Cardinal;
// AValue = EAX; ALen = EDX
asm
   test edx, edx
   jz @Exit // ALen == 0 ??
   sub ecx, ecx // ECX == @Result := 0
@Start:
   shr eax, 1 // AValue div 2
   adc ecx, ecx // @Result = @Result + @Result + Ord(previous AValue)
   dec edx
   jnz @Start
   mov eax, ecx
@Exit:
end;
- shr, shl sind auf heutigen Rechnern langsammer als ADD/ADC/SUB/SBB (Stichworte Pipelines, Instruction Shuffling)
- loop arbeitet nur auf register CX und nicht ECX auf einigen CPU's
- Kombinationen aus dec Register; branch Adresse; sind schneller als der Loop OpCode
- Avalue und @Result sollten Cardinal sein, Integer ist Vorzeichenbehaftet und der OpCode SHR arbeitet ohne Vorzeichen
- ALen sollte der kleinstmögliche Datentyp sein, da theoretisch ALen >= 32 wenig Sinn macht

Gruß Hagen
  Mit Zitat antworten Zitat