Microcontroller: Bahasa Pemrograman Assembly 8051 Oleh:
Ali Sofyan Kholimi Universitas Muhammadiyah Malang E-Mail / IM:
[email protected] 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 8bit, 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 –
Bahasa Assembly yang menyediakan mnemonics untuk instruksi kode mesin serta fitur-fitur lain dibuat. –
Membosankan, lama, dan mudah mendapatkan error
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 MOV MOV
PSW.4 R0, #99H R1, #85H
;select bank 2 ;RAM location 10H has 99H ;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