toDecimal - wie komme ich auf den String?

hamster34
Erstie
Erstie
Beiträge: 22
Registriert: 28. Apr 2010 11:01

toDecimal - wie komme ich auf den String?

Beitrag von hamster34 »

Ich versuche jetzt schon seit einige Zeit mehr oder minder energisch den Inhalt des Eingabestrings sinnvoll auszulesen und komme einfach nicht weiter.

Mein Gedanken bis jetzt:
roman ist das Stringarray - richtig?

also kann ich doch mit

Code: Alles auswählen

leal roman, %edi
movl 0(%edi), %eax

das erste Element auslesen - oder nicht?
Also ich bekomme dann z.B. 2637, wenn ich M eingebe und 675149 wenn ich MM eingebe, woraus ich nicht wirklich schlau werde. Ich hätte sowas wie dezimal-codierte ascii-Werte erwartet.

Was mache ich falsch bzw. wie komme ich auf sinnvolle Werte für den Eingabestring?

mike
Erstie
Erstie
Beiträge: 16
Registriert: 6. Nov 2011 13:59

Re: toDecimal - wie komme ich auf den String?

Beitrag von mike »

Hi,

du hast jetzt in %eax deinen gewünschten Wert drinnen. Jedoch ist der noch gespickt mit weiteren Bits die dich nicht interessieren. Daher musst du noch %eax bereinigen und zwar mit einer UND Verknüpfung

Daher:

Code: Alles auswählen

leal roman, %edi
movl 0(%edi), %eax
andl $0xFF, %eax
Der Hintergrund ist der, dass die Ascii Tabelle 0xFF, also 256Bit ist und du somit alles abschneidest, oberhalb der Ascii Tabelle.


Gruß
Mike

hamster34
Erstie
Erstie
Beiträge: 22
Registriert: 28. Apr 2010 11:01

Re: toDecimal - wie komme ich auf den String?

Beitrag von hamster34 »

*kopftisch*
super danke - darauf hätte ich auch kommen können.

Benutzeravatar
zimpfer
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 144
Registriert: 15. Mär 2009 01:07

Re: toDecimal - wie komme ich auf den String?

Beitrag von zimpfer »

roman ist kein Stringarray!

Es ist ein Byte-Array (1 Zeichen = 1 Byte)

mit folgendes Code ersparst du dir das andl:
leal roman, %edi
movb 0(%edi), %al #lade 1 Byte ins hinterste Byte von %eax

radio_controlled
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 107
Registriert: 8. Okt 2010 20:31

Re: toDecimal - wie komme ich auf den String?

Beitrag von radio_controlled »

zimpfer hat geschrieben:mit folgendes Code ersparst du dir das andl:
leal roman, %edi
movb 0(%edi), %al #lade 1 Byte ins hinterste Byte von %eax
Wie ist das wenn nur %al überschrieben wird, der Rest von %eax bleibt doch so und wird nicht genullt?
Da wär das andl doch immernoch nötig

EDIT: Habe es gerade getestet:

Code: Alles auswählen

    movl $1000000, %eax
    pushl %eax          # Ausgabe
    pushl $printstr
    call printf

    movl $1000000, %eax
    movb $1, %al
    pushl %eax          # Ausgabe
    pushl $printstr
    call printf
Ausgabe: Wert: 1000000
Wert: 999937
=> andl immernoch nötig

Benutzeravatar
zimpfer
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 144
Registriert: 15. Mär 2009 01:07

Re: toDecimal - wie komme ich auf den String?

Beitrag von zimpfer »

Ja, das stimmt, das habe ich übersehen.

Aber wenn du beispielwesie in einer Schleife den Eingabestring einliest, reicht es anfangs eax einmal zu nullen

mike
Erstie
Erstie
Beiträge: 16
Registriert: 6. Nov 2011 13:59

Re: toDecimal - wie komme ich auf den String?

Beitrag von mike »

Hi,

mit dem ANDL könnt ihr, wenn ihr euch mal A,a und Z,z in Binär anschaut, das Problem der Gross- und Kleinschreibung easy lösen. Daher der Vorschlag mit ANDL


Gruß

bagwell
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 109
Registriert: 15. Nov 2010 09:18

Re: toDecimal - wie komme ich auf den String?

Beitrag von bagwell »

mike hat geschrieben:Hi,

du hast jetzt in %eax deinen gewünschten Wert drinnen. Jedoch ist der noch gespickt mit weiteren Bits die dich nicht interessieren. Daher musst du noch %eax bereinigen und zwar mit einer UND Verknüpfung

Daher:

Code: Alles auswählen

leal roman, %edi
movl 0(%edi), %eax
andl $0xFF, %eax
Der Hintergrund ist der, dass die Ascii Tabelle 0xFF, also 256Bit ist und du somit alles abschneidest, oberhalb der Ascii Tabelle.


Gruß
Mike
Wie komme ich denn jetzt auf den nächsten Buchstaben aus roman?
Anders gefragt, was muss hier inkrementiert werden, die 0?

Danke und Gruß

mike
Erstie
Erstie
Beiträge: 16
Registriert: 6. Nov 2011 13:59

Re: toDecimal - wie komme ich auf den String?

Beitrag von mike »

Code: Alles auswählen

leal roman, %edi #Lade Addresse vom Variable 'roman'
movl 0(%edi), %eax #Springe an Position 0+edx, und speichere Inhalt in %eax
andl $0xFF, %eax #Lösche alle Bits größer 0xFF, also alles auserhalb ASCII.
In edx steht die Absolute Position des ersten Buchstaben/Inhaltes von 'roman'. Nun gibst du mit 0 die Relative position an. Wenn du jetzt weiterspringen willst, kannst du entweder aus der 0 eine 1 machen. also 1(%edx), oder du erhöhst %edx um 1 und schreibst dann:

Code: Alles auswählen

incl %edx
movl 0(%edx), %eax
Bedenke dabei, dass du Datentyp anghängig erhoehen musst. Bei Strings ist es ein Bytearray, jedes Zeichen hat 1 Byte, also an jeder nächsten Speicherstelle steht der nächste Wert.
Bei long aber, ist der Datentyp 4Byte, also musst du um zum nächsten Zeichen zu kommen nicht 1 addieren sondern 4, also:

Code: Alles auswählen

addl $4, %edx
movl 0(%edx), %eax
oder:

Code: Alles auswählen

movl 4(%edx), %eax

Gruß
Mike

bagwell
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 109
Registriert: 15. Nov 2010 09:18

Re: toDecimal - wie komme ich auf den String?

Beitrag von bagwell »

mike hat geschrieben:

Code: Alles auswählen

leal roman, %edi #Lade Addresse vom Variable 'roman'
movl 0(%edi), %eax #Springe an Position 0+edx, und speichere Inhalt in %eax
andl $0xFF, %eax #Lösche alle Bits größer 0xFF, also alles auserhalb ASCII.
In edx steht die Absolute Position des ersten Buchstaben/Inhaltes von 'roman'. Nun gibst du mit 0 die Relative position an. (...)

Gruß
Mike

Danke, du hast mir sehr geholfen :)

Antworten

Zurück zu „Archiv“