Buffer Adresi (rsi)
Coddy'nin Assembly Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 37 / 45.
write sistem çağrısında, çıktının nereye gönderileceğini işletim sistemine bildirdikten sonra (rdi içindeki dosya tanımlayıcısı), ona yazdıracağı şeyi söylemeniz gerekir. Bunu, bellekteki dizenin adresini geçirerek yaparsınız.
Tampon adresi için kullanılan register rsi’dir.
Buffer nedir?
Buffer, verileri tutan bir bellek bloğudur. Bizim durumumuzda buffer, yazdırmak istediğimiz string değeridir.
Neden değerin kendisi değil de adres?
write sistem çağrısının, dizenin bellekte nerede başladığını bilmesi gerekir. rdx içinde belirttiğiniz uzunluğa ulaşana kadar bu adresteki baytları okur. Gerçek karakterleri sistem çağrısına göndermezsiniz. Onların konumunu gönderirsiniz.
Örnek:
section .data
msg db 'Hello', 0x0a
section .text
mov rsi, msg ; rsi, msg'nin adresini tutarmsg gerçekte nedir:
msg bir etikettir. Assembler onu bir sayıyla değiştirir: 'Hello' string değerinin depolandığı bellek adresi. mov rsi, msg yazdığınızda, bu adres numarasını rsi içine yerleştirirsiniz.
Adresi unutursanız ne olur?
rsi değerini ayarlamazsanız, yazmaç daha önce orada bulunan rastgele veriyi içerir. İşletim sistemi rastgele bir bellek adresinden okumaya çalışır ve bu muhtemelen bir segmentasyon hatasına (çökmeye) neden olur.
write sistem çağrısı içeren eksiksiz ö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 ; string'in adresi
mov rdx, len ; bayt sayısı
syscallGörev
Sana, yeni satırın ardından 'Hi' değerine sahip greeting adlı bir string veriliyor. greeting adresini rsi içine yükleyen kod satırını yaz.
Yalnızca rsi için mov talimatını yaz.
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.
Temel Bilgiler bölümündeki tüm dersler
Kendi başına pratik yap: Assembly playground