Der Compiler fügt nur dort push und pop-Anweisungen in den Code ein, wo sie auch gebraucht werden.

Die Übergabe von Argumenten wird in der Regel ohne push und pop erledigt, weil die Argument in Registern übergeben werden.

In den Funktionen ist auch nicht unbedingt push/pop notwendig, sondern nur denn, wenn Register verwendet werden, die durch einen Funktionsaufruf nicht verändert werden bzw nach einem Funktionsaufruf unverändert vorliegen ("call saved regs"). Für die Register, die eine Funktion verwenden kann ohne sie vorher zu sichern ("call clobbered regs") ist natürlich kein push/pop notwendig.

Auf keinen Fall darfst du irgendwo in den Code ein "push" einfügen oder so, das führt zum Absturz -- Ausnahme ist, wenn du selber Inline Assembler einfügst und du genau weisst was du tust und genau weisst, welchen Code der Compiler sonst generiert.

Wenn du "reinen" C-Code schreibst, brauchst du dich darum nicht zu kümmern.

Das gilt auch für die (implizit aufgerufene) divmodhi4-Funktion, das erledigt alles der Compiler.