2016-03-29 12 views

Antwort

1

Wenn Sie eine Funktion, einen Systemaufruf, eine Prozedur oder einen anderen externen Code innerhalb einer Assemblersprache aufrufen, definiert die Funktionsaufrufdefinition für diese Funktion Register, die beibehalten werden müssen und Register, die möglicherweise nicht beibehalten werden . Oft ist dies als Standard für die Plattform, Bibliothek oder Sprache dokumentiert. Du verstehst das klar. Ihre Frage ist: "Warum?"

Wenn ein Register nicht garantiert erhalten bleibt, bedeutet dies, dass die aufgerufene Funktion frei ist, diese Register in irgendeiner Weise zu manipulieren und zu ändern. Es ist nicht so sehr, dass sie "gelöscht" werden, sondern dass sie geändert oder überschrieben werden, während die Funktion arbeitet; Schließlich muss die Funktion dieselben Register verwenden, die Sie verwenden!

Auf der anderen Seite, wenn ein Register durch einen Anruf erhalten bleiben muss, dann ist garantiert, dass es unverändert bleibt, wenn der Anruf zu Ihrem Code zurückkehrt. Dies liegt möglicherweise daran, dass das Register nicht von der aufgerufenen Funktion verwendet wird, es könnte aber auch daran liegen, dass es auf dem Stack (oder irgendwo im Speicher) gespeichert und dann vor der Rückgabe wiederhergestellt wird.