Exit Syscall (60)
Coddy'nin Assembly Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 32 / 45.
Her program için en önemli sistem çağrısı exit çağrısıdır. Bu çağrı olmadan programınız sonsuza kadar çalışmaya devam eder veya belleğin sonuna ulaştığında çöker.
exit sistem çağrısının numarası 60'tır.
Sözdizimi:
mov rax, 60 ; exit için syscall numarası
mov rdi, 0 ; çıkış kodu (0 = başarı)
syscall ; OS'den çıkış yapmasını istesyscall komutunu rax = 60 ile çalıştırdığında ne olur:
- CPU, Linux çekirdeğine atlar
- Çekirdek şunu görür: "exit syscall with code 0"
- Çekirdek programınızı sonlandırır
- Çekirdek, denetimi kabuğa veya işletim sistemine geri verir
Çıkış kodu 0 başarı anlamına gelir: program hatasız tamamlandı. 1 ile 255 arasındaki çıkış kodları farklı hataları belirtir. Neyin yanlış gittiğini bildirmek için herhangi bir sayı seçebilirsiniz.
Çıkış kodları neden önemlidir:
Programınız sonlandıktan sonra kabuk (terminal) çıkış kodunu saklar. Şu komutla kontrol edebilirsiniz:
./myprogram
echo $? ; Prints the exit codeŞ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 ; çıkış 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 ve eksiksiz bir programdır.
global _start ve _start: ifadelerinin ne olduğundan bahsedelim.
| Kod | Ne olduğu | Neden gerekli olduğu |
|---|---|---|
global _start | Bağlayıcıya programınızın nerede başladığını söyler | Bu olmadan bağlayıcı, hangi etiketin giriş noktası olduğunu bilemez |
_start: | Kodunuzun başlangıcını işaretleyen bir etiket | CPU burada yürütmeye başlar |
Ayrıntıları ezberlemen gerekmiyor. Her main.asm dosyasında kodundan önce bu iki satırın bulunması gerektiğini bilmen yeterli. Bunları her programda kullanacaksın.
Çıkış sistem çağrısını unutursanız ne olur?
Çıkış sistem çağrısını eklemezseniz CPU, kodunuzdan sonra bellekte bulunan gelişigüzel verileri çalıştırmaya devam eder. Bu genellikle bir segmentasyon hatasına (çökme) veya tamamen beklenmedik davranışlara yol açar. Programınız düzgün bir şekilde sonlanmaz.
Programınızı her zaman bir çıkış sistem çağrısıyla bitirin.
Görev
Çıkış kodu 5 olan çıkış sistem çağrısını ekleyin.
Mesajı yazdıran kod "Exiting with code 5" sizin için zaten sağlanmıştır. Henüz anlamanız gerekmez. Bu konu Bölüm 5'te ele alınacaktır.
Tek yapmanız gereken sona çıkış sistem çağrısını 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: Çıkış kodu 5 olan exit syscall çağrısını ekle
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Temel Bilgiler bölümündeki tüm dersler
Kendi başına pratik yap: Assembly playground