![]() |
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:
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.
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; 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. |
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... |
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:
So rechne ich nur mit der var nmbr als integer ...
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; 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? |
Re: Delphi & ASM - Integer umdrehen
Zitat:
Zitat:
Zitat:
Zitat:
Also: gebe in dein Editfeld mal $12345678 ein und die Ausgabe kannst du auch wieder hexadezimal gestalten:
Delphi-Quellcode:
Label1.Caption := inttohex(nmbr, 8);
|
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? |
Re: Delphi & ASM - Integer umdrehen
![]() 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. |
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 :) |
Re: Delphi & ASM - Integer umdrehen
Zitat:
Zitat:
|
Re: Delphi & ASM - Integer umdrehen
Zitat:
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. |
Re: Delphi & ASM - Integer umdrehen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz