Awalnya terkesan
sangat sulit untuk memahami cara kerja memori komputer. Tapi, ingat saja, komputer itu hanyalah sebuah kalkulator
raksasa yang memiliki memori sebagai tempat sementara untuk menyimpan hasil
perhitungan. Tempat-tempat ini diberikan indeks nomor (alamat) untuk memudahkan penggunaannya. Bayangkan
saja, prosesor Intel x86 yang banyak digunakan saat ini menggunakan 32-bit
skema alamat. Itu berarti ada 2^32
(4,294,967,296) kemungkinan tempat yang dapat digunakan sebagai tempat
penyimpanan hasil perhitungan tersebut.
Pointer
Pointer merupakan
satu tipe variabel yang khusus, digunakan untuk menyimpan alamat lain dalam memori untuk mereferensi informasi lain.
Karena memori tidak dapat dipindahkan, informasi ini harus dikopi. Akan tetapi akan sangat sulit secara perhitungan untuk
mengkopi satu informasi di dalam memori untuk digunakan di fungsi atau tempat lain. Begitu juga dilihat dari sudut pandang
memori. Karena untuk mengkopi suatu data, maka memori akan membuat satu blok khusus untuk data tersebut, yang
tidak dapat digunakan untuk menyimpan data lain.
Pointer adalah salah satu solusinya. Memori
hanya perlu membuat satu variabel pointer yang diasosiasikan dengan satu blok besar yang menyimpan informasi
tersebut, lalu pointer tersebut dapat
dikopi ke semua fungsi atau tempat yang ingin mengakses blok informasi ini.
Register
Prosesor memiliki
satu jenis memori khusus yang relatif kecil. Memori ini disebut Register, dan
ada beberapa register khusus yang digunakan untuk menjejaki hal-hal ketika
program dieksekusi. Salah satunya adalah EIP, (Extended Instruction Pointer).
EIP merupakan pointer yang menyimpan
alamat dari instruksi yang sedang dieksekusi. Register lain yang digunakan
sebagai pointer adalah EBP (Extended Base Pointer) dan ESP (Extended Stack
Pointer). EBP merupakan pointer yang
menyimpan alamat terakhir (teratas) dari satu segmen memori yang disebut stack,
sedangkan ESP merupakan pointer yang
menyimpan alamat stack frame berikut yang akan dieksekusi.
Deklarasi
Memori
Pada bahasa
pemrograman tingkat tinggi seperti Bahasa C, variabel dideklarasikan
berdasarkan tipenya (seperti: integer,
character, float, dll) masing-masing. Hal ini dilakukan untuk
memberitahukan memori berapa besar ruang yang harus disiapkan untuk menyimpan
variabel tersebut. Misalnya, integer merupakan 4 byte data, yang berarti harus
ada 32 (4 byte x 8 bit/byte) bit ruang kosong di memori yang harus dialokasikan
untuk variabel ini. Contoh lainnya adalah tipe character, yang memerlukan 8 (1
byte x 8 bit/byte) bit ruang.
Sebagai tambahan,
variabel juga dapat dideklarasikan dalam bentuk array (senarai). Array merupakan list (senarai) dari N buah elemen spesifik data. Jadi, sebuah 10
character array hanya merupakan 10
variabel character yang disusun berurutan dalam memori. Array juga disebut
sebagai buffer, dan character array
juga disebut string. Mengkopi buffer
yang berukuran besar memerlukan waktu dan perhitungan yang lama. Karena itu,
pointer sering digunakan untuk menyimpan
alamat memori yang menjadi awal buffer. Berikut adalah contoh
pendeklarasian variabel dalam bahasa pemrograman C:
int variabel_integer;
char variabel_character;
char character_array[10];
char *buffer_pointer;
Little
Endian
Salah satu yang
perlu diingat dalam memori di prosesor x86 adalah urutan penyimpanan 4 byte
data (seperti integer dan pointer) di dalam memori. Urutan ini disebut Little Endian, yang berarti data byte
yang paling kecil disimpan terlebih dahulu.
Misal, sebuah 4
byte data (digambarkan dengan data hexadecimal atau 16 bit), 0×12345678. Data
“12″, “34″, “56″, dan “78″ masing-masing merupakan 1 byte data (pada penulisan
16 bit data, 1 digit angka digambarkan dengan 4 bit). Pada saat disimpan dalam
bentuk Little Endian akan berbentuk seperti berikut: 0×78563412.
Jadi pada
prinsipnya memori itu hanya sebagai tempat penyimpanan sementara. Memori
bekerja dengan menyediakan tempat-tempat yang berupa indeks nomor (alamat)
untuk memudahkan penggunaanya.
Tidak ada komentar:
Posting Komentar