Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Delphi & ASM - Integer umdrehen (https://www.delphipraxis.net/98969-delphi-asm-integer-umdrehen.html)

quendolineDD 4. Sep 2007 20:03


Delphi & ASM - Integer umdrehen
 
Hallo Leute, ich habe mir ein bisschen ASM angeschaut hier im Forum und wollte unbedingt das mal testen. Dabei soll die eingegebene Zahl umgedreht (inverted) werden.

Hier mein Code:
Delphi-Quellcode:
function invert(pnt:pointer):string;
begin
  asm
    mov edx, pnt;
    bswap edx;
    mov pnt, edx;
 end;
result:= string(pnt); //als ich result:= ^pnt; versuchte, kam nur "Operator oder Simekolion fehlt"
end;

procedure TForm1.Button1Click(Sender: TObject);
var nmbr: integer;
    s: String;
begin
 nmbr:= StrToInt(Edit1.Text);
 s := invert(@nmbr);
 Label1.Caption := string(s);
end;
Dabei weiß ich einfach nicht, was die Funktion am Besten zurückgeben soll, damit ich das Ergebis (die umgedrehte Zahl) in das Label schreiben kann.

Die Funktion erhält einen Pointer, welcher auf den Speicherbereich (?) von d. var nmbr zeigt, damit das ASM damit arbeiten kann.

Zum Schluss caste ich s als String :-\
In Sachen ASM bin ich eine Niete, ich versteh davon eigentlich nichts, trotzdem fand ich es mal interessant, ob das umdrehen einer Zahl so einfach geht.

Doch wenn ich das Prog ausführe, bekomm ich einen EAccessViolation Error!

Ich hatte es vorher ohne Pointer schon ohne Error zum laufen bekommen, jedoch stimmten die Rückgabewerte auf keinen Fall.
Eventuell kann sich ja jemand bereiterklären, das ganze richtig zu stellen und zu kommentieren? :o)

Danke im Vorraus
Grüße

€: Topicname etwas besser formuliert - sagt zwar immer noch nichts aus ... aber naja.

Muetze1 4. Sep 2007 20:12

Re: Delphi & ASM - Integer umdrehen
 
Du bekommst einen Zeiger (also die Adresse auf die der Zeiger zeigt) und drehst diese Adresse um, also Endian Umrechnung. Das danach der Zeiger vollkommen falsch irgendwo hinzeigt ist logisch. Danach greifst du trotzdem auf die Adresse zu, auf die der Zeiger danach zeigt - und das geht dann ganz dolle in die Hose...

Kurz gesagt: Du verdrehst den Zeiger und nicht den Inhalt, auf den der Zeiger zeigt...

quendolineDD 4. Sep 2007 20:18

Re: Delphi & ASM - Integer umdrehen
 
Auf ein neues abschickt. Ich hab dein Comment schon verstanden :)

Dabei brauch doch das ASM einen Wert der zum Beispiel so aussieht: $123456. Und so sehen doch immer nur die Pointer aus ... (btw. vlt auch doch nicht :-\ )

Aber der Wert, welcher dabei herauskommt ist ganz und gar nicht "umgedreht".

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var nmbr: integer;
begin
 nmbr:= StrToInt(Edit1.Text);

 asm
    mov edx, nmbr;
    bswap edx;
    mov nmbr, edx;
 end;

 Label1.Caption := inttostr(nmbr);
end;
So rechne ich nur mit der var nmbr als integer ...
Geb ich nun zum Beispiel "123456" ein, erhalte ich als Rückgabewert in das Label folgende Zahl: "1088553216".

Muss ich mit der Zahl noch was spezielles machen um daraus das gewollte "654321" zu erhalten?

Muetze1 4. Sep 2007 20:27

Re: Delphi & ASM - Integer umdrehen
 
Zitat:

Zitat von quendolineDD
Dabei brauch doch das ASM einen Wert der zum Beispiel so aussieht: $123456. Und so sehen doch immer nur die Pointer aus ... (btw. vlt auch doch nicht :-\ )

Das ist einfach nur eine hexadezimale Darstellung der Zahlen. Diese ist durch die Basis von 16 platzsparender und effektiver als die Angabe in dezimalen System (Basis von 10).

Zitat:

Zitat von quendolineDD
Aber der Wert, welcher dabei herauskommt ist ganz und gar nicht "umgedreht".

Das sieht nur so aus.

Zitat:

Zitat von quendolineDD
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var nmbr: integer;
begin
 nmbr:= StrToInt(Edit1.Text);

 asm
    mov edx, nmbr;
    bswap edx;
    mov nmbr, edx;
 end;

 Label1.Caption := inttostr(nmbr);
end;

So ist es richtig.

Zitat:

Zitat von quendolineDD
Geb ich nun zum Beispiel "123456" ein, erhalte ich als Rückgabewert in das Label folgende Zahl: "1088553216".

