Die übergabe von Parametern und Rückgabewerten für ein Unterprogramm in Assembler
Ich arbeite mit der ARM-assembly, wo ich Schreibe eine subroutine, die ich nach dem ARM-Aufrufkonvention(diese müssen integriert werden mit einem separaten höheren Ebene die Umsetzung woanders ) für die übergabe von Parametern und Rückgabewerten. Nun, hier ist etwas, das ich nicht sicher bin, im Allgemeinen beim arbeiten mit Baugruppen.
Also aus der Konvention, wenn ich verstehe auch die Argumente in der Reihenfolge ausgehend von Register r0 - r4 und dann für andere Argumente-stacks verwendet werden. Return-Werte übergeben werden, um r0.
Nun, hier ist, was ich bin verwirrt mit. Wenn ich speichern sollen den Zusammenhang von r0 und Knall ihn ab, dann gibt es keinen Weg, um das Ergebnis zurückzugeben, die einzige Möglichkeit es getan werden kann, ist durch Bestechung das erste argument. Gibt es einen workaround irgendwie?
Vielen Dank im Voraus Jungs!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie passieren wieder die Rückkehr Wert in r0, der Anrufer erwartet, dass Sie dies tun wird. Der Anrufer ist nicht zu erwarten, dass r0 enthält den gleichen Wert wie die ursprüngliche erste parameter, denn r0 ist gerade dort, wo der return-Wert ist.
Normalerweise die ARM Aufruf-Konvention verlangt, dass die Unterroutine bewahrt r4 durch r11, nicht r0 bis r3. Es gibt also keinen Widerspruch sowieso.
Warum nicht einfach versuchen, diese selbst und sehen, was der compiler tut?
kompilieren Objekt und zerlegen
und das Ergebnis ist
Den beiden Eingängen a und b übergeben werden mit r0 und r1. r0-r4 müssen nicht erhalten werden, insbesondere r0, weil es den return-Wert nicht erhalten werden. So wie der C-code erforderlich, die beiden Operanden werden addiert, und als die Aufruf-Konvention verlangt, das Ergebnis ist wieder in r0. r0 = r0 + r1.
Den compiler entsprechen übereinkommen nichts anderes vor, den code, den es produziert, nicht funktionieren, so können Sie einfach den code kompilieren und disassemblieren, zu erfahren einiges über die Aufruf-Konvention für einen bestimmten compiler und target.