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şken | Register | Ne işe yarar | Örnek |
|---|---|---|---|
| Dosya tanımlayıcısı | rdi | Nereye yazılacağı (1 = ekran) | mov rdi, 1 |
| Tampon adresi | rsi | Metnin bellekte bulunduğu yer | 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 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ı 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'i çalıştırdığınızda ne olur:
- CPU, Linux çekirdeğine atlar
- Çekirdek şunu görür: "write syscall"
rdi(nereye yazılacağını),rsi(metnin nerede olduğunu) verdx(kaç bayt olduğunu) 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.
Temel Bilgiler bölümündeki tüm dersler
Kendi başına pratik yap: Assembly playground