Exit Syscall (60)
Coddy'nin Assembly Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 32 / 45.
Herhangi bir 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 ; çıkış için syscall numarası
mov rdi, 0 ; çıkış kodu (0 = başarı)
syscall ; OS'den çıkmasını istesyscall komutunu <strong>rax = 60</strong> ile çalıştırdığınızda ne olur:
- CPU, Linux çekirdeğine geçer
- Ç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 olarak tamamlanmıştır. 1 ile 255 arasındaki çıkış kodları farklı hataları belirtir. Neyin yanlış gittiğini belirtmek için herhangi bir sayı seçebilirsiniz.
Çıkış kodları neden önemlidir:
Programınızdan çıktıktan sonra kabuk (terminal), çıkış kodunu saklar. Bunu şu şekilde kontrol edebilirsiniz:
./myprogram
echo $? ; Çıkış kodunu yazdırırŞ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ı)
syscallBu program görünür hiçbir şey yapmaz. Yalnızca başarıyla çıkar. Ancak geçerli ve eksiksiz bir programdır.
global _start ve _start: ifadelerinin ne olduğundan bahsedelim.
| Kod | Nedir | Neden gerekli |
|---|---|---|
global _start | Programınızın nerede başladığını bağlayıcıya bildirir | Bu olmadan bağlayıcı, hangi etiketin giriş noktası olduğunu bilemez |
_start: | Kodunuzun başlangıcını belirten bir etiket | CPU yürütmeye burada başlar |
Ayrıntıları ezberlemen gerekmez. Yalnızca her main.asm dosyasında kodundan önce bu iki satırın bulunması gerektiğini bil. 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 rastgele verileri yürütmeye devam eder. Bu genellikle bir segmentasyon hatasına (çökmeye) veya tamamen beklenmedik davranışlara neden olur. Programınız düzgün bir şekilde sonlanmaz.
Programınızı her zaman bir çıkış syscall'ı ile sonlandırın.
Görev
Çıkış sistem çağrısını, çıkış kodu 5 olacak şekilde ekleyin.
"Exiting with code 5" iletisini yazdıran kod sizin için zaten sağlanmıştır. Henüz bunu anlamanız gerekmiyor. Bu konu Bölüm 5'te ele alınacaktır.
Göreviniz yalnızca 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: Exit kodu 5 ile exit syscall'ı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