Unterprogramm aufrufen Assembler?

 - (Computer, Technik, Technologie)

3 Antworten

Leider ist das Gekrakel auf dem Whiteboard dermaßen unlesbar, dass man nicht einmal erahnen kann, um was für einen Prozessor es überhaupt geht.

Grundsätzlich: alle gängigen Prozessoren stellen Befehle zum Aufruf von Unterprogrammen sowie zur Rückkehr zur übergeordneten Aufrufebene zur Verfügung. Heißt in der Intel-Welt z. B. "calll" (mit drei "l" wegen "long") für den Einsprung, und "retl" für den Rücksprung (auch hier das endständige "l" wieder für "long"). Bei anderen Prozessoren heißen die Mnemonics aber regelmäßig anders. Der alte 6502 beispielsweise hatte "jsr" ("jump subroutine") und "rts" (return from subroutine).

Beim Aufruf wird der aktuelle Programmcounter auf den Stack geknallt und dann der Programmcounter auf die im Parameter angegebene Adresse gesetzt. Die kann entweder direkt oder in verschiedenen Indirekt-Spielarten übergeben werden.

Bei der Rückkehr aus einem Unterprogramm wird der Programmcounter einfach vom Stack runtergepoppt.

Worum man sich selbst kümmern muss: Parameterübergabe. Da gibt es je nach Plattform verschiedene Konventionen. Klassische "cdecl"-Konvention, die architekturübergreifend eingesetzt wird, setzt dabei komplett auf Parameterübergabe auf dem Stack. D. h. der Aufrufer wirft die Parameter erst auf den Stack, macht dann den Unterprogrammaufruf. Das Unterprogramm kann die Werte auf dem Stack indirekt zum Stackpointer adressieren. Nach der Rückkehr muss der Caller seine Parameter selbst aktiv vom Stack wieder abräumen.

Effizienter, aber ggf. auch bei der Schnittstellenfestlegung schwieriger ist die Parameterübergabe direkt in Registern. Da kann man sich fallweise was überlegen, wie man es brauchen kann. Man sollte dann allerdings Interoperabilität an Schnittstellen zu Hochsprachen im Hinterkopf behalten. Wenn z. B. ein C-Programm eine Assemblerfunktion rufen möchte, dann müssen die calling conventions auf beiden Ebenen natürlich kompatibel zueinander sein.

Dem geschreibsel nach würde ich auf AVR Assembler tippen. Oben in der Zeile mit RAMEND wird wahrscheinlich die Startadresse für den Stack festgelegt (Kann das Register nicht lesen). in der mainloop kommt dann in der ersten Zeile der Unterprogrammaufruf mit "rcall waite". Von dem Unterprogramm ist aber außer dem Label noch nichts da, neben der eigentlichen Arbeit, die das tun soll, muss da irgendwann noch ein "ret" kommen, um wieder zum aufrufenden Hauptprogramm zurückzuspringen.

Anhand der Tafel würde ich sagen: Nein!

was wollen du damit sagen?!?!?!?

0
@IThelpPlease

Vermutlich bezieht sich Derya001 auf die Tatsache, dass die "Schrift" auf dem Whiteboard so aussieht, als hätte jemand sehhr betrunkenes daran "Hethitische Keilschriftstenographie" geübt... ;)

0

Kann jemand von euch Maschinensprache (Assembler)?

Wie ist es so? Wie lange habt ihr gebraucht um es zu lernen? Was kann es einem nützen?

...zur Frage

Sieb des Eratosthenes in Assembler

Hallo, ich habe Probleme damit das ich nicht weiß wie ich das Programm " Sieb des Eratosthenes" in Assembler schreiben soll. Ich hab schon ein Pseudo-Code gemacht, also verstanden habe ich es, doch ich weiß nicht wie ich das in Assembler angehen soll. Wäre sehr hilfreich wenn jemand mir helfen könnte.

...zur Frage

Makro vs Unterprogramm Assembler?

In einer Altklausur wird gefragt warum Unterprogramme im Gegensatz zu Makros langsamer sind aber weniger Speicherplatz benötigen.