Er dreht die einzelnen Bytes um und von daher arbeitet er auf der Basis von 256 und nicht auf der Basis von 10, so wie du es ausgibst. Da die Basis von 256 schlecht auszugeben ist, nutze einfach die Basis von 16 (hexadezimal), weil dort ergeben 2 Stellen eine Basis von 256. Somit siehst du dann eher was er macht.

Also: gebe in dein Editfeld mal $12345678 ein und die Ausgabe kannst du auch wieder hexadezimal gestalten:
Delphi-Quellcode:
Label1.Caption := inttohex(nmbr, 8);

quendolineDD 4. Sep 2007 20:35

Re: Delphi & ASM - Integer umdrehen
 
Interessant, ich hatte mir schon sowas gedacht, aber da keine Buchstaben vorhanden waren, war ich mir nciht sicher ob es auch hex sein kann.

Nun kommt Nach der Eingabe von $12345678 -> "78563412" heraus. Interessant dabei, dass er nicht die gesamte Reihenfolge tauschte, sondern immer in 2er-Paaren (abcdefgh -> ghefcdab). //sehe gerade auch nicht verständlicher aussehend :-\

Was ist daran so besonders, wenn ich vor die Zahlen ein "$" schreibe?

Muetze1 4. Sep 2007 20:41

Re: Delphi & ASM - Integer umdrehen
 
BSWAP heisst ja schliesslich "byte swap" und tauscht somit immer die 2er Päarchen - wie gesagt: Big/Little endian Tausch.

Das $ vor den Zahlen ist eine Kennzeichnung, dass es sich um eine hexadezimale Zahl handelt und nicht um eine dezimale. Schliesslich ist 110 eine gülige binäre, dezimale und hexadezimale Zahl.

Hexadezimale Zahlen haben den Vorteil, dass man leicht die Bytes erkennen kann. Jede Stelle kann 16 unterschiedliche Wertigkeiten anzeigen. 16 unterschiedliche Werte kannst du in 4 Bit unterbringen (2 ^ 4 = 16) und 4 Bit sind ein Nibble. Zwei nibble zusammen ergeben 8 Bit, somit 1 Byte. Von daher sind immer 2 Stellen einer Hexadezimalzahl genau ein Byte. Von daher werden Hexadezimalzahlen sehr häufig verwendet, da man leicht den Aufbau und Lage im Speicher abschätzen kann.

quendolineDD 4. Sep 2007 20:57

Re: Delphi & ASM - Integer umdrehen
 
Danke hat mir schon viel geholfen, vor allem verständlich geantwortet :)
Ganz entgegen deiner Sig *g
Nun muss ich mir noch eine Funtion in ASM suchen, welche den gesamten Integer in seiner Reihenfolge dreht ... Oder muss ich das dann auch so aufwendig wie in Delphi machen? :-\

€: Benachrichtigung dechecked :)

Muetze1 4. Sep 2007 21:24

Re: Delphi & ASM - Integer umdrehen
 
Zitat:

Zitat von quendolineDD
Nun muss ich mir noch eine Funtion in ASM suchen, welche den gesamten Integer in seiner Reihenfolge dreht ... Oder muss ich das dann auch so aufwendig wie in Delphi machen? :-\

Das musste genauso lösen wie in Delphi - nur das du in Assembler mehr Befehle hinschreiben musst als das Delphi Pendant - schliesslich ist Delphi eine Hochsprache und Assembler Low Level.

Zitat:

Zitat von quendolineDD
€: Benachrichtigung dechecked :)

Das kannst du auch ganz oben auf der Seite mit dem Favouriten Button machen - ohne deinen Beitrag zu editieren. Anwählen wie auch abwählen.

Quake 8. Sep 2007 09:53

Re: Delphi & ASM - Integer umdrehen
 
Zitat:

Nun muss ich mir noch eine Funtion in ASM suchen, welche den gesamten Integer in seiner Reihenfolge dreht ... Oder muss ich das dann auch so aufwendig wie in Delphi machen? :-\
Meinst du mit Funktion sowas wie einen einzigen Befehl? Ich würde dir vorschlagen, dass du dies in Delphi löst, es sei denn du möchtest unbedingt Assembler lernen. Dann würd ich dir aber Raten, an einer ganz anderen Stelle mit dem Lernprozess anzufangen.
Da du deine Zahl als String vorliegen hast, nimm eine kleine Schleife, in der du den String Zeichen für Zeichen rückwärts abarbeitest, und kopiere die Zeichen nach und nach in einen neuen String. So müsstest du das in Delphi aber auch in Assembler realisieren.

Olli 12. Sep 2007 22:05

Re: Delphi & ASM - Integer umdrehen
 
http://www.delphipraxis.net/internal...=763908#763908


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf