Warum wird bei einem Unterfunktionsaufruf (call) der Inhalt des Program Counter auf dem Stack gesichert
Damit das Programm nach Beendigung der Unterfunktion dorthin zurückspringen kann, wo der Unterfunktionsaufruf stattgefunden hat.
bei einem Sprung (jmp) aber nicht?
Um einen Befehl zur Verfügung zu haben, bei dem man im Programm springen kann ohne den Stack zu verändern.
Globale Variablen erhalten vom C-Compiler feste Adressen im Hauptspeicher
Feste Adressen damit sie wiedergefunden werden können. Im Hauptspeicher weil wo denn sonst. BTW der Stack ist Teil des Hauptspeichers.
Funktionslokale Variablen werden auf dem Stack angelegt,
Weil dort schneller Speicher reserviert werden kann als auf dem Heap. Und weil die Daten nicht mehr benötigt werden sobald sobald die Funktion beendet wurde.