Menu
Coddy logo textTech

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 tutar

msg 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ı
    syscall
challenge icon

Gö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
    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