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]