Anda di halaman 1dari 26

BAB VII

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.

Beberapa perangkat lunak bahasa rakitan terkenal biasanya menyediakan


tambahan fitur untuk memfasilitasi proses pengembangan program, mengontrol
proses perakitan, dan alat bantu pengawakutuan (debugging).

7.2.2

Mikrokontroler MCS-51

Mikrokontroler yang termasuk dalam keluarga MCS-51 adalah


mikrokontroler 8031 (versi 8051 tanpa EPROM), 8751, dan 8052. Keluarga MCS51 memiliki tipe CPU, RAM, counter/timer, port paralel, dan port serial yang
sama.
Pada awal perkembangannya, mikroprosesor dibuat berdasarkan
kebutuhan aplikasi yang lebih spesifik, dalam hal ini mikroprosesor dibagi
menjadi beberapa jenis, yaitu:
Mikroprosesor RISC (Reduced Instruction Set of Computing) dan CISC
(Complex Instruction Set of Computing). Jenis ini yang digunakan untuk
pengolahan informasi dengan perangkat lunak yang rumit dan digunakan untuk
kebanyakan PC saat ini.
Dalam hal aplikasi, mikrokontroler memiliki karakteristik sebagai berikut:
- Program relatif lebih kecil dari pada program PC
- Konsumsi daya kecil.
- Rangkaian sederhana dan kompak
- Murah, karena komponen yang digunakan sedikit
- Unit I/O yang sederhana, misalnya keypad, LCD, LED, latch.
- Lebih tahan terhadap kondisi lingkungan ekstrim misalnya temperatur,
tekanan, kelembaban dan sebagainya.

Gambar 7.1 Microcontroller MCS-51

Perintah Dasar MCS51


Perintah dasar yang biasa digunakan pada mikrocontroller MCS-51 adalah
sebagai berikut:
Tabel 7.1. Instruksi Arithmatika

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

Tabel 7.2. Instruksi Logika

Mnemonic
ANL
ORL
XRL
CLR
CPL
RL
RLC
RR
RRC
SWAP

Tabel 7.3. Instruksi Data Transfer

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>

Tabel 7.4. Percabangan Program

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

Tabel 7.5. Manipulasi dan Operasi Boolean

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

7.3 Rangkaian Percobaan


7.3.1 Rangkaian Instruksi 8051 dan Delay pada Assembly

Gambar 7.2 Rangkaian instruksi dan Delay pada Assembly

7.4 Langkah Percobaan


7.4.1 Instruksi 8051
1. Menjalankan program Proteus ISIS Professional 8.3 SP2
2. Memilih komponen dan merangkai sesuai Gambar 7.2, komponenkomponen yang dibutuhkan: Microcontroller 8051, 2 buah LED, dan 1
buah push button
3. Menyusun kode program dengan cara meng-klik kanan pada komponen
Microcontroller 8051 > Edit Source Code, kemudian memasukkan kode
berikut:
led1 equ p1.0
led2 equ p1.1
pb equ p2.0
org
jmp
org

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

4. Menjalankan simulasi lalu mengamati hasilnya


5. Mengamati register yang berubah dengan cara mem-pause simulasi sesaat
kemudian membuka menu Debug > 8051 CPU > Registers

6. Mengulangi langkah 4 sampai 6 namun coding diganti dengan variasi kode


berikut ini:
led1 equ p1.0
led2 equ p1.1
pb equ p2.0
org
jmp
org

0000h
Start
0100h

Start:

mov p1, #00000000b


JNB pb,Nyala
SJMP Start

Nyala:
mov p1,#00000101b
JNB pb,Nyala2
SJMP Nyala
Nyala2:
mov p1,#00001010b
JNB pb,loop
SJMP Nyala2
loop:
SJMP Start
END

7.4.2 Delay dengan Bahasa Assembler


1. Menjalankan program Proteus ISIS Professional 8.3 SP2
2. Memilih dan merangkai sesuai Gambar 7.2, komponen-komponen yang
dibutuhkan: Microcontroller 8051, 2 buah LED, dan 1 buah push button

3. Menyusun kode program dengan cara meng-klik kanan pada komponen


Microcontroller 8051 > Edit Source Code, kemudian memasukkan kode
berikut:
Start:
mov p1, #00000000b
JNB pb,Hura2
SJMP Start
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: Mov pb,#04
Hore1: Mov R1,#255
Hore2: Mov R2, #255
Hore3: DJNZ R2, Hore3
DJNZ R1, Hore2
DJNZ R0, Hore1
Ret

4. Menjalankan simulasi lalu mengamati hasilnya


5. Mengamati register yang berubah dengan cara mem-pause simulasi sesaat
kemudian membuka menu Debug > 8051 CPU > Registers

7.5 Data Percobaan


7.5.1 Instruksi 8051
7.5.1.1 Instruksi menggunakan SET BIT dan CLEAR
7.5.1.1.1 Screenshot Simulasi

Gambar 7.3 Simulasi percobaaan Instruksi 8051 SETB dan CLEAR

7.5.1.1.2 Listing Program


led1 equ p1.0
led2 equ p1.1
pb equ p2.0
org
jmp
org

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

7.5.1.2 Instruksi menggunakan MOV


7.5.1.2.1 Screenshot Simulasi

Gambar 7.4 Simulasi percobaaan Instruksi 8051 MOV

