I habe manchmal festgestellt, dass, wenn I-C-Code des Assembler-Code zu kompilieren manchmal in Methode 1 erzeugt wird:die Funktion des Prelog und Epilog in Arm gcc Controlling
STR R11, [SP, #-4]!
ADD R11, SP, #0
SUB SP, SP, #4
und manchmal in Methode 2:
STMFD SP!, {R11, LR}
ADD R11, SP, #4
SUB SP, SP, #4
Der Unterschied zwischen der ersten und der zweiten Methode besteht darin, dass die zweite Methode LR in den Stack speichert.
Im Moment stehe ich vor einem Problem, wo meine Funktion, die wie die erste Methode startet, eine andere Funktion über das Linkregister (BL) aufruft, und da meine Funktion das LR nicht zuerst speichert, verursacht das ein ernstes Problem Problem. Wenn ich dem Compiler sagen könnte, die zweite Methode zu verwenden, könnte es mein Problem lösen.
Es kann mit der Tatsache verbunden sein, dass die Funktion die innere Funktion aufruft, die Inline-Assembly verwendet und daher "nicht erkennt", dass ein Aufruf an eine andere Funktion ist und keinen Sinn beim Speichern des LR sieht. Der Aufruf der Inline-Assembly ist obligatorisch, da die aufgerufene Funktion den Wert von SP als Parameter erhält.
Dies ist eine ziemlich catch-22-Situation, hoffentlich könnte mir jemand helfen, das zu lösen. Danke!
Warum Sie die Frage "C" Tag haben, ohne gezeigt zu haben, wie Sie Ihre Funktion in C aussieht? – user3078414
Es könnte eine gute Idee sein, den Aufruf in der Inline-Assembly durch einen Aufruf in C zu ersetzen. – fuz
Wenn Sie eine Assembly benötigen, um SP zu erhalten, verwenden Sie sie, um SP zu erhalten; der Aufruf ist nicht verwandt, also tu es in C. Das sollte nicht schwer sein, aber du zeigst deinen Code nicht, damit wir es nicht wissen können. – ElderBug