Thema: Delphi Delphi und Assembler

Einzelnen Beitrag anzeigen

HolgX

Registriert seit: 16. Jun 2005
2 Beiträge
 
#1

Delphi und Assembler

  Alt 17. Jun 2005, 23:28
Hallo

Ich weiß nicht, ob das in dieses Forum gehört, aber ein besseres ist mir nicht eingefallen.
Mein Problem war, dass ich mich mit Bit-Operationen befassen mußte, welche bekanntermaßen in Delphi nicht sonderlich unterstützt werden. Also hab ich auf den Assembler zurückgegriffen (mit dem Teil bin ich aufgewachsen), aber leider...

Angeblich sollen alle Anweisungen (laut Borland bis mindestens 386) implementiert sein. Das stimmt so nicht, bis Turbo-Pascal klappte alles reibungslos, aber ich hatte bereits ab Delphi 4 Probleme damit. Nun wollte ich mit Delphi 7 eine Bitvertauschung durchführen (Stichwort Huffman), gabs auch schonmal im Forum, der Code hat mir aber nicht gefallen.
Also selber coden. Folgender Ansatz:

Delphi-Quellcode:
function ReverseBits(Value,Len : integer) : integer;
begin
asm
    mov edx,Value
    mov ecx,Len
    xor eax,eax
@1: shr edx,1
    rcl eax,1
    loop @1
  end;
end;
Prima, Delphi meckert nicht, alles Klasse. Ergebnis: Nur Nullen, buchstäblich. Was heißen soll, daß diese LOOP-Anweisung nicht funktioniert oder anders gesagt, nur der Form halber akzeptiert wird.
Weiter:
Man richte seine Aufmerksamkeit auf die beiden ersten Zeilemn unter "asm". Die habe ich so aus der Delphi-Hilfe übernommen, nur andere Namen verwendet. Wie ich schon sagte, es klappt nicht. Beide Register (EDX und ECX) enthalten immer die gleichen Werte, nämlich den ersten, der im Prozedurkopf steht.

Wenn ich statt dessen das mache, was ich eigentlich nicht wollte (als Assembler-Programmierer *****), funzt es:

Delphi-Quellcode:
function ReverseBits(Value,Len : integer) : integer;
var
 v,l : integer;
begin
  v:=Value; // das könnte man weglassen und mov edx, value schreiben
  l:=Len; // das aber nicht
  asm
    mov edx,v
    mov ecx,l
    xor eax,eax
@1: shr edx,1
    rcl eax,1
    dec cx
    jnz @1 // LOOP funktioniert leider nicht
    mov Result,eax
  end;
end;
Daß diese Assembler-Geschichte nicht zum eigentlichen Bestandteil von Delphi gehort, ist mir schon klar. Aber wenn es schon angeboten wird, sollte es auch funktionieren. Zumal man damit einige Probleme ziemlich einfach erschlagen kann.

Hat jemand schon mal ähnliche Erfahrungen gemacht?

Bis dann, HolgX

[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]
  Mit Zitat antworten Zitat