Menu
Coddy logo textTech

Write Syscall (1)

Coddy'nin Assembly Journey'sinin Temel Bilgiler 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 var.

write sistem çağrısı nedir?

write sistem çağrısı, işletim sistemine metni ekrana yazdırmasını (veya bir dosyaya yazmasını) söyler. Programınızın çıktı üretme yöntemi budur.

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

write nasıl çalışır:

Yalnızca bir bağımsız değişkene ihtiyaç duyan exit sistem çağrısının aksine, write üç bağımsız değişkene ihtiyaç duyar:

Bağımsız değişkenRegisterNe işe yararÖrnek
Dosya tanımlayıcısırdiNereye yazılacağı (1 = ekran)mov rdi, 1
Tampon adresirsiMetnin bellekte bulunduğu yermov 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 syscall numarası
mov rdi, 1      ; dosya tanımlayıcısı 1 = stdout (ekran)
mov rsi, msg    ; yazdırılacak dizenin 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'i ç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ğını), rsi (metnin nerede olduğunu) ve rdx (kaç bayt olduğunu) 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.

Temel Bilgiler bölümündeki tüm dersler

Kendi başına pratik yap: Assembly playground