Menu
CoddyTech

Alamat buffer (rsi)

Termasuk bagian Dasar-Dasar dalam perjalanan Assembly di Coddy. Pelajaran 37 dari 45.

Dalam syscall write, setelah memberi tahu OS ke mana output harus dikirim (file descriptor di rdi), kamu perlu memberi tahu apa yang harus dicetak. Kamu melakukannya dengan memberikan alamat string di memori.

Register untuk alamat buffer adalah rsi.

Apa itu buffer?

Buffer adalah blok memori yang menyimpan data. Dalam kasus kita, buffer adalah string yang ingin kita cetak.

Mengapa alamat, bukan nilainya sendiri?

Syscall write perlu mengetahui lokasi awal string di memori. Syscall ini akan membaca byte dari alamat tersebut hingga mencapai panjang yang kamu tentukan di rdx. Kamu tidak mengirim karakter sebenarnya ke syscall. Kamu mengirim lokasinya.

Contoh:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi menyimpan alamat msg

Sebenarnya, apa itu msg:

msg adalah label. Assembler menggantinya dengan sebuah angka: alamat memori tempat string 'Hello' disimpan. Saat kamu menulis mov rsi, msg, kamu memasukkan angka alamat itu ke dalam rsi.

Apa yang terjadi jika kamu lupa alamatnya?

Jika kamu tidak mengatur rsi, register berisi nilai sampah apa pun yang tersimpan di sana sebelumnya. OS mencoba membaca string dari alamat tersebut. Jika alamatnya tidak valid, syscall write tidak mencetak apa pun, memasukkan kode error ke rax, lalu programmu melanjutkan dengan instruksi berikutnya. Jika nilai yang tersisa kebetulan merupakan alamat memori yang dapat dibaca, syscall akan mencetak byte apa pun yang tersimpan di sana.

Contoh lengkap dengan syscall write:

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

section .text
    mov rax, 1          ; syscall write
    mov rdi, 1          ; stdout
    mov rsi, msg        ; alamat string
    mov rdx, len        ; jumlah byte
    syscall
challenge icon

Tantangan

Kamu diberi string bernama greeting dengan nilai 'Hi' yang diikuti baris baru. Tulis baris kode yang memuat alamat greeting ke dalam rsi.

Tulis hanya instruksi mov untuk rsi.

Coba sendiri

section .text
    global _start

_start:
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    ; rsi sudah berisi alamat (dari kodemu)
    mov rdx, greetingLen
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dasar-Dasar

Latihan sendiri: Playground Assembly