TI2/Rechnerarchitektur-Tutorium, 10.11.2016

Organisation des Tutoriums

Vorbesprechung, (Call) Stack

Was tun, wenn Register nicht ausreichen?

  • Müssen Werte irgendwo zwischenspeichern → Speicher
  • Am besten unkompliziert, ohne genau zu wissen, wo es im Speicher liegt
  • Lösung: Stack (Stapelspeicher)
  • PUSH op: Einen Wert oben auf den Stack legen
  • POP register: Den obersten Wert vom Stack nehmen und in ein Register legen

PUSH und POP um Register zu sichern

  • Solltet ihr die Register rbp, rbx, and r12–r15 verwenden, solltet ihr diese vorher sichern
func:
    push rbx
    push r12
    ; Irgendwas mit rbx und r12 machen
    pop r12
    pop rbx
    ret

Unterschiede zwischen CALL und JMP

  • Von der Idee machen call und jmp das gleiche
    • sie legen fest, welches die nächste ausgeführte Instruktion ist
    • sie ändern damit den linearen Ablauf des Programms
  • Anders als jmp muss call jedoch speichern, wo es gerade ist, um dahin wieder zurückspringen zu können
    • Wo speichert call diese Information? Auf dem Stack.

Der Call Stack als Bild

Example layout of a call stack showing stack frames and frame pointer, 2007, R. S. Shaw, Public Domain
Example layout of a call stack showing stack frames and frame pointer, 2007, R. S. Shaw, Public Domain
  • Der Bereich für die Parameter wird von uns in der Regel nicht benötigt, erst ab mehr als 6 Parametern
  • Der Bereich Locals enthält alles, was in der Funktion auf den Stack geschoben wird

Was machen CALL und RET genau?

CALL label => PUSH rip  ; rip = instruction pointer
                        ; = Adresse des nächsten Befehls
              JMP label
RET => POP rip ; Hole Adresse des nächsten Befehls
               ; vom Stack