Input

studypad
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 158
Registriert: 30. Mär 2011 11:46

Input

Beitrag 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			#

cwb38
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 125
Registriert: 4. Okt 2010 15:53

Re: Input

Beitrag von cwb38 »

In "input"^^

studypad
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 158
Registriert: 30. Mär 2011 11:46

Re: Input

Beitrag von studypad »

ne.. da liegt wenn ich 100 eingebe nur "d" drin.. ganz komisch..

Sebastian R.
Erstie
Erstie
Beiträge: 17
Registriert: 21. Okt 2010 10:12

Re: Input

Beitrag 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.

studypad
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 158
Registriert: 30. Mär 2011 11:46

Re: Input

Beitrag von studypad »

danke hat geklappt

Erdi
Erstie
Erstie
Beiträge: 22
Registriert: 1. Nov 2011 18:01

Re: Input

Beitrag 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!)

Snej
Neuling
Neuling
Beiträge: 5
Registriert: 27. Jul 2011 16:00

Re: Input

Beitrag 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.

Thomas Huxhorn
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 172
Registriert: 6. Okt 2011 15:25

Re: Input

Beitrag 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?

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: Input

Beitrag 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.

Erdi
Erstie
Erstie
Beiträge: 22
Registriert: 1. Nov 2011 18:01

Re: Input

Beitrag 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.

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: Input

Beitrag von Ronny »

Zum einen räumst du den Stack nicht auf. Und zum anderen beendest du nicht mit "movl $1, %eax" "int $0x80".

core
Mausschubser
Mausschubser
Beiträge: 55
Registriert: 3. Sep 2011 16:29

Re: Input

Beitrag 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

DjMennny
Neuling
Neuling
Beiträge: 6
Registriert: 2. Nov 2011 23:15

Re: Input

Beitrag von DjMennny »

Wie gibt man dem Programm eigentlich die Zahl?? Muss man das beim Starten angeben?

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

Re: Input

Beitrag 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

DjMennny
Neuling
Neuling
Beiträge: 6
Registriert: 2. Nov 2011 23:15

Re: Input

Beitrag 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?

Antworten

Zurück zu „Archiv“