Seite 1 von 1

toDecimal - wie komme ich auf den String?

Verfasst: 6. Nov 2011 13:20
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?

Re: toDecimal - wie komme ich auf den String?

Verfasst: 6. Nov 2011 14:03
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

Re: toDecimal - wie komme ich auf den String?

Verfasst: 6. Nov 2011 18:27
von hamster34
*kopftisch*
super danke - darauf hätte ich auch kommen können.

Re: toDecimal - wie komme ich auf den String?

Verfasst: 6. Nov 2011 21:50
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

Re: toDecimal - wie komme ich auf den String?

Verfasst: 6. Nov 2011 22:08
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

Re: toDecimal - wie komme ich auf den String?

Verfasst: 6. Nov 2011 22:37
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

Re: toDecimal - wie komme ich auf den String?

Verfasst: 6. Nov 2011 23:17
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ß

Re: toDecimal - wie komme ich auf den String?

Verfasst: 7. Nov 2011 12:55
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ß

Re: toDecimal - wie komme ich auf den String?

Verfasst: 7. Nov 2011 13:24
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

Re: toDecimal - wie komme ich auf den String?

Verfasst: 8. Nov 2011 08:34
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 :)