Hat hierzu jemand eine Antwort / Erklärung für mich?

...zur Frage

Zwei Formulare gleichzeitig absenden?

Ich habe ein kleines Problem. Ich versuche eine Artikelverwaltung zu programmieren, die aus zwei Formularen besteht. Einem "Tab" in dem ein Formular ist, für einen Blogbeitrag und einen weiteren "Tab" mit einem Formular für einen Radiobeitrag.

Ich möchte jetzt, außerhalb beider Forms einen Button haben, der beide Formulare abschickt und die Funktion submitEditorForm() ausführt, die ich geschrieben habe.

Finde jedoch nirgends eine Lösung?

...zur Frage

Ich verstehe nicht, wie ich das programmieren soll, kann mir wer helfen`?

Erstellen Sie bitte ein Programm, mit dem Sie

einen Dialog führen, der die Koordinaten von 2 3-dimensionalen Vektoren erfragt (also x, y und z-Koordinaten von Vektor A und B) ein Unterprogramm aufrufen, welches das Skalarprodukt, das Kreuzprodukt (Vektor C) und die Beträge der Vektoren A, B und C berechnet sämtliche Ergebnisse übersichtlich ausgeben

Erstellen Sie dazu das nötige Unterprogramm „Vektorrechnung“

Achtung, das Unterprogramm soll und kann alle Ergebnisse bis auf einen Wert nur über Zeiger zurückgeben.

...zur Frage

C - Switch Case - Anagramm?

Hallo,

ich wollte ein Anagramm in C programmieren, nur mit Arrays und den Bibliotheken stdio.h und string.h. Und ich verstehe nicht wo mein Fehler liegt bzw. warum die switch case Anweisung nicht richtig funktioniert. Hier der Code(es wurde im Nachhinhein viel herumgespielt, um den Fehler ausfindig zu machen und zu beheben, dazu musste ich ihn kürzen für die Frage - deswegen so chaotisch):

for(int k = 0 ; k < 31; k++){  //k ist länge des Arrays
        for(int i=0 ; i = '\0' ; i++){
         switch (s1[i]) {              //s1 ist das erste Wort
                case 'a': a1++; break;
                ....
                case 'z': z1++; break;
   }
        for(int i=0 ; i = '\0' ; i++){
         switch (s2[i]) {              //s2 ist das zweite eingegebene Wort
                case 'a': a2++; break;
                ....
                case 'z': z2++; break;
   }

if(a1==a2)&&...(z1==z2){
    printf("%s und %s sind Anagramme!\n", s1, s2);
     }else{
         printf("%s und %s sind keine Anagramme!\n", s1, s2);
         }
return 0;  
}

Funktionsweise: Es werden zwei char Arrays durch Eingabe gespeichert. Dann gehe man in einer Schleife, alle einzelnen Buchstaben eines Wortes durch. Bei jedem Buchstaben wird sein dementsprechender Zähler um 1 erhöht. Dann das selbe für Wort 2. Am Ende schaut man ob die Buchstaben für beiden gleich oft vorkommen, wenn ja dann ist es ein Anagramm, wenn nicht dann ist es kein Anagramm.

Lasse ich mir nach den Switch Anweisungen ausgeben, wie sich die Zähler-Variablen geändert haben, kommt immer die 0. Obwohl eigentlich was hätte gezählt werden müssen. Bin auch noch Anfänger, vielleicht habe ich die switch Anweisungen noch nicht komplett verstanden.

Aber ich habe auch keinen logischen Denkfehler, oder?

Und ich weiß, nicht die eleganteste Lösung und geht wahrscheinlich auch mit meiner Beschränkung noch effizienter, aber ich bin noch Anfänger.

Also ich wäre sehr dankbar über einen Lösungsansatz bzw einer Erklärung warum dies so nicht funktionieren kann.

PS.: Bei der ersten Schleife lautet der Syntax folgendermaßen, da er nicht richtig wiedergegeben wird:

(int k = 0; k <= 31; k++){

mfg werdas34

...zur Frage

Was möchtest Du wissen?