AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Delphi & ASM - Integer umdrehen

Ein Thema von quendolineDD · begonnen am 4. Sep 2007 · letzter Beitrag vom 12. Sep 2007
Antwort Antwort
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#1

Delphi & ASM - Integer umdrehen

  Alt 4. Sep 2007, 20:03
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? )

Danke im Vorraus
Grüße

€: Topicname etwas besser formuliert - sagt zwar immer noch nichts aus ... aber naja.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Delphi & ASM - Integer umdrehen

  Alt 4. Sep 2007, 20:12
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...
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Delphi & ASM - Integer umdrehen

  Alt 4. Sep 2007, 20:18
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?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Delphi & ASM - Integer umdrehen

  Alt 4. Sep 2007, 20:27
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 von quendolineDD:
Aber der Wert, welcher dabei herauskommt ist ganz und gar nicht "umgedreht".
Das sieht nur so aus.

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 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:Label1.Caption := inttohex(nmbr, 8);
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Delphi & ASM - Integer umdrehen

  Alt 4. Sep 2007, 20:35
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?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Delphi & ASM - Integer umdrehen

  Alt 4. Sep 2007, 20:41
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.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Delphi & ASM - Integer umdrehen

  Alt 4. Sep 2007, 20:57
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
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Delphi & ASM - Integer umdrehen

  Alt 4. Sep 2007, 21:24
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 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.
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Delphi & ASM - Integer umdrehen

  Alt 8. Sep 2007, 09:53
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.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#10

Re: Delphi & ASM - Integer umdrehen

  Alt 12. Sep 2007, 22:05
http://www.delphipraxis.net/internal...=763908#763908
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf