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üman | Yazmaç (Register) | Ne yapar | Örnek |
|---|---|---|---|
| Dosya tanımlayıcı | rdi | Nereye yazılacağı (1 = ekran) | mov rdi, 1 |
| Tampon adresi | rsi | Metnin bellekteki yeri | mov rsi, message |
| Bayt sayısı | rdx | Kaç 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ı isteEkrana 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:
- CPU, Linux çekirdeğine atlar
- Çekirdek şunu görür: "write syscall"
rdi(nereye yazılacağı),rsi(metnin nerede olduğu) verdx(kaç bayt olduğu) değerlerini okur
- Metni ekrana yazdırır
- 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
syscallBu program Hello yazdırır ve ardından sonlanır.
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
syscallBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.