Menu
Coddy logo textTech

Write Syscall (1)

Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 35 / 45.

Bir programdan nasıl çıkılacağını zaten biliyorsunuz. Ancak sessizce çıkmak pek yararlı değildir. Kullanıcının bir şeyler görebilmesi için programınızın çıktı yazdırmasını istersiniz.

Bunun için write sistem çağrısına ihtiyacınız var.

write syscall nedir?

write syscall, işletim sistemine ekrana metin yazdırmasını (veya bir dosyaya yazmasını) söyler. Programınızın çıktı üretme şekli budur.

write için sistem çağrısı numarası 1'dir.

write nasıl çalışır:

exit sistem çağrısının (yalnızca bir argümana ihtiyaç duyar) aksine, write üç argümana ihtiyaç duyar:

ArgümanYazmaç (Register)Ne yaparÖrnek
Dosya tanımlayıcırdiNereye yazılacağı (1 = ekran)mov rdi, 1
Tampon adresirsiMetnin bellekteki yerimov rsi, message
Bayt sayısırdxKaç bayt yazdırılacağımov rdx, 13

write sistem çağrısı iş başında:

mov rax, 1      ; write için sistem çağrısı numarası
mov rdi, 1      ; dosya tanımlayıcı 1 = stdout (ekran)
mov rsi, msg    ; yazdırılacak dizginin adresi
mov rdx, 13     ; yazdırılacak bayt sayısı
syscall         ; işletim sisteminden yazdırmasını iste

Ekrana bir mesaj yazdırmak için 5 satıra ihtiyacımız var. İlk olarak, yazma işlemi için rax içine 1 sistem çağrısı numarasını koyarız. Ardından, işletim sistemine ekrana yazdırmasını söylemek için rdi içine 1 koyarız.

Sonra, dizginin (msg) adresini rsi içine yerleştiririz. Bundan sonra, bayt sayısını (13) rdx içine yerleştiririz. Son olarak, işletim sisteminden yazdırmasını istemek için syscall komutunu yürütürüz.

write komutunu çalıştırdığınızda ne olur:

  1. CPU, Linux çekirdeğine atlar
  2. Çekirdek şunu görür: "write syscall"
  3. rdi (nereye yazılacağı), rsi (metnin nerede olduğu) ve rdx (kaç bayt olduğu) değerlerini okur
  1. Metni ekrana yazdırır
  2. Kontrolü programınıza geri döndürür

Bir string ile bir araya getirme:

section .data
    msg db 'Hello', 0x0a    ; yeni satır içeren string

section .text
    global _start

_start:
    mov rax, 1              ; write sistem çağrısı
    mov rdi, 1              ; stdout
    mov rsi, msg            ; string'in adresi
    mov rdx, 6              ; uzunluk (Hello + yeni satır = 6 bayt)
    syscall

    mov rax, 60             ; exit sistem çağrısı
    mov rdi, 0
    syscall

Bu program Hello yazdırır ve ardından sonlanır.

challenge icon

Görev

"Hi" mesajını ve ardından bir alt satırı yazdıran bir program yazın. write syscall'unu kullanın.

Dize, test donanımında sizin için zaten tanımlanmıştır. Sadece syscall kurulumunu yazmanız yeterlidir.

Kendin dene

section .data
    msg db 'Hi', 0x0a
    msgLen equ $ - msg

section .text
    global _start

_start:
    ; YAPILACAK: msg'yi yazdırmak için write sistem çağrısını kurun ve çağırın
    ; rax=1, rdi=1, rsi=msg, rdx=msgLen kullanın

    ; Programdan çık
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temeller bölümündeki tüm dersler