Exit Syscall (60)
Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 32 / 45.
Herhangi bir program için en önemli sistem çağrısı (syscall) exit'tir. O olmadan, programınız sonsuza kadar çalışmaya devam eder veya belleğin sonuna ulaştığında çöker.
Exit sistem çağrısı numarası 60'tır.
Sözdizimi:
mov rax, 60 ; çıkış için syscall numarası
mov rdi, 0 ; çıkış kodu (0 = başarılı)
syscall ; işletim sisteminden çıkış yapmasını isterax = 60 ile syscall komutunu çalıştırdığınızda ne olur:
- CPU, Linux çekirdeğine (kernel) atlar
- Çekirdek şunu görür: "0 kodu ile exit sistem çağrısı"
- Kernel programınızı sonlandırır
- Kernel, kontrolü kabuğa veya işletim sistemine geri verir
Çıkış kodu 0 başarı anlamına gelir — program hatasız tamamlandı. 1'den 255'e kadar olan çıkış kodları farklı hataları belirtir. Neyin yanlış gittiğini bildirmek için herhangi bir sayı seçebilirsiniz.
Çıkış kodları neden önemlidir:
Programınız kapandıktan sonra, kabuk (terminal) çıkış kodunu saklar. Şununla kontrol edebilirsiniz:
./myprogram
echo $? ; Çıkış kodunu yazdırırBu şunlar için kullanışlıdır:
- Bir programın başarılı olup olmadığını kontrol eden betikler
- Hata ayıklama (farklı hatalar için farklı kodlar)
- Programları birbirine zincirleme
Tam bir minimal program:
section .text
global _start
_start:
mov rax, 60 ; exit sistem çağrısı
mov rdi, 0 ; çıkış kodu 0 (başarılı)
syscallBu program görünür hiçbir şey yapmaz — sadece başarıyla çıkar. Ancak geçerli, eksiksiz bir programdır.
global _start ve _start: ifadelerinin ne olduğundan bahsedelim.
| Kod | Nedir | Neden ihtiyacınız var |
|---|---|---|
global _start | Bağlayıcıya (linker) programınızın nerede başladığını söyler | O olmadan, bağlayıcı hangi etiketin giriş noktası olduğunu bilemez |
_start: | Kodunuzun başlangıcını işaret eden bir etiket | İşlemci (CPU) yürütmeye buradan başlar |
Detayları ezberlemenize gerek yok. Sadece her main.asm dosyasının kodunuzdan önce bu iki satıra sahip olması gerektiğini bilin. Bunları her programda kullanacaksınız.
exit syscall'unu unutursanız ne olur?
Eğer exit syscall'unu dahil etmezseniz, CPU kodunuzdan sonra bellekte bulunan her türlü çöp veriyi yürütmeye devam edecektir. Bu genellikle bir segmentasyon hatasına (segmentation fault - çökme) veya tamamen beklenmedik davranışlara neden olur. Programınız temiz bir şekilde sonlanmayacaktır.
Programınızı her zaman bir exit sistem çağrısı (syscall) ile sonlandırın.
Görev
Çıkış kodu 5 olan exit syscall'u ekleyin.
"Exiting with code 5" mesajını yazdırmak için gereken kod sizin için zaten sağlandı. Henüz bunu anlamanıza gerek yok — Bölüm 5'te ele alınacak.
Göreviniz sadece sonuna exit syscall'u eklemektir.
Kendin dene
section .data
msg db 'Exiting with code 5', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
; TODO: 5 çıkış kodu ile exit syscall'unu ekle
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.