Percobaan 6
Pengenalan Bahasa Assembly
7.1 Tujuan Percobaan
1. Memahami dasar-dasar pengoperasian microcontroller MCS51
2. Mengetahui instruksi dasar bahasa assembly
3. Memahami penggunaan delay pada bahasa assembly
4. Memahami pengaplikasian sederhana dari bahasa assembly
7.2 Dasar Teori
7.2.1
Bahasa Assembly
Bahasa rakitan atau lebih umum dikenal sebagai Assembly adalah bahasa
pemrograman tingkat rendah yang digunakan dalam pemrograman komputer,
mikroprosesor, pengendali mikro, dan perangkat lainnya yang dapat diprogram.
Bahasa rakitan mengimplementasikan representasi atas kode mesin dalam bentuk
simbol-simbol yang secara relatif lebih dapat dipahami oleh manusia. Berbeda
halnya dengan bahasa-bahasa tingkat tinggi yang berlaku umum, bahasa rakitan
biasanya mendukung secara spesifik untuk suatu ataupun beberapa jenis arsitektur
komputer tertentu. Dengan demikian, portabilitas bahasa rakitan tidak dapat
menandingi bahasa-bahasa lainnya yang merupakan bahasa pemrograman tingkat
tinggi. Namun, bahasa rakitan memungkinkan programmer memanfaatkan secara
penuh kemampuan suatu perangkat keras tertentu yang biasanya tidak dapat
ataupun terbatas bila dibuat dengan menggunakan bahasa pemrograman tingkat
tinggi.
Pada bahasa rakitan, programmer umumnya menggunakan sebuah program
utilitas yang disebut sebagai perakit (bahasa Inggris: assembler) yang digunakan
untuk menerjemahkan kode dalam bahasa rakitan tersebut ke dalam kode mesin
untuk perangkat keras tertentu. Sebuah perintah dalam bahasa rakitan biasanya
akan diterjemahkan menjadi sebuah instruksi mnemonic dalam kode mesin,
berbeda halnya dengan kompiler pada bahasa pemrograman tingkat tinggi yang
menerjemahkan sebuah perintah menjadi sejumlah instruksi dalam kode mesin.
7.2.2
Mikrokontroler MCS-51
Mnemonic
ADD
ADDC
SUBB
INC
DEC
INC DPTR
Deskripsi
Pertambahan
Pertambahan dengan carry
Pengurangan
Penambahan angka 1
Pengurangan angka 1
Penambahan angka 1 pada data
Contoh
ADD A,<source>
ADDC A, <source>
SUBB A, <source>
INC A
DEC A
INC DPTR
MUL
DIV
DA
pointer
Perkalian
Pembagian
Decimal Adjust
MUL AB
DIV AB
DA A
Deskripsi
Gerbang AND
Gerbang OR
Gerbang XOR
0 kan <source>
Komplemenkan <source>
Geser byte <source> ke kiri
Geser byte <source> ke kiri via C
Geser byte <source> ke kanan
Geser byte <source> ke kanan via C
Tuker nibble dari <source>
Contoh
ANL A,B
ORL A,B
XRL A,B
CLR A
CPL A
RL A
RLC A
RR A
RRC A
SWAP A
Mnemonic
ANL
ORL
XRL
CLR
CPL
RL
RLC
RR
RRC
SWAP
Mnemonic
Mov
Mov DPTR
Push
Pop
XCH
Deskripsi
Memindahkan data
Memindahkan data di data pointer
Simpan data ke memori stack
Ambil data dari memori stack
Tukar byte
Contoh
Mov A,B
Mov DPTR, #data16
Push direct
Pop direct
Xch <byte>
Mnemonic
Acall
Lcall
RET
RETI
Ajmp
Sjmp
JZ
JNZ
DJNZ
Deskripsi
Panggil <dest>
Panggil <dest>
Kembali dari subrutin
Kembali dari servis subrutin
Lompat ke alamat <dest>
Lompat ke alamat <dest>
Lompat ke rel bila A=0
Lompat ke rel bila A0
Direct=direct-1, bila 0 lompat
Contoh
Acall addr11
Lcall addr11
RET
RETI
Ajmp addr11
Ljmp addr16
JZ rel
JNZ rel
DJNZ rel
NOP
sejauh rel
No operation
NOP
Mnemonic
clr
Setb
ANL C,bit
ANL C,/bit
ORL C,bit
ORL C,/bit
Deskripsi
0 kan <source>
1 kan <source>
C=C AND bit
C=C AND NOT bit
C=C OR bit
C=C OR NOT bit
Contoh
Clr A
Setb P1
ANL C,bit
ANL C,/bit
ORL C,bit
ORL C,/bit
0000h
Start
0100h
Start:
Nyala:
setb led1
JNB pb,Nyala2
SJMP Nyala
Nyala2:
CLR led1
setb led2
JNB pb,loop
SJMP Nyala2
loop:
SJMP Start
END
0000h
Start
0100h
Start:
Nyala:
mov p1,#00000101b
JNB pb,Nyala2
SJMP Nyala
Nyala2:
mov p1,#00001010b
JNB pb,loop
SJMP Nyala2
loop:
SJMP Start
END
0000h
Start
0100h
Start:
mov p1, #00000000b
JNB pb,Nyala
SJMP Start
Nyala:
setb led1
JNB pb,Nyala2
SJMP Nyala
Nyala2:
CLR led1
setb led2
JNB pb,loop
SJMP Nyala2
loop:
SJMP Start
END
0000h
Start
0100h
Start:
Nyala:
mov p1,#00000101b
JNB pb,Nyala2
SJMP Nyala
Nyala2:
mov p1,#00001010b
JNB pb,loop
SJMP Nyala2
loop:
SJMP Start
END
Hura2:
setb led1
aCall delay
Clr led1
setb led2
aCall delay
mov p1,#00000000b
aCall delay
mov p1,#00000011b
aCall delay
JNB pb,loop
SJMP Hura2
loop:
SJMP Start
Delay:
Hore1:
Hore2:
Hore3:
Ret
Mov pb,#04
Mov R1,#255
Mov R2, #255
DJNZ R2, Hore3
DJNZ R1, Hore2
DJNZ R0, Hore1
Start:
; routine Start
mov p1, #00000000b ;memindahkan nilai #00000000b ke p1
JNB pb,Nyala ;jika pb ditekan panggil routine Nyala
SJMP Start ;jika tidak, panggil kembali routine Start
Nyala:
; routine Nyala
setb led1 ;mengeset bit untuk led1 menjadi 1
JNB pb,Nyala2 ;jika pb ditekan, panggil routine Nyala2
SJMP Nyala ;jika tidak, panggil kembali Nyala
Nyala2:
; routine Nyala2
CLR led1 ;menghapus bit untuk led1 menjadi 0
setb led2 mengeset bit untuk led2 menjadi 1
JNB pb,loop ;memanggil fungsi loop jika pb ditekan
SJMP Nyala2 ;jika tidak, panggil kembali Nyala2
loop:
;routine loop
SJMP Start ;kembali ke Start
END
;akhir program
Gambar 7.10 Flowchart program instruksi menggunakan SET BIT dan CLEAR
Gambar 7.11 Simulasi percobaaan Instruksi 8051 Instruksi SET BIT dan CLEAR
Pada screenshot program terlihat bahwa LED yang aktif adalah LED2 yang
keluar dari PORT1 PIN0, yang juga ditandai dengan register yang aktif adalah P1
dengan nilai 02h dengan biner 00000010b. Sebetulnya ini tidak salah, namun
idealnya ketika tombol ditekan sekali maka yang menyala seharusnya LED1 dari
PORT1 PIN0. Hal ini dikarenakan adanya efek jeda pada push button karena
begitu lambatnya jalan waktu di simulasi, sehingga microcontroller menganggap
2x inputan.
7.6.1.2 Instruksi menggunakan MOV
7.6.1.2.1 Penjelasan Listing Program Instruksi menggunakan MOV
led1 equ p1.0 ;set port1 pin0 sebagai led 1
led2 equ p1.1 ;set port1 pin1 sebagai led 2
pb equ p2.0 ;set port2 pin0 sebagai push button
org
jmp
org
Start:
Nyala:
; routine Nyala
mov p1, #00000101b ;memindahkan nilai #00000101b ke p1
JNB pb,Nyala2 ;jika pb ditekan, panggil routine Nyala2
SJMP Nyala ;jika tidak, panggil kembali Nyala
Nyala2:
; routine Nyala2
mov p1, #00001010b ;memindahkan nilai #00000101b ke p1
JNB pb,loop ;memanggil fungsi loop jika pb ditekan
SJMP Nyala2 ;jika tidak, panggil kembali Nyala2
loop:
;routine loop
SJMP Start ;kembali ke Start
END
;akhir program
Hampir sama dengan Instruksi SET BIT dan CLEAR, pada screenshot
program terlihat bahwa LED yang aktif adalah LED2 yang keluar dari PORT1
PIN0, yang juga ditandai dengan register yang aktif adalah P1 dengan nilai 0A
(nilai binernya 00001010). Sebetulnya ini tidak salah, namun idealnya ketika
tombol ditekan sekali maka yang menyala seharusnya LED1 dari PORT1 PIN0.
Hal ini dikarenakan adanya efek jeda pada push button karena begitu lambatnya
jalan waktu di simulasi, sehingga microcontroller menganggap 2 kali inputan.
7.6.1.3 Perandingan intruksi MOV dan SETB CLR
7.6.2 Delay dengan Bahasa Assembler
7.6.2.1 Penjelasan Listing Program
led1 equ p1.0 ;set port1 pin0 sebagai led 1
led2 equ p1.1 ;set port1 pin1 sebagai led 2
pb equ p2.0 ;set port2 pin0 sebagai push button
org
0000h ;isi alamat awal 0000h
jmp
Start ;memanggil routine start
org
0100h ;memulai dari alamat 0100h
Start:
;mulai program
mov p1, #00000000b ;memasukkan nilai #00000000b ke p1
JNB pb,Hura2 ;jika tombol ditekan panggil rotine Hura2
SJMP Start ;selain itu kembali ke start
Hura2: ;routine Hura2
setb led1 ;mengeset bit untuk led1 menjadi 1
Pada gambar diatas, terlihat bahwa urutan nyala LED akan sesuai dengan
siklus yang terdapat pada program, sesuai kapan push button di tekan. Akan tetapi
untuk timing nyala ataupun mati nya LED tidak bisa persis sama dengan
perhitungan nyata, dikarenakan waktu simulasi pada Proteus yang lebih lambat
daripada waktu nyata.
Delay yang terdapat pada percobaan ini ditentukan oleh suatu perhitungan.
Perhitungan tersebut diambil dari coding pada bagian delay:
Delay:
Hore1:
Hore2:
Hore3:
Mov R0,#04
Mov R1,#255
Mov R2, #255
DJNZ R2, Hore3
DJNZ R1, Hore2
DJNZ R0, Hore1
Ret
7.6 Kesimpulan
1. Pada percobaan istruksi menggunakan SETB dan CLEAR, input dan
output direpresentasikan dalam logika HIGH atau LOW pada tiap port
maupun pin.
2. Pada percobaan instruksi menggunakan MOV, input dan output
direpresentasikan dengan nilai biner, decimal, maupun hexadecimal pada
alamat register yang bersangkutan.
3. Untuk menyalakan LED dengan memberikan logika high pada
PORT_led, baik dengan perintah MOV maupun SETB.
4. Untuk mematikan LED dengan memberikan logika low pada PORT_led,
baik dengan perintah MOV maupun CLR.
5. Pada percobaan instruksi 8051, inputan seringkali dianggap lebih dari
satu kali, hal ini dikarenakan adanya keterlambatan waktu pada simulasi.
6. Pada percobaan delay, perintah delay tidak bisa langsung diinstruksikan
pada program, melainkan harus diakali dengan membuat subroutine yang
berisi looping dan operasi decremental dalam rentangan nilai tertentu.
7. Instruksi DJNZ (decrement and jump if not zero) bekerja dengan
menghitung mundur dari suatu nilai sampai nilai nya menjadi nol.
Perintah ini memiliki machine cycle sebanyak 2.
8. Waktu delay dalam percobaan dapat dihitung dengan menjumlah semua
nilai decremental dikali jumlah total machine cycle. Waktu delay default
nilainya adalah dalam microsecond (S). Waktu delay pada percobaan
adalah 1.04 second.
9. Perbedaan waktu delay perhitungan dan pada simulasi disebabkan karena
jalan waktu di simulasi lebih lambat dari waktu nyata, sehingga terjadi
keterlambatan.
10. Pada percobaan aplikasi sederhana dengan MCS-51, digunakan SETB
dan CLEAR agar mempermudah pengkodingan jika alamat PORT
maupun PIN tidak diketahui. Penggunaan MOV akan mengefisienkan
listing pemrograman asalkan mengetahui nilai maupun posisi PORT dan
PIN dengan tepat.
11. Pada semua percobaan, setiap nyala LED akan sesuai dengan nilai