Seite 1 von 2

Input

Verfasst: 31. Okt 2011 17:43
von studypad
wie funktioniert denn im Projekt der input.. ich gebe ihm eine zahl und wo steht die dann?

Code: Alles auswählen

.data
input: .long 0
scanstr: .string "%d"

.text

.globl main
main:
	pushl $input		#
	pushl $scanstr		# Dezimalzahl einlesen nach input
	call scanf			#

Re: Input

Verfasst: 31. Okt 2011 18:24
von cwb38
In "input"^^

Re: Input

Verfasst: 31. Okt 2011 18:44
von studypad
ne.. da liegt wenn ich 100 eingebe nur "d" drin.. ganz komisch..

Re: Input

Verfasst: 31. Okt 2011 19:54
von Sebastian R.
100 ist der Ascii-Code von "d". Je nachdem, wie du den Inhalt von "input" überprüfst, achte darauf, dass es als Zahl ausgegeben wird.

Re: Input

Verfasst: 31. Okt 2011 20:26
von studypad
danke hat geklappt

Re: Input

Verfasst: 1. Nov 2011 18:11
von Erdi
Ich hätte dazu weitergehend mal eine Frage:
Und zwar tue ich mich schwer dabei Strings einzulesen. Erwartet hätte ich, dass es ähnlich wie mit dem Einlesen von Zahlen funktioniert:

Code: Alles auswählen

.data
inputstring: .string "Hallo"
scanstr: .string "%s"
printstring: .string "Inhalt: %s\n"

.text

.globl main
main:
   pushl $inputstring 
   pushl $scanstr     # String einlesen nach inputstring
   call scanf         

   #Ab hier Ausgabe des Strings
   leal inputstring, %eax
   pushl %eax
   pushl printstring
   call printf
Wenn ich es so mache und z.B. "Hallo" eingebe, bekomme ich als Fehlermeldung nur: "Speicherzugriffsfehler".
Kann mir evtl. jemand auf die Sprünge helfen wo ich noch falsch denke? irgendwie bereitet mir die Stringverarbeitungssache noch einige Probleme, weil wir in der Vorlesung noch nichts dazu hatten und ich im Netz auch nichts gescheites zu der Sache gefunden habe (über Links zu dem Thema würde ich mich auch sehr freuen, falls jemand nen gute Seite gefunden hat!)

Re: Input

Verfasst: 1. Nov 2011 23:36
von Snej

Code: Alles auswählen

    .data
...
       #Ab hier Ausgabe des Strings
       leal inputstring, %eax
       pushl %eax
       pushl printstring
       call printf
Ich vermute, dein leal ist nicht 100%ig richtig.
Mit leal liest du erstmal die Adresse hinter dem inputstring in die Variable %eax. Das ist schon nicht soooo optimal. Ich hab se bei mir nun erstmal in %edi geladen.
Von %edi kann ich wiederrum den Wert auslesen und in %eax speichern.
movl 0(%edi), %eax
Damit lade ich den Wert beginnend ab dem 0ten Byte der bei der Adresse von %edi hinterlegt ist, nach %eax.

Hoffe es hilft.

Re: Input

Verfasst: 2. Nov 2011 09:09
von Thomas Huxhorn
Wo ist da der Unterschied? In der Reference steht nur, es muss ein 16 oder 32bit Register sein.

Und movl 0(%edi), %eax ist doch %edi+0 ist doch %edi und damit kein Unterschied zu %eax. Oder übersehe ich da was?

Re: Input

Verfasst: 2. Nov 2011 12:04
von Ronny
Hallo Erdi,

du hast beim "pushl printstring" lediglich das $ vor printstring vergessen. Ohne dem $ wird das erste Zeichen im String auf den Stack gelegt und nicht die String Adresse.
Es muss also "pushl $printstring" heissen.

Re: Input

Verfasst: 2. Nov 2011 14:12
von Erdi
Ich danke euch allen für die Antworten, tatsächlich hat es gereicht das $ vor printstring zu schreiben.

Fälschlicherweise habe ich mich ein wenig vom meinem Terminal irritieren lassen und dachte, dass das einlesen der Zeichen schon nicht korrekt funktioniert (da immer die Fehlermeldung "Speicherzugriffsfehler" kam).
Diese Meldung kommt nun immer noch am Ende des Programmes, aber der String wird korrekt eingelesen und ausgegeben.
Ich kann mir noch nicht so ganz erklären, wieso dies passiert, aber solange der Rest schonmal funktioniert und mir nur dieser Fehler angezeigt wird soll es mir erst einmal egal sein.

Re: Input

Verfasst: 2. Nov 2011 16:28
von Ronny
Zum einen räumst du den Stack nicht auf. Und zum anderen beendest du nicht mit "movl $1, %eax" "int $0x80".

Re: Input

Verfasst: 2. Nov 2011 19:25
von core
Hi,
Ronny hat geschrieben:Zum einen räumst du den Stack nicht auf.
muss man das?

Und wenn ja: wie geht das?

Viele Grüße
core

Re: Input

Verfasst: 2. Nov 2011 23:23
von DjMennny
Wie gibt man dem Programm eigentlich die Zahl?? Muss man das beim Starten angeben?

Re: Input

Verfasst: 2. Nov 2011 23:40
von zimpfer
DjMennny hat geschrieben:Wie gibt man dem Programm eigentlich die Zahl?? Muss man das beim Starten angeben?

Ja, im Coderahmen gibt es eine Eingabe und die Daten stehen nach dem Einlesen in input bzw. roman

Re: Input

Verfasst: 3. Nov 2011 00:17
von DjMennny
zimpfer hat geschrieben:
DjMennny hat geschrieben:Wie gibt man dem Programm eigentlich die Zahl?? Muss man das beim Starten angeben?

Ja, im Coderahmen gibt es eine Eingabe und die Daten stehen nach dem Einlesen in input bzw. roman

Ich meine, von wo liest der scanf-Befehl die Zahl ein?! Von der Konsole?