Buffer Adresi (rsi)
Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 37 / 45.
write syscall'unda, işletim sistemine çıktının nereye gönderileceğini (rdi içindeki dosya tanımlayıcısı) söyledikten sonra, ona ne yazdıracağını söylemeniz gerekir. Bunu, bellekteki dizenin (string) adresini ileterek yaparsınız.
Tampon adresi için yazmaç rsi'dir.
Buffer nedir?
Buffer, basitçe veri tutan bir bellek bloğudur. Bizim durumumuzda buffer, yazdırmak istediğimiz dizedir (string).
Neden değerin kendisi değil de adres?
write sistem çağrısının (syscall), dizginin bellekte nerede başladığını bilmesi gerekir. rdx içerisinde belirttiğiniz uzunluğa ulaşana kadar o adresten baytları okuyacaktır. Sistem çağrısına gerçek karakterleri göndermezsiniz — onların konumunu gönderirsiniz.
Örnek:
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi, msg adresini tutarmsg aslında nedir:
msg bir etikettir. Assembler bunu bir sayıyla — 'Hello' dizisinin saklandığı bellek adresiyle — değiştirir. mov rsi, msg yazdığınızda, bu adres numarasını rsi içine koymuş olursunuz.
Adresi unutursanız ne olur?
Eğer rsi değerini ayarlamazsanız, register daha önce orada bulunan her türlü çöp veriyi içerir. İşletim sistemi rastgele bir bellek adresinden okuma yapmaya çalışacaktır, bu da muhtemelen bir segmentasyon hatasına (çökme) neden olacaktır.
write sistem çağrısı ile tam örnek:
section .data
msg db 'Hello', 0x0a
len equ $ - msg
section .text
mov rax, 1 ; write sistem çağrısı
mov rdi, 1 ; standart çıktı
mov rsi, msg ; dizginin adresi
mov rdx, len ; bayt sayısı
syscallGörev
Size, 'Hi' değerine ve ardından bir yeni satıra sahip greeting adında bir dizgi (string) verilmiştir. greeting adresini rsi içine yükleyen kod satırını yazın.
Sadece rsi için mov komutunu yazın.
Kendin dene
section .text
global _start
_start:
%include "solution.asm"
mov rax, 1
mov rdi, 1
; rsi zaten adrese sahip (öğrencinin kodundan)
mov rdx, greetingLen
syscall
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.