Wie gebe ich an welche Fibonacci-Zahl ich berechnen möchte wenn ich ein Programm habe, das mir die n-te Fibonacci-Zahl liefert?
Wenn ich gcc MeinProgramm.s und dann ./a.out ausführe…
Wo gebe ich an welche Fibonacci-Zahl ich berechnen möchte?
Parameter landen auf dem Stack.
enter $0, $0 # -> push %ebp; mov %esp, %ebp;
push %edx
# Parameter vom Stack in edx schreiben
movl 8(%ebp), %edx
# --- CODE --- #
Danach kannst Du Deinen Parameter auf der Kommandozeile beim Programmaufruf übergeben.
und wie übergebe ich den Parameter beim Programmaufruf?
Mit der Tastatur. Wie denn sonst?
Edit: Du kannst natürlich auch einen trivialen C-Wrapper zum Aufruf schreiben - main-Methode, das Argument von main gibts Du als int an eine Methode fibonacci(int), über den Header rufst Du dann Dein Assemblerprogramm auf, fertig.
Wie gebe ich an welche Fibonacci-Zahl ich berechnen möchte wenn ich ein Programm habe, das mir die n-te Fibonacci-Zahl liefert?
Ich denke mal, Du sollst ein Programm schreiben, welches drei ganz bestimmte berechnen soll. Dazu ruftst Du in der main-Funktion drei mal die Fibonacci-Funktion mit verschiedenen Werten auf.
In C sähe das so aus:
int main()
{
fibonacci(46);
fibonacci(47);
fibonacci(48);
}
void fibonacci(int i)
{
// ... berechnen und ausgeben
}
Danach kannst Du Deinen Parameter auf der Kommandozeile beim Programmaufruf übergeben.
Naja, aber als String. Und String-Handling in asm will man nicht machen (vor allem nicht, in so 'ner billigen Uebungsaufgabe…)
Hat jemand vielleicht nen Tipp wie ich den Overflow bei Fib(47) vermeiden kann?
Hat jemand vielleicht nen Tipp wie ich den Overflow bei Fib(47) vermeiden kann?
Vielleicht ist der Overflow der Sinn der Aufgabe?
Hat jemand vielleicht nen Tipp wie ich den Overflow bei Fib(47) vermeiden kann?
Wie lange willst du ihn denn vermeiden? Du könntest die Zahl in $favorite_numerical_type-Blocks darstellen und iterative schriftliche Multiplikation damit treiben, AFAIK wird bignum so gerechnet. Natürlich kommst du damit dann irgendwann vom word overflow zum memory overflow, aber irgendwas ist immer. :)
Hat jemand vielleicht nen Tipp wie ich den Overflow bei Fib(47) vermeiden kann?
bei f47 gehts noch, indem du in printf %u statt %d als parameter verwendest. dann wird das register ohne rücksicht auf das vorzeichen ausgegeben.
Danach kannst Du Deinen Parameter auf der Kommandozeile beim Programmaufruf übergeben.
Naja, aber als String. Und String-Handling in asm will man nicht machen (vor allem nicht, in so 'ner billigen Uebungsaufgabe…)
Wieso nicht? Was rauskommt, ist die Adresse des String-Anfangs. Ein Blick in eine ASCII-Tabelle zeigt, wie leicht es ist, ints zu parsen. Der String endet bei \0. Ist doch easy.
Oder hab ich was übersehen?