Microcontroller: Bahasa Pemrograman Assembly 8051 Oleh: Ali Sofyan Kholimi Universitas Muhammadiyah Malang E-Mail / IM: kholimi@gmail.com Blog: http://kholimi-id.blogspot.com
Tujuan Belajar Mendaftar register dari mikrokontroler 8051 Memanipulasi data menggunakan register dan instruksi MOV Mengkode instruksi sederhana dari bahasa Assembly 8051 Merakit dan menjalankan program 8051 Menjelaskan urutan kejadian yang terjadi pada 8051 sejak dinyalakan Memeriksa program pada kode ROM dari 8051 Menjelaskan peta memori ROM dari 8051 Menjelaskan detail dari eksekusi instruksi bahasa Assembly 8051 Menjelaskan tipe data 8051
Tujuan Belajar Menjelaskan kegunaan dari register PSW (Program Status Word) Mendiskusikan alokasi ruang memori RAM di 8051 Menjelaskan diagram penggunaan stack di 8051
Register Register digunakan untuk menyimpan informasi sementara, sedangkan informasi bisa berupa: byte data yang akan diproses, atau alamat yang menunjuk ke data yang akan diambil Mayoritas register 8051 adalah register 8-bit Hanya ada satu tipe data, 8 bit
Register Register 8 bit register ditampilkan dari MSB D7 hingga LSB D0 Dengan tipe data 8-bit, data apapun yang lebih besar dari 8 bit harus dipecah menjadi potongan 8-bit sebelum diproses
Register Register yang paling banyak digunakan A (Accumulator) Untuk semua instruksi aritmetika dan logika B, R0, R1, R2, R3, R4, R5, R6, R7 DPTR (data pointer), dan PC (program counter)
Instruksi MOV MOV tujuan, sumber menyalin data sumber ke register tujuan. instruksi memberitahu CPU untuk memindahkan (pada kenyataannya, MENYALIN) operand sumber ke operand tujuan.
Instruksi MOV Value (ditandai dengan #) dapat di-load secara langsung ke register A, B, atau R0 R7 MOV A, #23H MOV R5, #0F9H If nilai 0 hingga F dipindahkan ke register 8- bit, sisa bitnya diasumsikan semuanya nol. MOV A, #5 Hasilnya akan A = 05; dalam biner, A = 00000101
Instruksi MOV Memindahkan sebuah nilai yang terlalu besar ke register akan menyebabkan error MOV A, #7F2H ILLEGAL: 7F2H>8 bits (FFH)
Instruksi ADD ADD A, sumber ADD operand sumber ke accumulator Instruksi ADD memberitahu CPU untuk menambahkan byte sumber ke register A dan menaruh hasilnyadi register A Operand sumber dapat berupa register atau data, tapi operand tujuan harus selalu register A ADD R4, A dan ADD R2, #12H adalah invalid karena A haruslah menjadi operand tujuan dari setiap operasi arithmetic
Banyak Jalan Menuju UMM MOV A, #25H ; load 25H into A MOV R2, #34H ;load 34H into R2 ADD A, R2; ;add R2 to Accumulator ;(A = A + R2) MOV A, #25H ;load one operand ;into A (A=25H) ADD A, #34H ;add the second ;operand 34H to A
Struktur Bahasa Assembly Pada masa-masa awal komputer, programmer mengkodekan dengan bahasa mesin yang terdiri dari 0 dan 1 Membosankan, lama, dan mudah mendapatkan error Bahasa Assembly yang menyediakan mnemonics untuk instruksi kode mesin serta fitur-fitur lain dibuat. Sebuah program bahasa Assembly terdiri dari satu seri baris-baris dari instruksi-instruksi bahasa Assembly Bahasa Assembly seringkali disebut sebagai bahasa low-level It melakukan transaksi secara langsung dengan struktur internal CPU
Struktur Bahasa Assembly Instruksi bahasa assembly meliputi: mnemonic (singkatan yang mudah diingat) perintah ke CPU, yang menyatakan hal apa yang harus dilakukan dengan item-item yang ada Kadang diikuti oleh satu atau dua Operand Data yang akan dimanipulasi
Struktur Bahasa Assembly Suatu program bahasa Assembly berupa serangkaian statement Instruksi bahasa Assembly Memberitahukan CPU, apa yang harus dilakukan Directive (atau instruksi-pseudo) Memberikan arahan ke assembler
Struktur Bahasa Assembly Instruksi Bahasa Assembly language terdiri dari empat fields [label:] Mnemonic [operands] [;comment]
Program Counter Program counter menunjuk pada alamat instruksi berikutnya yang akan dieksekusi Sebagaimana CPU mengambil opcode dari ROM program, program counter meningkat untuk menunjuk ke instruksi berikutnya Program counter lebarnya 16 bit Ini berarti bahwa PC dapat mengakses program dengan alamat 0000 hingga FFFFH, total kode 64K byte
Program Counter Semua anggota 8051 dimulai dari alamat memori 0000 ketika dinyalakan Program Counter memiliki nilai 0000 opcode pertama dibakar ke ROM di alamat 0000H, karena ini adalah tempat 8051 mencari instruksi pertama ketika boot Kita bisa mengubahnya dengan statement ORG di source program
ROM Memory Tidak ada anggota keluarga 8051 yang dapat mengakses opcode lebih dari 64K bytes Program counter adalah register 16-bit
Tipe Data mikrokontroler 8051 hanya mempunyai satu tipe data 8 bit Ukuran masing-masing register juga 8 bit Memecahkan masalah data yang lebih besar dari 8 bit (00 sampai FFH, atau 0-255 dalam desimal) adalah tugas para programmer tipe data dapat bernilai positif atau negatif
Directive Assembler direktif DB adalah direktif data yang paling banyak digunakan di assembler digunakan untuk menentukan data 8-bit Ketika DB digunakan untuk mendefinisikan data, bilangan bisa berupa desimal, biner, hex, format ASCII
Directive Assembler ORG (origin) direktif ORG digunakan untuk menunjukkan alamat awal Bilangan setelah ORG bisa berupa hex maupun desimal Jika nomor tidak diikuti oleh H, adalah desimal dan assembler yang akan dikonversi ke hex
Directive Assembler END Sebagai penunjuk kepada assembler akhir dari source file assembler direktif END adalah baris terakhir suatu Program Assembly Artinya bahwa kode apapun setelah direktif END ini diabaikan oleh assembler
Directive Assembler EQU (equate) Digunakan untuk mendefinisikan sebuah konstanta tanpa menempati lokasi memori direktif EQU tidak melakukan penyimpanan untuk item data tetapi lebih pada nilai konstanta dengan menggunakan label data Ketika label muncul dalam program, label akan diganti dengan nilai konstanta
Directive Assembler EQU (equate) Dissumsikan bahwa ada konstanta yang digunakan dalam banyak tempat yang berbeda dalam program, dan programmer ingin mengubah nilai seluruhnya Dengan menggunakan EQU, seseorang dapat mengubahnya sekali dan assembler yang akan mengubah seluruhnya
Program Status Word Register PSW juga disebut sebagai register penanda, adalah sebuah register 8 bit Hanya 6 bit yang digunakan Yang empat adalah CY (carry), AC (auxiliary carry), P (parity), dan OV (overflow) Disebut penanda kondisi, yang berarti bahwa mereka menunjukkan beberapa kondisi yang dihasilkan setelah sebuah instruksi dieksekusi PSW3 dan PSW4 dirancang sebagai RS0 dan RS1, dan digunakan untuk mengubah bank Dua bit yang tidak terpakai dapat didefinisikan oleh pengguna
Program Status Word
Program Status Word
Instruksi Yang Berpengaruh Pada Flag PSW
Alokasi Ruang Memori RAM 8051 memiliki RAM sebesar 128 byte Alamat sudah ditentukan antara 00 sampai 7FH 128 byte tersebut dibagi menjadi tiga kelompok yang berbeda sebagai berikut: Sebanyak 32 bytes dari lokasi 00 sampai 1F disisihkan untuk register bank dan stack Sebanyak 16 byte dari lokasi 20H sampai 2FH disisihkan untuk bit-alamat memori read/write Sebanyak 80 byte dari lokasi 30H sampau 7FH digunakan untuk membaca dan menulis storage, disebut scratch pad
Alokasi Ruang Memori RAM
Register Bank 32 bytes dibagi menjadi 4 register bank di mana masing-masing bank memiliki 8 register, R0-R7 Lokasi RAM 0-7 disisihkan untuk bank 0 dari R0-R7 mana R0 adalah RAM lokasi 0, R1 adalah RAM lokasi 1, R2 adalah RAM lokasi 2, dan seterusnya, sampai memori lokasi 7 yang menunjuk pada R7 bank 0 Jauh lebih mudah untuk merujuk pada lokasi RAM dengan nama-nama seperti R0, R1, dan seterusnya, daripada dengan lokasi memori Register bank 0 adalah default ketika 8051 dinyalakan
Register Bank
Register Bank Kita dapat beralih ke bank lain dengan menggunakan register PSW Bits D4 dan D3 dari PSW digunakan untuk memilih register bank yang dikehendaki Gunakan instruksi bit-addressable SETB dan CLR untuk mengakses PSW.4 dan PSW.3
Register Bank Contoh: SETB PSW.4 ;select bank 2 MOV R0, #99H ;RAM location 10H has 99H MOV R1, #85H ;RAM location 11H has 85H
Stack Stack adalah bagian dari RAM yang digunakan oleh CPU untuk menyimpan informasi sementara Informasi ini dapat berupa data atau alamat
Stack Register yang digunakan untuk mengakses stack disebut register SP (stack pointer) Stack pointer di 8051 lebarnya hanya 8 bit, yang berarti bahwa ia dapat mengambil nilai dari 00 sampai FFH Ketika 8051 diaktifkan, register SP mengandung nilai 07 lokasi RAM 08 adalah lokasi pertama yang mulai digunakan untuk stack oleh 8051
Stack Penyimpanan dari register CPU di stack disebut PUSH SP menunjuk ke lokasi yang digunakan terakhir stack Ketika data di-push ke stack, nilai SP bertambah satu Berbeda dari kebanyakan mikroprosesor
Stack Untuk mengembalikan isi stack kembali ke dalam sebuah register CPU disebut POP Dengan setiap pop, byte bagian atas stack akan disalin ke register yang ditetapkan oleh instruksi dan stack pointer berkurang satu
Stack Contoh: MOV R6, #25H MOV R1, #12H MOV R4, #0F3H PUSH 6 PUSH 1 PUSH 4
Stack
Instruksi CALL CPU juga menggunakan stack untuk menyimpan alamat instruksi hanya di bawah instruksi CALL Ini adalah cara CPU dapat mengetahuo di mana harus resume saat kembali dari subroutine yang dipanggil
Penambahan Nilai Stack Pointer Alasan SP bertambah nilainya setelah push adalah Untuk memastikan bahwa stack tumbuh menuju lokasi RAM 7FH, dari alamat terendah ke teratas Memastikan bahwa stack tidak akan mencapai bagian terbawah dari RAM dan berakibat habisnya ruang stack Jika stack pointer menurun setelah push Kita akan menggunakan lokasi RAM 7, 6, 5, dll milik R7 hingga R0 dari bank 0, bank register default
Konflik Antara Stack dan Bank 1 Ketika 8051 diaktifkan, register bank 1 dan stack menggunakan ruang memori yang sama Kita dapat mengalokasikan kembali bagian lain dari RAM ke stack