MEMORY dan SEGMENTASI Mikroprosesor n bit berarti mikroprosesor tersebut dapat melakukan operasi metematik (operasi logika) yang melibatkan maksimum n bit. Contoh: 8086 adalah mikroprosesor 16 bit, artinya dalam satu waktu dapat mengakses data sebesar 16 bit (1 WORD), 80386 adalah mikroprosesor 32 bit artinya dalam satu waktu dapat mengakses data sebesar 32 bit (1 DOUBLEWORD). Jalur alamat 8086 adalah 20 bit, ini berarti alamat yang dapat diakses adalah 220 = 1048576 alamat (mulai dari alamat 0h sampai FFFFFh). 8086 adalah mikroprosesor 16 bit berarti register-nya (register adalah variable untuk perangkat keras) paling besar berukuran 16 bit (1 WORD). Karenannya untuk mengakses alamat fisik sebanyak FFFFFh tidak dapat digunakan 1 register alamat. Untuk mengatasi kendala tersebut, suatu alamat fisik dipresentasikan oleh 2 register berukuran WORD, yang biasa disebut SEGMENT dan OFFSET. Pengalamatan memori seperti ini disebut segmentasi. Dengan segmentasi pengalsmatan, memory dapat digambarkan menjadi suatu array dua dimensi. Antara segment dan offset keduanya saling independent. Sebuah alamat fisik (0-FFFFFh) dapat dialamatkan menggunakan Segment dan Offset dengan cara: kalikan segment dengan 16 (= 10h = 10000) tambahkan dengan offset, maka didapatkan alamat fisik contoh: FFE23 jika ditulis dalam SEMENT:OFFSET adalah FFE2:0003 atau FFE0:0023 atau FF00:0E23 atau F000:FE23 atau FFE1:0013 atau yang lainnya asalkan memenuhi syarat diatas (SEGMENT*10h + OFFSET = alamat fisik) Mikroprosesor yang ada saat ini (lebih tinggi dari 80386) adalah mikroprosesor 32 bit. Berarti register mikroprosesor x86 berukuran 32 bit, yang biasanya dibagi dalam lowbyte dan highbyte. Stack Memory Stack atau biasa disebut stack register adalah bagian yang amat penting bagi semua mikroprosessor. Stack menjadi penyimpanan data secara sementara (temporary) dan penyimpanan alamat dari procedure atau subrutin. Dalam 8086 ukuran stack adalah word ( 2 byte = 16 bit). Ada dua stack register yaitu : - BP (Base Pointer) - SP (Stack Pointer) Stack memory menggunakan sistem LIFO (Last In First Out) artinya data yang kita simpan terakhir adalah data yang paling pertama akan kita dapatkan. Perintah yang terkait langsung (dengan stack pointer) ini adalah PUSH (untuk menyimpan data) dan POP ( untuk mengakses data). Jadi data yang pertama diPUSH akan menjadi data yang terakhir di-POP, dan begitu sebaliknya. Instruksi PUSH digunakan untuk menyimpan suatu data ke Stack. Contoh: 'PUSH AX' fungsinya "ambil data dari ujung stack dan masukan nilainya ke AX' Perlu diingat bahawa kita tidak dapat mengintruksikan 'PUSH AL' atau 'PUSH BL' karena AL dan BL besarnya 1 byte (bukan 1 word). Salah satu guna stack adalah untuk men-save (menyimpan) suatu register secara sementara, misalnya: PUSH AX IN AL, DX ; AX disimpan dalam stack ; baca port DX dan masukkan nilainya ke AL (disini AX berubah) MOV BX, Ax POP AX ; Simpan hasil pembacaan ke BX ; kembalikan nilai AX Data yang dapat kita simpan ke stack adalah Register 16 bit, Flag dan alamat memory tertentu. Contoh: PUSH DX, PUSH (push flag), POP [2345h] Alamat memory yang digunakan untuk alokasi stack adalah di alamat SS:SP (Stack Segment:Stack pointer) Setiap intruksi PUSH dikerjakan: alamat SS:PP diisikan data yang di-PUSH ke dalam register, flag atau memory (tergantung instruksi), otomatis SP ditambah 2. Perubahan SP sebanyak 2 dikarenakan jenis data yang disimpan dalam stack adalah word (2 byte).