Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Blatt 2 Aufgabe 6
Hi,
eine Frage zu Aufgabe 6:
Darf man den gegebenen Code nur in der sum Methode ergänzen ( weil da “…” steht), oder ist es auch erlaubt in der main Methode Befehle hinzuzufügen?
Warum würdest du das wollen?
Generell: So lange sich die Funktionen an die ABI halten und das Ergebnis rekursiv berechnet wurde ist es ok - wenn auch vermutlich unnötig.
Hab das gebraucht um mein n vor dem ersten Aufruf in meinem Register, das die Summe berechnet (eax) abzuspeichern.
Danke für die schnelle Antwort
Achtung: Es ist explizit gefordert, sich an die System V stdcall-ABI zu halten, Parameter also über den Stack zu übergeben.
Siehe: x86 calling conventions - Wikipedia - bei System V für i386 gibt es nur die normale cdecl Calling-Convention (Caller-Cleanup); stdcall ist Callee-Cleanup.
Hallo Zusammen,
ich hab folgendes Problem:
sobald ich bei dem Code unten nach
call sum
addl $4, %esp
oder davor ein
pushl n
ausführe kriege ich einen Segmentation fault
Das Programm habe ich per ssh Zugang auf dem UniRechner wie folgt ausgeführt:
gcc -m32 -o sumTest sumTest.s //zum compilen
./sumTest //zum ausführen
.data
n:
.long 16
.text
sum:
ret
.global main
main:
call sum
ret
Du musst darauf achten, dass du den Stack nicht “zerstörst”. Der Stackpointer muss vor dem Return auf die gesicherter Rücksprungadresse zeigen, sonst stürzt dein Programm ab.
Debuggen kannst du das ganze gut mit [m]gdb[/m], ein paar Infos gibt es hier: https://fsi.informatik.uni-erlangen.de/forum/thread/10515-Blatt-9-Aufgabe-5
jetzt läuft es, danke
Hi, ich habe ein Problem mit der Ausgabe des Wertes.
So wie ich die Fußnote verstehe sollte das mit echo $? gehen, beim kompilieren bekomme ich dann folgenden Fehler:
gra-02-sum.s: Assembler messages:
gra-02-sum.s:26: Error: no such instruction: `echo $5'
(Die 5 ist jetzt nur ein Beispiel )
Kann mir jemand dabei helfen, ich hab auch schon gesucht, aber nichts hilfreiches zu dem Thema gefunden.
Vielen Dank
Das ‘echo $?’ ist keine Instruktion, die in deinem Assembler-Programm steht, sondern das gibts du im Terminal ein, direkt nachdem du da dein Programm ausgefuehrt hast. ‘$?’ bezeichnet dabei den Return-Wert des zuletzt ausgefuehrten Programms.
das ganze sollte so aussehen:
Im Terminal eingeben:
gcc -m32 -o gra-02-sum gra-02-sum.s
./gra-02-sum
echo $?
wichtig, das echo $? erst eingeben wenn du das programm ausgeführt hast (also reihenfolge oben) und jedesmal wenn du mit echo $? testen willst musst du das programm neu ausführen.
d.h. Worklow falls du was am Programm geändert hast:
gcc -m32 -o gra-02-sum gra-02-sum.s
./gra-02-sum
echo $?
gcc -m32 -o gra-02-sum gra-02-sum.s
./gra-02-sum
echo $?
ODER falls du immer wieder das gleiche Programm testen willst
./gra-02-sum
echo $?
./gra-02-sum
echo $?
./gra-02-sum
echo $?
Achso, dann hab ichs natürlich komplett falsch verstanden, vielen Dank
Mein Leben ist so viel besser, seitdem mir meine Shell anzeigt, wenn sich etwas mit einem Exit-Code ungleich 0 beendet.
junk at end of line first unrecognized character is ‘,’
Nachdem ich mein gra-02-sum.s kompiliert habe, bekomme ich immer diese Fehlermeldung:
Kompiliert mit: gcc -m32 -o gra-02-sum gra-02-sum.s
gra-02-sum.s :20 Error: junk at end of line first unrecognized character is ‘,’
…
Zeile 20: pushl n
…
Wie kommt das? Und wie kann ich das beheben. Habe schon gegooglet - nichts gefunden. Außer: http://wiki.osdev.org/GCC_Cross-Compiler#Troubleshooting Das verstehe ich nicht so recht. Falsch kompiliert?
Danke
Was ist denn [m]n[/m]?
@ trigger:
hast du in der Zeile noch was anderes stehen als “pushl n”
ungültig wäre z.B.
**********beispiel falscher assembler code ****************
pushl n,
ODER
pushl n ;this is a comment
ODER z.B.
pushl n, %esp
**********beispiel falscher assembler code ****************
Ach, ich bin aber auch doof. War einfach ein TYPO, meinerseits. Danke.
Klappt nun alles.
@rudis: long 16
Muss man denn auch in der sum unbedingt push und pop benutzen?
Ich hab das ganze jetzt ohne jegliche Stacknutzung gemacht und sehe keinen Sinn darin den Stack zu nutzen.
Und welche Parameter sollen denn im Stack stehen? 16 runtergezählt oder immer die Zwischensumme?
Schau in die Aufgabenstellung, da steht explizit, welches ABI man verwenden soll.
Sinn: ihr sollt lernen, wie man mit dem Stack umgeht.
Schau dir an, wie die Funktion in der main aufgerufen wird.