Menu
Coddy logo textTech

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 tutar

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

Gö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
    syscall
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temeller bölümündeki tüm dersler