Instruction Set CPU 8 bit
Register-register
Dalam CPU, register-register digunakan untuk menyimpan data secara sementara. Informasi dapat berupa data byte yang hendak diproses atau sebuah data alamat yang menunjuk pada data yang lain. Register-register dari 8051 pada umumnya adalah berupa register 8-bit. Dalam 8051 hanya ada satu jenis data yakni data 8-bit (sama dengan namanya yakni komputer 8-bit). Register 8-bit tersebut ditunjukkan dalam diagram mulai dari MSB (Most Significant Bit) / D7 sampai pada LSB (Least Significant bit) / D0. Dengan type data 8-bit tersebut, setiap data yang lebih besar dari 8-bit harus dipecah menjadi beberapa bagian data 8-bit sebelum dapat diproses. Mengingat banyak register dalam 8051, kita akan berkonsentrasi pada beberapa register yang paling sering digunakan.
Register yang paling banyak digunakan adalah A (Accumulator), B, R0, R1, R2, R3, R4, R5, R6, R7, DPTR (DataPointer), dan PC (Program Counter). Semua register tersebut adalah register 8-bit kecuali DPTR dan PC. Akumulator atau register A, digunakan dalam semua instruksi aritmatika dan logika. Untuk mengerti penggunaan dari register tersebut, kita dapat melihat mereka dalam konteks dari dua buah instruksi sederhana, MOV dan ADD.
gambar 2-1 Register 8-bit dan 2 buah register 16-bit pada 8051
Instruksi MOV
Singkatnya instruksi MOV adalah menyalin isi data dari register yang satu ke register yang lain, dengan format sebagai berikut :
MOV dest, source ;salin data source ke dest
Instruksi ini memerintahkan pada CPU untuk memindahkan (sebenarnya adalah menyalin) operand source menuju operand destination.Seperti contohnya, "MOV A,R0" adalah menyalin isi R0 ke register A. Setelah instruksi ini dijalankan isi dari kedua register tersebut adalah sama. Instruksi MOV tidak mengubah isi dari operand Source. Program berikut ini adalah contoh untuk mengubah Akumulator menjadi 55h (h adalah hex), lalu kemudian memindahkan nilainya kedalam beberapa register dalam CPU. Perhatikan tanda "#" dalam instruksi tersebut. Hal itu mengindikasikan bahwa simbol dibelakangnya adalah sebuah nilai. Hal tersebut akan kita bahas segera.
MOV A,#55 ;Mengisi A dengan nilai 55h
MOV R0,A ;Salin isi A ke dalam R0
;Sekarang R0 = 55h
MOV R1,A ;Salin isi A ke dalam R1
;Sekarang R1 = 55h
MOV R2,A ;Salin isi A ke dalam R2
;Sekarang R2 = 55h
MOV R3,#95h ;Mengisi R3 dengan nilai 95h
;Sekarang R3 = 95h
MOV A,R3 ;Salin isi R3 ke dalam A
;Sekarang A = 95h
Saat menulis program untuk mikrokontroller 8051, hal-hal berikut ini harus diperhatikan.
1. Bahwa sebuah nilai dapat langsung diberikan pada register-register misalnya A, B, R0 s/d R7. Namun bagaimanapun juga untuk mengindikasikan bahwa sebuah simbol adalah sebagai sebuah nilai, dan bukan sebagai alamat atau yang lain, sebelumnya harus diberi simbol pound ataupagar atau "#".
MOV A,#23h ;Mengisi A dengan nilai 23h
MOV R0,#12h ;Mengisi R0 dengan nilai 12h
MOV R1,#1Fh ;Mengisi R1 dengan nilai 1Fh
MOV R2,#2Bh ;Mengisi R2 dengan nilai 2Bh
MOV B,#3Ch ;Mengisi R3 dengan nilai 3Ch
MOV R7,#9Dh ;Mengisi R3 denga nilai 9Dh
MOV R6,#0F9h ;Mengisi R3 denga nilai F9h
MOV R5,#12 ;Mengisi R3 denga nilai 12 desimal
Perhatikan pada instruksi "MOV R5,#0F9h" sebelum simbol F nampak di sana diimbuhi oleh simbol "0" sehingga menjadi "0F9h". Hal ini penting bagi assembler untuk membedakan apakah sebuah symbol yang dituliskan itu sebagai sebuah angka bilangan atau sebuah identifier. Sedang identifier harus selalu dimulai dari karakter alphabeth.
2. Jika nilai 0 s/d F kita isikan pada sebuah register 8-bit, maka akan mengubah 4-bit paling kecil dari register tersebut. Dan kita akan mendapatkan 4-bit teratas darinya akan dibuat menjadi 0. Misalnya dengan instruksi "MOV A,#5", maka sejatinya instruksi tersebut adalah sama dengan "MOV A,#05h", dan menghasilkan A = 05h. Dan dalam bilangan biner adalah A = 00000101 biner.
3. Mengisikan sebuah nilai yang terlalu besar dari nilai yang sanggup ditampung sebuah register akan menghasilkan error.
MOV A,#7F2h ; 7F2h > (8-bit atau FFh atau 255 desimal)
MOV R2,#456 ; 456d > (8-bit atau FFh atau 255 dec)
4. Untuk mengisikan nilai ke dalam register, kita harus mengimbuhkan symbol pound (#). Jika tidak ada simbol tersebut, maka assembler akan menganggapnya sebagai sebuah lokasi memory. Ambil contoh "MOV A,17h" yang berarti pindahkan isi nilai dari memory 17h ke dalam A. Sedang saat kita menginginkan untuk mengisi A dengan nilai 17h, maka kita harus menuliskan dengan "MOV A,#17h". Tidak adanya symbol pagar tersebut tidak akan membuat assembler menghasilkan error. Namun Assembler akan membuatkan kode yang bukan seperti kemauan kita, hanya karena kesalahan kecil kita dalam menulis program. Biasanya hal ini biasa terjadi bagi para pemula.
Instruksi ADD
Instruksi ADD adalah berdasar pada format :
ADD A,Source ;Tambahakan source ke Akumulator
Instruksi ini menambahkan sembarang tipe data ke dalam A dan A pula bertindak sebagai penerima hasil dari operasi. Sehingga dapat dikata operand tujuan (Dest) selalu adalah Akumulator (A). Di bawah ini contohnya…
MOV A,#25h ;Isi A dengan nilai 25h
MOV R2,#34h ;Isi R2 dengan nilai 34h
ADD A,R2 ;Tambahakan keduanya
;Jadi A = A + R2
Menjalankan program di atas akan menghasilkan A = 59h (25h + 34h = 59h) dan nilai pada R2 tidak berubah setelah instruksi ADD, yakni 34h. Sekali lagi operand source tidak akan berubah. Program di bawah ini adalah contoh program yang lebih kompleks.
MOV R5,#25h ;Isi R7 dengan nilai 25h
MOV R7,#34h ;Isi R5 dengan nilai 34h
MOV A,#0 ;Clear isi A menjadi 0
ADD A,R5 ;Tambahakan A dengan isi R5
;Jadi A = A + R5
ADD A,R7 ;Tambahakan A dengan isi R7
;Jadi A = A + R7
Program di atas menghasilkan nilai 59h yang terdapat pada A. Ada banyak jalan menuju Roma, namun sedapat mungkin cari jalan yang paling singkat dan cepat. Ini adalah cara lebih cepat.
MOV A,#25h ;Isi A dengan nilai 25h
ADD A,#34h ;Tambahakan A dengan 34h
Sekali lagi dapat kita lihat dari berbagai contoh di atas operand tujuan selalu adalah A. Jika kita memaksa menuliskan kode seperti "ADD R2,A" tentu akan menghasilkan error. 8051 memang hanya mendukung operasi arimatika dan logika yang hanya menggunakan A sebagai akumulator, dan dengan kata lain operasi tersebut dibatasi selebar 8-bit. Namun walaupun demikian hal itu sudah lebih dari cukup untuk membuat program untuk berbagai aplikasi canggih, misalnya robot.
Kita tahu bahwa 8051 juga memiliki 2 buah register 16-bit, walaupun dirancang bukan untuk keperluan manipulasi data. Namun jika anda bertanya apakah CPU 8051 dapat memanipulasi data yang lebih besar dari 8-bit?? Tentu saja, tidak ada hal yang tidak mungkin. Seperti yang sudah kita ketahui sebelumnya bahwa komputer 8-bit, idealnya hanya memproses data sampai selebar 8-bit. Dalam kasus tertentu beberapa perintah dalam 8051 dapat diurutkan untuk dapat menangani data yang lebih besar, seperti data 16-bit, 24-bit, maupun 32-bit. Semua bisa dilakukan. Tentu dengan memecah data tersebut dalam beberapa data 8-bit,dan kemudian memprosesnya satu-persatu kemudian menyatukan kembali data sehingga seperti hasil yang kita inginkan. Dalam prakteknya hal itu bisa dilakukan dengan membuat kode-kode yang rumit dan teliti. Dan nantinya akan dibahas pada Bab lain.
SubBab 2.2 Mengenal Pemrograman Assembly 8051
Pada bagian ini kita akan membahas format dari bahasa assembly dan mengupas terminologi yang berkaitan hal yang paling sering digunakan dalam pemrograman bahasa assembly.