Alamat buffer (rsi)
Termasuk bagian Dasar-Dasar dalam perjalanan Assembly di Coddy. Pelajaran 37 dari 45.
Pada syscall write, setelah memberi tahu OS ke mana output harus dikirim (file descriptor di rdi), kamu perlu memberi tahu apa yang harus dicetak. Caranya 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 msgApa sebenarnya msg:
msg adalah label. Assembler menggantinya dengan 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 akan berisi nilai sampah yang ada di sana sebelumnya. OS akan mencoba membaca dari alamat memori acak, yang kemungkinan besar akan menyebabkan segmentation fault (crash).
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
syscallTantangan
Kamu diberi string bernama greeting dengan nilai 'Hi' yang diikuti karakter 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
syscallPelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dasar-Dasar
3Instruksi Pertama: MOV
Apa Itu MOV?MOV dengan Nilai LangsungMOV dari Register ke RegisterMOV dari Memori ke RegisterMOV dari Register ke MemoriLEA: Muat AlamatMOV dengan Ukuran BerbedaLatihan: Tukar RegisterUlasan: Tantangan MOV6Syscall write
Syscall write (1)Deskriptor file (rdi)Alamat buffer (rsi)Jumlah byte (rdx)Rangkai SemuanyaCetak Dua stringNewline Itu PentingRingkasan: Penyiapan writeLatihan sendiri: Playground Assembly