Dies liegt daran, jedes Mal, wenn Sie eine Funktion aufrufen, die ABI, dass beschreibt:
- Register
r0
- r3
die Parameter enthalten, und kann als Scratch-Register verwendet werden. Dies bedeutet, dass die Funktion sie nicht speichern muss (Sie werden geändert)
- Andere Register müssen von der Funktion gespeichert werden, dh sie müssen beim Zurückkehren der Funktion auf den vorherigen Wert zurückgesetzt werden.
Dies ist ähnlich für r12
.
Wenn also SVC
einen C-Function-Handler aufruft, werden die Register r0
- r3
durch die C-Funktion beschädigt, während andere Register verwaltet werden. In diesem Fall übernimmt die Hardware automatisch das Stapeln, so dass wir die Garantie haben (Wenn die C-Funktion korrekt ist), dass alle Register den gleichen Wert haben wie vor dem Aufruf des SVC.
Beachten Sie, dass es für SVC akzeptabel gewesen wäre zu wissen, dass diese Register beschädigt sind (Weil wir wissen, wann wir den SVC-Befehl aufrufen). Aber andere Ausnahmen (wie Unterbrechungen) haben das gleiche Verhalten, und für diese ist dies wichtig, da wir nicht wissen, wann sie passieren.
In Bezug auf ein Buch, das weiß ich dieses Buch so kann ich es empfehlen:
The Definitive Guide auf die ARM Cortex-M3, Second Edition 2nd Edition von Joseph Yiu
Der eigentliche Punkt ist, dass die Ausnahme Der Eintrag _selbst_ sieht genau wie ein EABI-Funktionsaufruf aus (wobei die Hardware sich um die vom Anrufer gespeicherten Register kümmert), und daher sind Ausnahmehandler einfach reguläre C-Funktionen (beachte auch, dass es keine spezielle Ausnahme-Rückgabeanweisung gibt). – Notlikethat
Herr, können Sie bitte erklären die TBB Anweisung auch ....... weil ich mit Schwierigkeiten konfrontiert bin, dass ich nicht bekomme, wie es zu dem bestimmten Fall geht und warum wir die DCB() dazwischen schreiben .. –