Menu
CoddyTech

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ıyı nereye göndereceğini işletim sistemine bildirdikten sonra (rdi içindeki dosya tanımlayıcısı), ona ne yazdıracağını söylemen gerekir. Bunu, bellekteki dizenin adresini ileterek yaparsın.

Tampon adresi için kullanılan yazmaç rsi'dir.

Tampon nedir?

Tampon, verileri tutan bir bellek bloğudur. Bizim durumumuzda tampon, yazdırmak istediğimiz dizgedir.

Neden değerin kendisi değil de adresi?

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 adresten baytları okur. Gerçek karakterleri sistem çağrısına göndermezsiniz. Konumlarını gönderirsiniz.

Örnek:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi, msg adresini tutar

msg gerçekte nedir:

msg bir etikettir. Assembler bunu bir sayıyla değiştirir: 'Hello' dizgesinin saklandığı bellek adresi. mov rsi, msg yazdığında, bu adres numarasını rsi içine koyarsın.

Adresi unutursanız ne olur?

rsi değerini ayarlamazsanız, yazmaçta önceden orada bulunan rastgele veriler kalır. İşletim sistemi rastgele bir bellek adresinden okumaya çalışır ve bu büyük olasılıkla bir segmentasyon hatasına (çökme) neden olur.

write sistem çağrısıyla eksiksiz örnek:

section .data
    msg db 'Hello', 0x0a
    len equ $ - msg

section .text
    mov rax, 1          ; write sistem çağrısı
    mov rdi, 1          ; stdout
    mov rsi, msg        ; dizgenin adresi
    mov rdx, len        ; bayt sayısı
    syscall
challenge icon

Görev

Sana, değer olarak 'Hi' ve ardından bir yeni satır içeren greeting adlı bir dizge veriliyor. greeting adresini rsi içine yükleyen kod satırını yaz.

Yalnızca rsi için mov yönergesini yaz.

Kendin dene

section .text
    global _start

_start:
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    ; Adres zaten rsi içinde (öğ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