7.5.1.2.2 Listing Program


led1 equ p1.0
led2 equ p1.1
pb equ p2.0
org
jmp
org

0000h
Start
0100h

Start:

mov p1, #00000000b


JNB pb,Nyala
SJMP Start

Nyala:
mov p1,#00000101b
JNB pb,Nyala2
SJMP Nyala
Nyala2:
mov p1,#00001010b
JNB pb,loop
SJMP Nyala2
loop:
SJMP Start
END

7.5.2. Delay dengan Bahasa Assembler


7.5.2.1 Screenshot Simulasi

Gambar 7.5 Simulasi percobaaan delay (kondisi awal)

Gambar 7.6 Simulasi percobaaan delay (1 detik setelah tombol ditekan)

Gambar 7.7 Simulasi percobaaan delay (2 detik setelah tombol ditekan)

Gambar 7.8 Simulasi percobaaan delay (3 detik setelah tombol ditekan)

Gambar 7.9 Simulasi percobaaan delay (4 detik setelah tombol ditekan)

7.5.2.2 Listing Program


Start:

mov p1, #00000000b


JNB pb,Hura2
SJMP Start

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

7.6 Analisa dan Pembahasan


7.6.1 Instruksi 8051
7.6.1.1 Instruksi menggunakan SET BIT dan CLEAR
7.6.1.1.1 Penjelasan Listing Program Instruksi menggunakan SET BIT dan
CLEAR
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

0000h ;isi alamat awal 0000h


Start ;memanggil routine start
0100h ;memulai dari alamat 0100h

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

7.6.1.1.2 Flowchart Program Instruksi menggunakan SET BIT dan CLEAR

Gambar 7.10 Flowchart program instruksi menggunakan SET BIT dan CLEAR

7.6.1.1.3 Analisa Screenshot Program

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:

0000h ;isi alamat awal 0000h


Start ;memanggil routine start
0100h ;memulai dari alamat 0100h
; 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
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

7.6.1.2.2 Flowchart Program Instruksi menggunakan MOV

Gambar 7.12 Flowchart program instruksi menggunakan MOV

7.6.1.2.3 Analisa Screenshot Program

Gambar 7.13 Simulasi percobaaan Instruksi 8051 instruksi MOV

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

aCall delay ;memanggil routine delay


Clr led1 ;menghapus bit untuk led1 menjadi 0
setb led2 ;mengeset bit untuk led2 menjadi 1
aCall delay ;memanggil routine delay
mov p1,#00000000b ;memasukkan nilai 00000000b ke p1
aCall delay ;memanggil routine delay
mov p1,#00000011b ;memasukkan nilai 00000011b ke p1
aCall delay ;memanggil routine delay
JNB pb,loop ;saat tombol ditekan panggil routine loop
SJMP Hura2 ;selain itu kembali panggil routine Hura2
loop: ;routine loop
SJMP Start ;kembali ke start
delay: Mov R0,#04 ;memasukkan nilai ke R0
Hore1: Mov R1,#255 ;memasukkan nilai 255d ke R1
Hore2: Mov R2, #255 ;memasukkan nilai 255d ke R2
Hore3: DJNZ R2, Hore3 ;mengurangi nilai sampai ke 0, jika
belum pindahkan Hore3 ke R2
DJNZ R1, Hore2 ;mengurangi nilai sampai ke 0, jika
belum pindahkan Hore2 ke R1
DJNZ R0, Hore1 ;mengurangi nilai sampai ke 0, jika
belum pindahkan Hore1 ke R0
Ret ;kembali ke awal
END ;mengakhiri program

7.6.2.2 Flowchart Program Percobaan Delay

Gambar 7.14 Flowchart program percobaan Delay pada bahasa Assembler

7.6.2.3 Analisa Screenshot Program

Gambar 7.15 Simulasi percobaaan delay (kondisi awal)

Gambar 7.16 Simulasi percobaaan delay (1 detik setelah tombol ditekan)

Gambar 7.17 Simulasi percobaaan delay (2 detik setelah tombol ditekan)

Gambar 7.18 Simulasi percobaaan delay (3 detik setelah tombol ditekan)

Gambar 7.19 Simulasi percobaaan delay (4 detik setelah tombol ditekan)

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

Pada percobaan digunakan frekuensi 12 MHz. Sebagaimana oscillator


internal MCS-51 pada umumnya menggunakan 1/12 dari frekuensi 12 MHz
tersebut, sehingga nilainya sekitar 1 MHz. Dengan begitu setiap periodenya
adalah 1 S. Melihat looping dari program di atas, didapat waktu delay adalah:
Nilai 1 * Nilai 2 * Nilai 3 * Machine Cycle *1s = delay
4 x 255 x 255 x 4 * 1s = 1.040 second
DJNZ merupakan instruksi yang memiliki machine cycle sebanyak 2.
Mengalikan setiap nilai di atas pada tiap register dan menghitung total machine
cycle (Hore 3 tidak dihitung karena me looping dirinya sendiri). Sehingga delay
yang didapat adalah sekitar 1 second. Namun karena pada simulasi waktu berjalan
sangat lambat, waktu delay yang teramati sedikit lebih lama dari perhitungan.

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

hexadecimal pada tiap register pada PORT yang bersangkutan.

Anda mungkin juga menyukai