# void swtch(struct context *old, struct context *new);
#
# Mevcut context’in register değerlerini old kaydına sakla.
# Ardından new kaydındaki context’in register değerlerini yükle.
.globl swtch
swtch:
  # Eski context’in register değerlerini kaydet.
  movl 4(%esp), %eax  # old kaydının adresini EAX’a yükle.
  popl 0(%eax)        # Eski dönüş adresini (IP) kaydet.
  movl %esp, 4(%eax)  # Eski stack pointer değerini kaydet.
  movl %ebx, 8(%eax)  # Diğer register değerlerini de kaydet.
  movl %ecx, 12(%eax)
  movl %edx, 16(%eax)
  movl %esi, 20(%eax)
  movl %edi, 24(%eax)
  movl %ebp, 28(%eax)

  # Yeni context’in register değerlerini yükle.
  movl 4(%esp), %eax  # new kaydının adresini EAX’a yükle.
  movl 28(%eax), %ebp # Saklanan register değerlerini geri yükle.
  movl 24(%eax), %edi
  movl 20(%eax), %esi
  movl 16(%eax), %edx
  movl 12(%eax), %ecx
  movl 8(%eax), %ebx
  movl 4(%eax), %esp  # Aktif stack bu komutla değiştirilir.
  pushl 0(%eax)       # Yeni dönüş adresini stack’e yerleştir.
  ret                 # Yeni context’in dönüş adresinden yürütmeye devam et.
