Bahasa Assembler 8051

45
Bahasa Assembler 8051 Dalam menjalankan program, mikrokontroler akan melakukan pembacaan data yang tersimpan dalam memori program (internal atau eksternal). Alamat memori yang harus dibaca disimpan dalma sebuah register yang dinamakan program counter (PC). Data yang terbaca akan diartikan sebagai perintah yang harus dikerjakan oleh mikrokontroler. Perintah ini bias berbebtuk pemindahan data (data transfer), pengolahan data(dta rocessing) atau mengubah alur program (program control). Setelah melaksanakan perintah , mikrokontroler akan memperbaharui isi PC dengan alamat memori selanjutnya. Perintah-perintah mikrikontroler bias dikodekan dalam 1 byte data lebih sehingga mikrokontroler harus bias membaca beberapa byte intruksi sebelum benar-benar mengekskusi sebuah perintah. Kode-kode ini biasanya merupakan data heksadesimal dan dinamakan sebagai bahasa mesin (machine code). Setiap perintah mempunyai kode data yang unik, sebagai contoh Inc A Dikodekan dengan byte 04H,sebuah intruksi 1 byte. Artinya, setiap mikrokontroler membaca data 04H dari memori program, isi regrister A (akumulator) akan ditambah 1. Setelah itu isi PC juga akan ditambah 1 dan mikrokontroler akan melaksanakan intruksi selanjutnya, contoh lain Inc 35H Arti perintah ini adalah mikrokontroler akan menambah 1 nilai RAM internal di alamat 35H. Perintah ini memerlukan 2 byte data, byte pertama adalah byte yang menyatakan perintah untuk menambah nilai RAM internal di sebuah alamat yang dinyatakan dalam byte selanjutnya (dikodekan dengan 35H).Setiap mikrokontroler membaca data 05H artinya mikrokontroler harus menambah 1 nilai yang ada di alamat sebuah RAM internal. Untuk mengetahui alamat RAM yang dimaksud, setelah membaca 05h PC akan ditambah 1 dan mikrokontroler akan membaca nilai, dalam contoh ini . 35H Isi PC pun dinaikan sekali lagi untuk membaca byte perintah selanjutnya.Dalam melaksanakan perintah ini PC dinaikan 2 kali.

Transcript of Bahasa Assembler 8051

Page 1: Bahasa Assembler 8051

Bahasa Assembler 8051

Dalam menjalankan program, mikrokontroler akan melakukan pembacaan data yang tersimpan dalam memori program (internal atau eksternal). Alamat memori yang harus dibaca disimpan dalma sebuah register yang dinamakan program counter (PC). Data yang terbaca akan diartikan sebagai perintah yang harus dikerjakan oleh mikrokontroler. Perintah ini bias berbebtuk pemindahan data (data transfer), pengolahan data(dta rocessing) atau mengubah alur program (program control). Setelah melaksanakan perintah , mikrokontroler akan memperbaharui isi PC dengan alamat memori selanjutnya.

Perintah-perintah mikrikontroler bias dikodekan dalam 1 byte data lebih sehingga mikrokontroler harus bias membaca beberapa byte intruksi sebelum benar-benar mengekskusi sebuah perintah. Kode-kode ini biasanya merupakan data heksadesimal dan dinamakan sebagai bahasa mesin (machine code). Setiap perintah mempunyai kode data yang unik, sebagai contoh

Inc A

Dikodekan dengan byte 04H,sebuah intruksi 1 byte. Artinya, setiap mikrokontroler membaca data 04H dari memori program, isi regrister A (akumulator) akan ditambah 1. Setelah itu isi PC juga akan ditambah 1 dan mikrokontroler akan melaksanakan intruksi selanjutnya, contoh lain

Inc 35H

Arti perintah ini adalah mikrokontroler akan menambah 1 nilai RAM internal di alamat 35H. Perintah ini memerlukan 2 byte data, byte pertama adalah byte yang menyatakan perintah untuk menambah nilai RAM internal di sebuah alamat yang dinyatakan dalam byte selanjutnya (dikodekan dengan 35H).Setiap mikrokontroler membaca data 05H artinya mikrokontroler harus menambah 1 nilai yang ada di alamat sebuah RAM internal. Untuk mengetahui alamat RAM yang dimaksud, setelah membaca 05h PC akan ditambah 1 dan mikrokontroler akan membaca nilai, dalam contoh ini . 35H

Isi PC pun dinaikan sekali lagi untuk membaca byte perintah selanjutnya.Dalam melaksanakan perintah ini PC dinaikan 2 kali.

Keluarga MC-51 dilengkapi dengan intruksi-intruksi untuk memindahkan data (data teranfer), pengolahan data (data processing)

Dan pengendalian program (program control). Setiap intruksi dinyatakan dalam 1 baris asslember, yang terdiri atas setiap kode operasi (operation code/opcode) atau pseudo-operation (pseudo-op) yang diikuti 1 atau lebih operand untuk menyatakan lokasi alamat di memori, regrister atau sebuah konstanta. Opcode adalah sebuah intruksi bahasa assembler unik yang ditulis dalam bentuk mnemonic, misalnya miv atau inc. Sedangkan pseudo-op hamper sama dengan opcode, tetapi tidak akan dicodekan ke dalam bahasa mesin pada saat di-assembler. Misalnya pernyataan yang menyatakan alamat awal program

Org 0000H

Mnemonic org berarti origin, artinya program ini di awali di alamat 0000H. Selain opcode, pseudo-op atau operand, bahasa assembler juga bias mempunyai sebuah label atau catatan (comment). Satu baris bahasa assembler biasa dicontohkan sebagai berikut

Page 2: Bahasa Assembler 8051

Star :

Mov A, #45H ; isi register A dengan 45H

Intruksi ini akan mengisi register A dengan data 45H. Disini, Start adalah label yang pada dasarnya adalah sama dengan alamat awal dari intruksi tersebut. Label berguna dalam intruksi pemanggilan sebuah subrutin dimana label adalah nama dari sebuah subrutin. Sedangkan mov adalah opcode untuk intruksi inidan memiliki dua operand (A dan #45H). Operand pertama, A, menyatakan register tujuan pemindahan data sedangkan operand kedua, #45H, merupakan data yang akan dipindahkan. Tanda pagar (#) menyatakan bahwa 45H adalah sebuah konstanta bukan alamat memori (jilka tidak ada tanda pagar 45H berarti alamat memori). Setelah kalimat tanda titik koma (;) adalah catatan. Biasanya digunakan untuk memberikan catatan terhadan intruksi yang bersangkutan. Assembler 8051 akan mengabaikan setiap kata atau hutuf yang terletak setelah tanda titik komadalam satu baris.

Perhatiakn notasi-notasi yang digunakan untuk operand:

1. Rn adalah satu register R0 – R7 dari bank register yang aktif

2. Direct adalah alamat 8 bit RAM internal (00H – FFH) atau SFR

3. @Ri adalah alamat 8 bit RAM internal (00H – FFH) atau SFR yang ditunjukan oleh R0 atau R1

4. #data adalah konstanta 8 bit (1 byte)

5. # data 16 adalah konstanta 16 bit (2 byte)

6. Addr16 adalah 16 bit alamat tujuan yang dipakai oleh intruksi ajmp, ljmp dan lcall. Alamat ini bias di mana saja dalam daerah 64 KB memori program.

7. Addr11 adalah 11 bit alamat tujuan yang dipakai oleh intruksi ajmp dan acall. Alamat ini harus berada dalam blok 2 KB yang sama.

8. Rel adalah alamat relative, dipakai oleh intruksi sjmp dan semua intruksi lompat persyarat. Alamat ini akan berada 128 byte sebelum intruksi yang sekarang atau 127 byte setelahnya.

9. Bit adalah alamat bit dari RAM yang bias dialamati per bit (20H – 2 FH) atau SFR yang bias diakses per bit.

PEMINDAHAN DATA

MCS-51 memiliki intruksi-intruksi pemindahan data yang sangat berguna dan bisa digunakan untuk memindahkan data byte atau bit. Sumber atau tujuan bisa berupa data konstanta, register fungsi khusus (SFR) atau alamat di memori data atau program (internal maupun eksternal).

Bagian penting dari konsep pemindahan data MCS-51 adalah mode-mode pengalamatan yang dimilikinya. Kode pengalamatan merupakan cara bagaimana byte atau bit sumber dan tujuan ditentukan. Sebagai contoh, dalam sebuah operasi pemindahan data, byte data sumber bias tersimpan dalam sebuah register, RAM internal, memori program dan memori data eksternal.

Page 3: Bahasa Assembler 8051

Sementara byte alamat sumber bias dituliskan langsung sebagai bagian dari intruksi assembler atau disimpan dalam sebuah register.

Intruksi Pemindahan Data

Mode Bentuk Perintah Keterangan

Segera

(Immediate)

mov A, #data Simpan 1 byte data konstanta kre A

mov Rn, #data Simpan 1 byte data ke RN (n=0,1,2,…7) dari bank register yang aktif

mov direct,#data Simpan 1 byte data ke Ram Internal/SFR

mov DPTR, #data16 Simpan konstanta 16 bit ke DPTR

Langsung

(Direct)

mov A, direct Isi A dengan RAM/SFR

mov direct, A Isi RAM/SFR dengan A

mov direct, direct Isi RAM/SFR dengan

register

mov A, Rn Isi A dengan R0 – R7

mov Rn, A Isi R0 – R7 dengan A

mov direct, Rn Isi RAM/SFR dengan R0 – R7

mov Rn, direct Isi R0 – R7 dengan RAM/SFR

Tak Langsung

(Indirect)

mov A, @Ri Isi A dengan RAM yang ditunjukan oleh R0 atau R1

mov @Ri, A Isi RAM yang ditunjukan oleh R0 atau R1 dengan A

mov direct, @Ri Isi RAM/SFR dengan RAM yang ditunjukan oleh R0 atau R1

mov @Ri, direct Isi RAM yang ditunjukan oleh R0 atau R1 denagn RAM/SFR

mov @Ri, #data Isi RAM yang ditunjukan oleh R0 atau R1 dengan konstanta

movx A, @DPTR Baca alamat RAM eksternal di DPTR dan simpan di A (16 bit alamat)

movx @DPTR, A Kirim A ke RAM eksternal di DPRT (16 bit alamat)

movx A, @Ri Baca RAM eksternal di alamat R) atau R1

Page 4: Bahasa Assembler 8051

dan simpan di A (8 bit alamat)

movx @Ri, A Kirim A ke RAM eksternal di R0 ( 8 bit)

Berindeks

(indexed)

movc A, @A+DPRT Baca byte data dari memori program dengan alamat awal di DPTR dan alamat offset di A. data disimpan di A.

movc A, @A+PC Baca byte data dari memori program dengan alamat awal di PC dan alamat offset di A. data disimpan di A.

Operasi Stack push direct Simpan RAM/SFR di alamat stack (SP)

pop direct Ambil RAM/SFR yang tersimpan di stack

Pertukaran Data

(Data Exchange)

xch A, Rn Pertukaran A dengan R0 –R7

xch A, direct Pertukaran A dengan RAM/SFR

xch A, @Ri Pertukaran A dengan RAM yang ditunjukan oleh R0 atau R1

xchd A, @Ri Pertukaran nibble rendah A dengan RAM yang ditunjukan oleh R0 atau R1

Operasi bit mov C, bit Isi bit C (carry) dengan bit di RAM/SFR

mov bit, C Isi bit RAM/SFR dengan C

MCS-51 memiliki 5 mode pengalamatan:

1. Pengalamatan segera (immediate)

2. Pengalamatan langsung (direct)

3. Pengalamatan register

4. Pengalamatan tak langsung (indirect)

5. Pengalamatan berindeks (indexed)

Selain mode-mode pengalamatan tersebut di atas (yang semuanya menggunakan mnemonic mov, movx atau movc). MCS-51 juga memiliki intruksi pemindahan data berorientasi memori stack (stack oriented)dan pertukaran data (data exchange)antarregister serta pemindahan data beorienterasi bit. Tabel 4.1 memperlihatkan rangkuman intruksi pemindahan data.

MODE PENGALAMATAN SEGERA

Page 5: Bahasa Assembler 8051

Mode pengalamatan segera (immediate addressing mode) adalah mode pengalamatan di mana byte sumber dinyatan sebagai sebuah konstanta dalam baris bahasa assembler, sedangkan tujuan bias sebuah bank register (R0 –R7),SRF atau sebuah alamat RAM internal. Sebagai contoh

org 0000h ; alamat awal program

mov A, #45H ; isi register A dengan 45H

mov PSW, #0 ; pilih bank register 0

mov R1, #07 ; isi R1 dengan 7 (decimal)

mov PSW, #8 ; pilih bank register 1

mov R1, #07 ; isi R1 dengan 7 (decimal)

mov 3 0H, #0AH ; isi register 3 0H denagn 0 AH

end ; akhir program

Program mempunyai awal 0000H. Program diawali dengan memberi register A dengan data 45H kemudian akan memberi register PSW dengan 0,artinya akan memiliki bank register ke-0 (RS1,RS0 = 0). Selanjutnya register R1 akan diisi dengan data 7 (decimal). R1 akan berada di alamat 01H di RAM internal (karena register bank yang aktif saat itu adalah bank register ke-0, yang beralamat 00H – 07H). Kemudian program akan memilih bank register ke-1 dengan mengisi PSW dengan data 8 (RSI=0, RS0=1)dan mengisi r1 dengan data 7. Sekarang R1 berada di alamat 09H di RAM internal.Perintah selanjutnya adalah mengisi register yang beralamat di 30H dengan data 0AH. Alamat 30H adalah sebuah alamat di RAM internal. Baris terakhir program (end) menyatakan akhir dari program ini. Assembler MCS-51 mengharuskan pernyataan end di akhir program.

MCS-51 juga memiliki sebuah intruksi untuk pemindahan data 16 bitke register SFR yang berpasangan, dalam hal ini register DPTR. Sebagai contoh

mov DPTR, 34578H

perintah ini akan mengisi DPRT dengan data 4578H atau sama dengan mengisis DPH dengan 45H dan DPL dengan 78H. Perintah ini sama dengan perintah

mov DPH, #45H

mov DPL, #78H

tetapi hanya memerlukan satu baris perintah.

MODE PENGALAMATAN LANGSUNG

Mode pengalamatan langsung (direct addressing mode) adalah pemindahan data antarregister(baik RAM internal maupun SFR). Data sumber disimpan di sebuah register (RAM internal maupun SFR). Misalnya:

Mov A, 70H

Page 6: Bahasa Assembler 8051

Mov 90H, A

Intruksi pertama akan mengisi register A denagn data yang tersimpan di alamat 70H (RAM internal), kemudian data di register A akan dikirimkan ke register SFR yang beralamt 90H. Alamat SFR 90H adalah alamat untuk Port 1. Pada kedua intruksi tersebut, data yang akan dipindahkan disimpan di sebuah register (register 70H dan akumulator).

Dalam pemograman assembler, RAM internal bias dinyatakan dengan langsung menuliskan alamatnya seperti dicontohkan oleh program di atas atau dengan mendeklarasikan sebuah variable menggunakan pseudo-op equ (equal atau sama dengan). Penulisan langsung akan membuat listing program “susah dibaca”; selain itu, apabila karena sesuatu hal alamat harus diganti maka semua alamat RAM tersebut harus diganti satu persatu. Dengan menggunakan variable, program lebih mudah dipahami dan seorang progremer biasanya lebih mudah mengingat sebuah sebuah kata daripada sebuah alamat memori. Jika akan mengganti alamat RAM, cukup dengan mengganti deklarasinya saja.

My_Byte equ 70H

Org 0000H

Mov A, My_Byte

End

Baris pertama program di atas adalah pendeklarasian bahwa My_Byte adalah sebuah alamat RAM, dalam hal ini 70H. Program ini akan membaca datayang ada di My_Byte atau alamat RAM 70H dan menyimpannya di akumulator (register A). Jika alamat My_Byte akan diganti , cukup dengan mengubah pendeklarasiannya, missal

My_Byte equ 71H

Alamat My_Byte akan berubah menjadi 71H.

SFR juga dinyatakan seperti RAM internal (denan menggunakan) alamatlangsung atau pendeklarasian) atau juga menggunakan notasi atau symbol yang telah bdidefinisikan oleh 8051 (symbol-simbol SFR bias dilihat di table 2.2). cara yang terakhir lebih banyak digunakan. Contoh:

My_Byte equ 70H

Port1 equ 90H

Org 0000H

Mov A, My_Byte

Mov P1,A

Mov Port1, A

End

Page 7: Bahasa Assembler 8051

Dua perintah terkhir memili arti yang sama, bedanya perintah terakhir memerlukan pendeklarasian bahwa Port1 mempunyai alamat 90H.

MODE PENGALAMATAN REGISTER

Mode pengalamatan register (register addressing mode) adalah pemindahan data di mana sumber atau tujuan adalah salah satu dari 8 register dari bank register yang aktif (R0 – R7). Sebagai contoh

Org 000H

Mov PSW, #0

Mov R), a

Mov R7, A

Mov B, R7

End

Program di atas diawali dengan memilih bank register 0 sebagai bank register yang aktif. Kemudian isi akumulator akan dibaca dan disimpan di register R0 dan R7. Selanjutnya, isi register R7 akan digandakan ke register B.

MODE PENGALAMATAN TAK LANGSUNG

Mode pengalamatan atk langsung (indirect addressing mode) adalah mode pengalamatan di mana alamat sumber atau tujuan tidak dinyatan secara eksplisit. Mode pengalamatan ini menggunakan register R0 atau R1 sebagai register untuk menyimpan alamat sumber atau tujuan. Simbol @ ditulis di depan R0 atau R1 untuk menyatakan bahwa register ini menyimpan alamat sumber atau tujuan pemindahan data. Sebagai contoh

My_Byte1 equ 70H

My_Byte2 equ 71H

Org 0000H

Mov My_Byte1, #0 EH

Mov R0, #My_Byte1

Mov R1, #My_Byte2

Mov A, @R0

Mov @R1, A

End

My_Byte1 dan My_Byte2 adalah alamat di memori 70H dan 71H. Program diawali dengan memberi konstanta 0EH ke register My_Byte1. Kemudian register R0 menyimpan konstanta My_Byte1 (70H)

Page 8: Bahasa Assembler 8051

dan R1 akan menyimpan konstanta My_Byte2 (71H). R0 akan menyimpan alamat register sumber pemindahan data. Baris intruksi selanjutnay, yang merupakan mode pengalamatan tak langsung, akan meminadahkan data dari alamat yang ditunjukan oleh register My_Byte1 akan dipindahkan ke akumulator. Baris terakhir prigram akan memindahkan data akumulator ke alamat yang ditunjukan oleh register R1, yaitu My_Byte2.

Dari contoh program diatas terlihat, register R0 dan R1 (perlu diingat hanya 2 register ini yang bias dipakai) menyimpan alamat sumber dan tujuan pemindahan data. Oleh karena itu, dalam mode ini alamat sumber dan tujuan bias dilihat sebagai sebuah konstanta. Dengan memanipulasi isi register R0 atau R1 (dengan menambah atau mengurangi misalnya), mode ini bias dipakai untuk memindahkan data yang berulang-ulang dengan alamat sumber dan tujuan berurutan. Program cukup mendefinisikan alamat awal dan menyimpannya di R0 atau R1. Kemudian saat program berjalan, R0 atau R1 ditambahkan satu sampai alamat akhir. Program er harus memperhatikanalamat awal ini agar pada saat dijalankan, pemindahan data tidak sampai menimpa alamat memori yang menyimpan informasi penting, misalnya alamat stack yang menyimpan alamat kembali setelah perintah call.

Mode pengalamatan tak langsungjuga bergunqa untuk mengaksesRAM internal tambahan AT89S52. Seperti yang telah dijelaskan pada Bab 3, RAM internal tambahan menempati alamat yang sama dengan alamat-alamat SFR. Pengalamatan langsung, pada alamat yang sama,akan mengakses SFR, sedangkan pengalamatan tak langsung akan mengakses RAM internal tambahan. Perhatikan basis program di bawah ini.

Mov 90H, #45H

Mov R1, #90H

Mov @R1, #45H

Intruksi pertama adqalah pengalamatan langsung. Perintah ini akan memindahkan konstanta 45H ke register 90H, dalam hal ini alamat SFR untuk P1. Intruksi terakhir adalah mode pengalamatan tak langsung. Perintah ini akan mengirim konstanta 45H ke alamat yang ditunjukan oleh R0(dalam hal ini 90H). Perintah ini tidak akan mengirim data ke P1, tetapi akan mengirimdata ke alamat RAM internal tambahan di alamat 90H. Ingatlah untuk menggunakan mode pengalamatan tak langsung untuk mengakses Ram internal tambahan AT89S52.

Selain untuk memindahkan data antarmemori-internal (SFR atu RAM), mode pengalamatan tak langsung juga bias digunakan untuk pemindahan data antar-akumulator dan memori data (RAM) eksternal. Mnemonik yang digunakan adalah movx. Perhatikan contoh program berikut

Org 0000H

Mov A, #45

Mov DPRT, #0000H

Movx @DPRT, A

Mov DPRT, #1234H

Page 9: Bahasa Assembler 8051

Movx A, @DPRT

End

Byte data yang akan dikirimkan disimpan di akumulator, sedangkan alamat memori eksternal disimpan di DPRT (0000H). Perintah selanjutnya adalah mengirimkan data yang disimpan di register A ke alamat memori eksternal yang tersimpan di DPRT. Dua perintah terakhir adalah perintah untuk membaca data dari memori eksternal. DPRT akan menyimpan alamat 1234H.

Data yang tersimpan di alamat ini akan dibaca dan disimpan di A. Perhatikanlah bahwa perintah movx akan mengaktifkan pin P3.6 dan P3.7 sebagai sinyal kendali tulis (WR) atau baca (RD). Oleh karena itu, kedua pin ini tidak bias digunakan sebagai pin IO multiguna pada saat mengakses memeori eksternal. Begitu pual dengan P0 dan P2 karena port ini digunakan sebagai bus data dan bus alamat.

Selain DPRT, register R0 atau R1 bisa digunakan untuk membaca memori eksternal melalui perintah movx. Misalnya program di atas bias diganti dengan program sebagai berikut

Org 0000H Mov A, #45

Mov R0, #0

Mov P2, #0

Movx @R0, A

Mov R0, #34H

Mov P2, #12H

Movx A, @R0

End

R0 atau R1 hanya menyimpan alamat orde rendah (A0 – A7), sedangkan orde tinggi (A8 – A 15) dikirimkan secara langsung ke P2. Apabila alamat orde tinggi tidak dikirimkan (karena memori atau perangkat luar hanya memerlukan 8 bit alamat), P2 bisa digunakan sebagai port output karena mikrokontroler akan mempertahankan data sebelumnya.

MODE PENGALAMATAN BERINDEKS

Mode pengalamatan berideks dipakai untuk membaca byte data atau konstanta yang tersimpan dalam memori program dan menyimpannya di akumulator. Alamat memori program yang berisi byte data yang akan dibaca disimpan di dalam DPRT atau PC. Alamat ini adalah alamat dasar (base address) karena alamat yang sesungguhnya didapat dengan menjhumlahkan DPRT atau PC denagn isi akumulator (alamat offset). Intruksi yang digunakan adalah movc dengan format intruksi

Movc A, @A+DPRT

Atau

Page 10: Bahasa Assembler 8051

Movc A, @+PC

Dalam bahasa assembler terdapat pernyataan untuk mendefinisikan konstanta dalam memori program. Pernyataan ini adalah db (define byte). Konstanta ini misalnya digunakan untuk menyimpan data yang akan digunakan untuk menyimpan data yang akan ditampilkan melalui LCD atau menyimpan data untuk mengubah bilanagn menjadi data display 7 segmen. Sebagai contoh

db 0C0H

db 0F9H

db 0A4H

db 0B0H

db 099H

db 092H

db 082H

db 0F8H

db 080H

db 090H

pendefinisian data di atas adalah pendefinisian data untuk mengubah angka 0 sampai 9 menjadi data display 7 segmen sebelum dikirimkan ke sebuah port denagn PX.0 dihubungkan ke segmen a sampai PX.6 dihubungkan denagn segmen g. Angka 0 akan dikonversi menjadi 0C0H dan angka 9 menjadi 90H.

Segment_Converter:

mov DPRT, #0100H

movc A, @A+DPRT

ter

org 0100H

db 0C0H

db 0F9H

db 0A4H

db 0B0H

db 099H

db 092H

Page 11: Bahasa Assembler 8051

db 082H

db 0F8H

db 080H

db 090H

Program di atas adalah sebuah subrutin yang akan mengkonversi angka decimal menjadi data display 7 segmen (dengan nama subrutin Segment_Converter). Misalnya jika register menyimpan angka 3, DPRT akan diisi oleh alamat awal data pendifisian data. Ketika perintah move dieksekusi. DPRT akan menyimpan 0103H (0100+0003H) sehingga dqata yang terbaca adalah 0B0h.

Jika PC yang digunakan program di atas akan menjadi

Segment_Converter:

inc A

movc A, @A+PC

ret

db 0C0H

db 0F9H

db 0A4H

db 0B0H

db 099H

db 092H

db 082H

db 0F8H

db 080H

db 090H

Perbedaan yang terlihat adalah, PC tidak diisi denagn alamat awal pendefisisan data tetapi dengan mengambil nilai PC yang sekarang. Perintah move dikodekan 1 byte dalam bahasa mesin (baik menggunakan DPRT atau PC). Perintah inc A diperlukan untuk menaikan isi register A ini karena asa intruksi ret sebelum pendefinisian data. Jika register A menyimpan angka 3 maka setelah dinaikan menjadi 4 oleh perintah inc, perintah movc akan membaca data di alamat perinath movc ditambah 4 (dalam hal ini menjadi 0B0H). Pendefinisian data atau disebut table data denagn menggunakan PC harus tepat setelah intruksi ret, sedangkan jika menggunakan DPRT, table data bias diletakan di mana saja dalam area program memori.

Page 12: Bahasa Assembler 8051

PEMINDAHAN DATA BERORIENTASI STACK

Pemindahan data beroerientasi stack adalah mode pemindahan data dengan SFR SP(stack pointer) sebagai register sumber dan tujuan. Intruksi yang digunakan adalah push dan pop. Perintah push akan menyimpan data ke SP (SP sebagai tujuan), sedangkan perintah pop akan mengambil data dari SP (SP sebagai sumber). SP akan ditambahkan dengan 1 setelah perintah push dan dikurangi 1 setelah perintah pop. Setelah reset SP akan menyimpan data 07H sehingga alamat awal yang dipakai adalah 08H, tetapi alamat awal bisa dimodifikasi oleh program. Seorang programmer harus berhati-hati dalam menemukan alamat awal SP. Oleh karena SP akan menempati alamat RAM internal, maka jika penempatan alamat awal salah, operasi stack bias mengakibatkan menimpa alamat RAM yang menyimpan data penting.

Pada dasarnya operasi SP menggunakan metode penaglamatan langsungmenggunakan semua register SFR dan RAM internal (termasuk SP sendiri). Khusus untuk akumulator, notasi yang digunakan harus ACC. Perintah push dan pop tidak mengenal notasi A. Sebagai contoh

Push ACC

Push A

Perintah kedua akan mengakibatkan assembler 8051 membangkitkan pesan kesalahan.

Contoh program operasi SP

Org 000H

mov SP, #2FH

mov A, #45H

push ACC

mov B, #0

pop B

end

Alamat awal SP ditentukan di alamat 2FH. Register A akan menyimpan data 45H. Kemudian perintah push diekskusi sehingga data yang sekarang disimpan di A akan disimpan di memori SP (dalam hal ini alamat 30H). Instruksi berikutnya akan menyimpan konstanta 0 ke register B. Perintah pop akan mengambil data di alamat SP (30H) dan menyimpannya ke register B. Alamat SP kemudian akan menjadi 2FH.

Operasi SP adalah operasi untuk menyimpan data sementara untuk kemudian diambil kembali. Operasi ini biasanya dipakai rutin pelayanan interupsi (ISR). Sebagai contoh program berjalan sekarang menggunakan register A. kemudian interupsi eksternal diaktifkan sehingga program akan melompat ke ISR. Di dalam ISR, register A, DPRT dan register B digunakan untuk sebuah operasi aritmatika. Agar data register A, DPRT, dan register B yang lama tidak tertimpaoleh data yang baru

Page 13: Bahasa Assembler 8051

maka di awal ISR, isi register-register tersebut harus disimpan di dalam SP untuk dibaca kembali setelah seluruh intruksi di ISR dieksekusi. Contoh programnya

Org 0013H ; vector interupsi eksternal 1

Externall_ISR:

Push ACC ; simpan data akumulator

Push DPH ; simpan data DPTR orde tinggi

Push DPL ; simpan data DPTR orde rendah

Push B ; simpan data register B

INSTRUKSI

Pop B ; ambil kembali data register B

Pop DPL ; ambil kembali data DPL

Pop DPH ; ambil kembali data DPH

Pop ACC ; ambil kembali data akumulator

Reti ; rutin interupsi berakhir

SP , sesuai namanya, adalah tumpukan data. Menyimpan data di SP artinya membuat tumpukan data dari alamat awal SP. Untuk mengambil kembali tumpukan tersebut, harus dimulai dari tumpukan paling atas, artinya data paling akhir disimpan ke SP. Oleh karena itu, perlu diperhatikan agar perintah pop dimulai dengan register yang paling akhir disimpan, dalam contoh di atas adalah register B, diikuti DPL, DPH dan ACC

PERTUKARAN DATA

Salah satu bentuk pemindahan data yang lain adalah pertukaran data (data exchange) secara langsung antara akumulator dengan register yang lain tanpa harus menggunakan register tambahan. Perhatikan contoh program dibawah ini

Mov A, #45H

Mov B, #34H

Mov R0, A

Mov A, B

Page 14: Bahasa Assembler 8051

Mov B, R0

Program di atas akan menukarkan isi register A dengan register B, data register A akan dipindahkan ke register B dan sebaliknya. Program ini menggunakan register R0 sebagai register untuk menyimpan sementara data register A.

Dengan menggunakan operasi pertukaran data, penggunaan R0 bisa dihilangakan. Keluarga 8051 mengenal 2 perintah pertukaran data yaituperintah xch (semua byte) dan xchd(hanya nibble rendah). Perintah xch akan menukarkan data akumulator denagn SFR,Ram internal, salah satu dari 8 register (R0 – R7) atau dengan alamat RAM yang ditunjukan oleh register R0 atau R1. Sedangkan xchd merupakn perintah pertukaran data dengan register-register yang ditunjukan oleh R0 atau R1 (tak langsung0, tetapi hanya untuk nibble bawah (bit 0 – bit 4). Perhatikan contoh program di bawah ini yang merupakan perubahan dari program di atas.

Mov A, #45H

Mov B, #34H

Xch A, B

Penggunaan R0 dihilangkan dengan perintah xch. Perhatiakn juga contoh program di bawah ini

Mov A, #45H ; simpan 45H di A

Mov B, #23H ; simpan 23H di B

Mov R0, #0 ; simpan 0 di R0

Mov R1, #3 0H ; simpan 3 0h di R1

Mov 3 0H, #0DH ; simpan 0 DH di alamat 3 0H

Xch A, B ; tukarkan isi data A dengan B

Xch A, R0 ; tukarkan isi data A denagn R0

XCh A, @R1 ; tukarkan isi data A dengan alamat

Xch A, @R1 ; tukarkan nibble bawah A dengan

; nibble bawah alamat yang ada di

;R1

PEMINDAHAN DATA BERORIENTASI BIT

Selain pemindahan data dalam ukuran byte, seperti yang telah dijelaskan sebelumnya, bahasa assembler 8051 juga mengenal operasi pemindahan data dalam bentuk bit. Seperti diketahui, 8051 memiliki SFR yang bias dialamati per bit. RAM internal yang beralamat di 20H – 2FH juga bias dialamati per bit.

Page 15: Bahasa Assembler 8051

SFR_SFR yang bias dialamati per bit adalah SFR yang mempunyai alamat nibble rendah 0 atau 8. Sebagai contoh Port 1 (P1) mempunyai alamat 90H, karena 90H nibbleadalah 0, maka P1 bisa dialamati per bit. Mengakses bit bias dilakukan dengan beberapa cara, yaitu dengan menggunakan notasi P1.n (dengan n = 0…7) atau dengan menggunakan alamat bit secara langsung. Alamat bit ke-0, 1 ,2, …7) adalah 90H, 91H, 92H, …97H. Alamat 90H bias sebagai alamat P1 pada operasi byte atau sebagai alamat P1.0 pada operasi bit.

Untuk mengakses bit SFR yang lain bias juga seperti halnya mengakses P1 atau dengan menggunakan definisi bit yang telah didefinisikan oleh assembler 8051. Sebagai contoh, untuk mengakses bit carry di PSW bias denagn notasi PSW.7 atau cukup dengan notasi C. Untuk akumulator notasi yang dipakai adalah ACC.0, ACC.1, …, ACC.7.

RAM internal yang bias dialamati per hit (alamat 20H – 2 FH) memiliki alamat

8 x (I – 20H) +j, dengan I = 20H, 21H, …, 2FH, dan j = 0, 1,…, 7

Sebagai contoh bit ke-2 RAM 23H akan memiliki alamat

8 x (23H – 20H) + 2 = 1AH

Dari persamaan di atas, bias didapatkan bahwa bit yang beralamat n adalah bit ke-j dari register I, di mana

J = n -8 (I – 20H), dengan n = 0, 1, …, 7FH

Int adalah integer (bilangan bulat). Sebagqai contoh bit yang beralamat di 65H, maka

= 2CH

Sehingga bit yang beralamat di 65H adalah bit ke-5 dari RAM 2Ch.

Tabel 4.2 memperlihatkan alamat-alamat bit dari RAM internal 20H – 2 FH.

Selain dengan menggunakan alamat seperti ditunjukan tabel, alamat RAM 20H – 2Fh bias diakses dengan menggunakan pernyataan equ, misalnya

Page 16: Bahasa Assembler 8051

My_Flag equ 20H

LED_Flag equ My_Flag. 0

Motor_Flag equ My_Flag. 1

My_Flag adalah RAM internal yang beralamat di 20H, sedangkan LED_Flag dan Motor_Flag adalah definisi bit ke-0 dan ke-1 dari regisre My_Flag. LED_Flag dalam program akan memiliki alamat yang sama dengan 20H.0 dan 20H.1 atau alamat bit 00H dan 01H.

Pada dasarnyqa alamat yang bias diakses per bit bias dibaca dan dipindahkan ke alamat bit yang lain, walaupun ada beberapa operasi bit yang tidak diizenkan oleh assembler 8051. Sebagai contoh

Mov 20H.0, C

Mov TI, C

Mov TI, 20H.0

Mov 20H.0, TI

Dua perintah terakhir akan menimbulkan pesan error oleh assembler 8051.

Perhatikan contoh program di bawah

LED_CTRL equ P!>!

My_Flag equ 20H

LED_Fleg equ My_Fleg.0

Org 0000H

Mov C, P1.0

Mov LED_Flag, C

Mov LED_CTRL, C

End

Program di a tas mengasumsikan 2 buah saklar yang terhubung ke P1.0 untuk menyalakan sebuah LED yang terhubung ke LED_CTRL (P1.1). RAM internal yang beralamat di 20H digunakan untuk menyimpan status LED dan definisikan sebagai LED_Flag(bit ke-0)

PENGOLAHAN DATA

Mikrokontroler 8051 memiliki sebuah unit arimatika dan logika (ALU) yang berfungsi untuk melakukan pengolahan data (data processing) melalui operasi-operasi arimatika dan logika. Oleh karena itu, 8051 dilengkapi dengan intruksi-intruksi untuk melakukan penngolahan data yang dibqagi menjadi 2, yaitu intruksi-intruksiarimatika dan intruksi-intruksi logika.

Intruksi-intruksi arimatika digunakan untuk melakukan operasi-operasi arimatika seperti, penjumlahan, pengurangan, dan p[erkalian. Sedangkan intruksi-intruksi logiak digunakan untuk melakukan operasi-o[perasi logika, seperti perkalian digital(intruksi AND) atau penjumlahan digital (OR).

Page 17: Bahasa Assembler 8051

INTRUKSI-INTRUKSI ARIAMTIKA

Intruksi-intruksi arimatika digunakan untuk melakukan operasi-operasi arimatika seperti, penjumlahan, pengurangan, dan perkalian. Tabel 4.3 merangkum intruksi-intruksi 8051 yang tergolong intruksi arimatika.

Tabel 4.3 Intruksi-intruksi arimatika

Instruksi Bentuk Intruksi Keterangan

add A,Rn Penjumlahan isi register R0 – r2 dengan isi akumulator, hasil disimpan di akumulator

add A, direct Penjumlahan isi register A dengan RAM internal/SFR

add A, @Ri Penjumlahan isi register yang ditunjukan oleh R0 atau R1 denagn A

add A, #data Penjumalahn konstanta denagn A

Addc A, Rn Penjumlahan isi register R0 –R7 denagn isi akumulator dimana bit carry C ikut dijumlahkan, hasil disimpan di akumulator

Addc A, direct Penjumlahan isi register A dengan RAM internal/SFR. Bit C ikut dijumlahkan

Addc A, @Ri Penjumlahan isi register yang ditunjukan oleh R0 atau R1 denagn A. Bit C ikut dijumlahkan

Addc A, #data Penjumlahan konstanta dengan A. bit C ikut dijumlahkan

Penguranaan Subb A, Rn Pengurangan A oleh R0 – R7. Hasil disimpan di A

subb A, direct Pengurangan A oleh RAM/SFR

subb A, @Ri Penguranagn A oleh register tak langsung yang ditunjukan oleh r0 atau R1

subb A, #data Pengurangan A oleh konstanta

Perkalian mul AB Perkalian register A dengan B. hasilnya adalah bilangan 16 bit, byte orde rendah disimpan di A sedangkan byte orde tinggi

Page 18: Bahasa Assembler 8051

disimpan di B

Pembagian div AB Pembagian register A dengan B. hasil pembagian disimpan d A, sedangkan B akan menyimpan sisa pembagian

Penaikan

(increment)

inc A Naikan register A sekali

inc Rn Naikan register R0 – R7 sekali

iInc direct Naikan RAM/SFR sekali

inc @Ri Naikan isi RAM internal/SFR yang ditunjukan oleh R0 atau R1 sekali

inc DPRT Naikan isi DPRT sekali

Penurunan

(decrement)

dec A Turunkan register A sekali

dec Rn Turunkan register R0 – R7 sekali

dec direct Turunkan Ram/SFR sekali

dec @Ri Turunkan isi RAM internal/SFR yang ditunjukan oleh R0 atau R1 sekali

Pengaturan desimal da A Pengaturan register A, ketika pengolahan data BCD

INTRUKSI PENJUMLAHAN

Ada 2 perintah untuk operasi penjumlahan, yaitu add dan addc. Perintah pertama adalah perintah penjumlahan dengan tidak mengikutsertakan bit bawaan (C = carry), sedangkan perintah kedua merupakan perintah penjumlahan dengan mengikutsertakan bit C dari hasil operasi sebelumnya.kedua perintah ini menggunakan akumulator sebagai operand pertama (operand pertama selalu akumulator), sedangkan operand kedua bias sebuah konstanta, salah satu register R1 – R7 dari bank register yang aktif, alamat di RAM internal atau SFR, atau alamat RAM tak langsungyang ditunjukan oleh R0 atau R1. Hasil penjumlahan selalu disimpan di akumulator.

Bit-bit PSW yang dipengaruhi oleh perintah ini adalah bit C (carry). AC (auxiliary carry), dan bit OV (overflow). Bit C akan di-set jika hasil melebihi FFH dan di-reset kalau sebaliknya. Bit AC akan di-set jika penjumlahan menghasilkan bawaan (carry) dari nibble rendah ke nibble tinggi, yaitu bawaan dari 3 ke bit 4, dan di-resset jika sebaliknya. Bit AC berguna dalam penjumlahan bilangan BCD. Sedangkan bit OV akan di-set jika ada bi7 tetapi tidak dari bit 6, atau ada bawaan dari bit 6 tetapi tidak bit 7. OV berguna dalam penjumlahan bilangan bertanda (positif atau negatif)di mana bit 7 dipakai sebagai bit yang menandakan tanda positif atau negative. Ada 2 keadaan yang bias mengeset OV. Pertama, jika hasil penjumlahan antara 2 bilangan positif melebihi 7FH tetapi kurang dari FFH, hasilnya, dalam notasi komplemen 2, terlihat sebagai bilangan negative. Ov akan di-set untuk menandakan bahwa hasil penjumlahn bukan bilangan negative. Keadaan yang kedua , penjumlahan 2 bilangan negative akan selalu menghasilkan bit carry eksternal. Jika hasil penjumlahan tersebut berada

Page 19: Bahasa Assembler 8051

diantara 0 dan 7FH(100H dan 17FH denagn carry eksternal), maka OV akan di-set untuk menandakan bahwa hasil penjumlahan bukan bilangan positif.

Perhatikan contoh program perintah add berikut.

org 0000H ; simpan 1 di A, A=1

mov A, #1 ; simpan 1 di A, A=1

add A, #2 ; tambahkan A denagn 2, A=3

mov R7, #2 ; simpan 2 di R7

add A, R7 ; tambahkan A denagn R7, A=5

mov 45H, #2 ; simpan 2 di alamat 45H

add A, 45H ; tambahkan A denagn alamat 45H, A=7

mov R0, #45H ; simpan 45 di R0

add A, @R0 ; tambahkan A denagn RAM yang ditunjukan oleh r0, A=9

end

perintaaaah addc (penjumlahan denagn carry), biasanya berguna untuk menjumlahkan bilangan lebih dari 8 bit, Misalnya X and Y adalah 2 bilangan bulat 16 bit denagn XL dan YL menyatakan byte rendah kedua bilangan dan XH dan YH menyatakan byte tinggi kedua bilangan. Contoh program berikut akan menjumlahkan bilanagn X dan Y. XL, Xh, Yl dan YH dinyatakan sebagai alamat RAM internal . Hasil penjumlahan akan disimpan sebagai bilangan Z, dengan ZL dan ZHmenyatakan byte rendah dan tinggi bilangan Z.keduanya juga dinyatakan sebagai alamat RAM.

XL equ 30H

XH equ 31H

YL equ 32H

YH equ 33H

ZL equ 34H

ZH equ 35H

org 0000H

mov XH, #12H ; X=1234H

mov XL, #34H

mov YH, #12H ; Y=12EFH

mov YL, #0EFH

mov A, XL ;jumlahkan byte rendah

add A, YL

Page 20: Bahasa Assembler 8051

mov ZL, A ; simpan hasil di ZL

; ZL = 34H+0EFH

; =23H

; C=1

mov A, XH ; jumlahkan byte tinggi

addc A, YH ; bit C juga ikut dijumlahkan

mov ZH, A ; ZH = 12H+12H=C

; = 25H

End ; hasil akhir Z=2523H

Misalnya X = 1234H dan Y = 12EFH, maka XL = 34H, XH = 12H, YL = EFH dan YH = 12H.Pertama jumlahkan byte rendah kedua bilangan, hasilnya simpan sebagai byte rendah hasil(ZL). Berdasarkan hasil penjumlahan ini bit carry akan di-set atau tidak, dalam contoh program bit C akan di-set (34H + EFH = 123h, 1 adalah carry). Kemudian jumlahkan byte tinggi kedua bilangan denagn mengikutsertakan carry dari hasil penjumlahan byte rendah.

INTRUKSI PENGURANGAN

Operasi pengurangan menggunakan perintah sub. Seperti ahlanya operasi penjumlahan, perintah sub menggunakan akumulatorsebagai operand pertama, sedangkan operand kedua bias sebuah konstanat, salah satu register R0 – R7 dari bank register yang aktif, alamat di RAM internal atau SFR, atau alamat RAM tak langsung yang ditunjukan oleh R0 atau R1. Hasil pengurangan selalu disimpan di akumulator.

Dalam operasi pengurangan, bit carry (C) akan selalu diikutsertakan, dengan kata lain perintah subb adalah operasi pengurangan akumulator oleh bit carry dan alamat atau data yang ditunjukan oleh operand kedua. Artinya jika bit C di-set sebelum perintah subb, hasil pengurangan akan dikurangi 1. Bit Cakan di-set jika operasi pengurangan membutuhkan pinjaman (borrow) eksternal. Bit C ini bisa digunakan dalam operasi pengurangan bilangan bulat lebih besar daripada 256, bilanagn 16 bit misalnya. Prosesnya dilakukan seperti halnya penjumlahan 16 bit, kurangkan dulu byte rendah kemudian kurangkan byte tingginya. Namun karena bit C selalu diikutsertakan pastikan bit C ini di-reset dahului sebelum proses penguranagn pertama (byte rendah). Hal ini bisa dilakukan denagn menggunakan perintah berorientasi bit

clr C

Bit AC dan OV juga akan terpenagruh oleh perintah sub. Bit AC akan di-set jika diperlukan pinjaman untuk nibble rendah ( bit 3), sedangkan bit OV akan di-set kalau diperluakn pinjaman untuk bit 7. Bit OV berguna saat bekerja denagn bilangan bulat bertanda yang dinyatakan dalam komplemen 2.]

Perhatiakan contoh program berikut

org 0000H

clr C ; nol-kan bit C

mov A, #10 ; simpan 10 di A, A=10

subb A, #2 ; kurangkan A dengan 2, A=8

Page 21: Bahasa Assembler 8051

clr C

mov R7, #2 ; simpan 2 di R7

subb A, R7 ; kurangkan A dengan R7, A=6

clr C

mov 45H, #7 ; simpan 7 di alamat 45H

subb A, 45H ; kurangkan A denagn alamat 45H,

; A=FFH → C akan di-set

mov 45H, #1 ; simpan 1 di alamat 45H

mov R0, #45H ; simpan 45 di R0

subb A, @R0 ; kurangkan A denagn Ram yang ditunjukan oleh R0, A=FD, C di-reset

end

Perhatikan 5 baris progar m terakhir. Hasil perintah sebelumlnya A akan menyimpan bilangan ^ dan bit C bernilai nol. Kemudian A akan dikurangi oleh isi alamat 45H (bilangan 7). Penguranagn ini akan menghasilkan bilangan FFh dan bit C akan di-set (karena membutuhakn pinjaman eksternal). Selanjutnya A akan dikurangi lagi oleh alamat 45H melalui pengalamatan tak langsung (45H menyimpan bilanagn 1). Hasilnya adaklah FE, namun karena bit C sebelumnya di-set, maka hasil akhir adalah FDH.

Perhatikan program penguranagn bilanagn 16 bit berikut

XL equ 30H

XH equ 31H

YL equ 32H

YH equ 33H

ZL equ 34H

ZH equ 35H

org 0000H

mov XH, #12H ; X=1234H

mov XL, #34H

mov YH, #11H ; Y=1135H

mov YL, #35H

clr C

mov A, XL ; Kurangkan byte rendah

subb A, YL ; XL – YL = 34H – 35H

Page 22: Bahasa Assembler 8051

mov ZL, A ; ZL = FFH → C akan di-set

mov A, XH ; Kurangkan byte tinggi

subb A, YH ; XH - YH = 12H – 11H =1

mov ZH, A ; hasil akhir karena C di-set

; ZH = 1-1 =0

; X-Y = 1234H – 1135H = 00FFH

Dalam program di atas, X=1234H akan dikurangi Y=1135H. Kedua bilanagn ini dinyatakan dengan 2 byte, masing-masing XH dan XL untuk bilanagn X dan YH dan YL untuk bilangan Y. Pertama byte rendah bilangan X(XL=34H), sebelumnya bit C di-reset. Hasilnya adalah FFH dan disimpan di ZH denagn bit C di-set. Selanjutnya byte tinggi yang dikurangi. Hasilnya adalah 00H (karena C di-set). Hasil akhir penguranagn adalah 00FFH.

Intruksi PerkalianKeluarga 8051 hanya mengenal satu perintah perkalian, yaitu

Mul AB

Perintah ini akan mengalihkan bilanagn yang tersimpan di register A (8 bit) denagn bilanagn yang tersimpan di register B (juga 8 bit). Hasilnya adalah bilanagn 16 bit; A akan menyimpan byte orde rendah, sedangkan B akan menyimpan byte orde tinggi. Hasil perkalian tidak akan melebihi FFFFH (karena FFHxFFH = FE01H), sehingga bit C tidak pernak di-set. Bit OV akan di-set kalau hasil perkalian melebihi 00FFH,dalam hal ini register B menyimpan data bukan 0. Perhatiakan contoh berikut

mov A, #1

mov B, #2

mul ABHasil program di atas adalah, A akan menyimpan bilanagn 2 sedangkan B akan menyimpan bilangan 0. Bit OV tidak di-set.

mov A, #0FFH

mov B, #2

mul AB

Hasilnya A akan menyimpan FEH dan B menyimpan 1. Bit OV akan di-set.

Intruksi Pembagian

Bahas aassambler 8051 juga hanya mengenal satu perintah pembagian

Div AB

Perintah ini akan membagi bilanagn yang tersimpan di register A denagn bilanagn yang tersimpan di register B. Register A akan menyimpan hasil pembagian, sedangkan sisa pembagian akan disimpan di register B. Jika B

Page 23: Bahasa Assembler 8051

menyimpan bilangan 0. Maka pembagian akan menghasilkan bilangan yang tidak terdefinisi, pada keadaan ini bit OV akan di-set.

mov A, #7

mov B, #2

div AB

Hasil program di atas A akan menyimpan bialnagn 3 dan B menyimpan bilanagn 1.

Intruksi Kenaikan Dan Penurunan

Intruksi penaikan (increment) dan penurunan (decrement) memungkinkan untuk menaikan atau menurunkan isi bank register. SFR atau alamat Ram internal (langsung atau tak langsung) secara langsung tanpa melalaui akumulator terlebih dahulu. Intruksi ini sama dengan penjumlahan atau pengutranagn dengan bilanagn satu dengan tidak melibatkan bit carry.

Bentuk perintahnya adalah inc untuk menaikan dan dec untuk penurunan, misalnya

mov A, #4

mov R7, #45

mov 30H, #6

mov R0, #3 0H

inc A

inc R7

inc 3 0H

inc 2R0

Program ini akan membuat A menyimpan bilangan 5, R7 menyimpan 45,

Sedangakn alamat RAM 30H akan menyimpan 8, karena dinaikan 2 akli, denagn pengalamatan langsung dan tak langsung. Contoh intruksi dec tinggal mengganti mnemonic inc dengan dec.

Perintah inc juga mengijinkan untuk menaikan isi DPRT, perhatikan contoh program berikut

Mov DPRT, #1234H

Inc DPRT,

Hasilnya DPRT akan menyimpan data 1235H. Assembler 8051 tidak mengenal perintah dec DPRT.

Perinath inc dan dec berguna dalam pencacah loop ataupenunjuk ke data, misalnya dalam pengiriman 2 byte data yang tersimpan di RAM melalui port serial. R0 dipakai sebagai penunjuk RAM(penaglamatan ytak langsung).

Sedangkam R7 dipakai sebagai pecacah loop. Contoh programnya

org 0000H

Page 24: Bahasa Assembler 8051

mov R0, #3 0H

mov R7, #20

loop1:

mov A, @R0

mov SBUF, A

jnb TI, $

inc R0

djnz R7, Loop1

end

Data yang akan dikirim mempunyai alamat awal 30H. Denagn pengalamatan tak langsung,data yanga akn dikirim dipindahkan ke akumulator untuk kemudian dikirim ke port serial (melalui pregister SBUF). Perintah jnb (jump if no bit) digunakan untuk mengecek apakah pengiriman selesai atau belum.

Sedangkan perintah djnz (decrement and jump if no zero) digunakan unyuk mengecek apakah ke-20 b yte belum terkirim , R0 akan dinaikan sehingga akan memperlihatkan alamat RAM yang akan dikirim selamjutnya.

Intruksi Pengaturan Desimal

Intruksi penagturan decimal (decimal adjust) berguna dalam memproses (operasi penjumlahan) bilangan BCD (binery coded decimal). Dalam bilangan BCD, setiap nibble akan melambangkan digit decimal, sehingga setiap nibble akn mempunyai nilai 0...9. misalnya 2 bilangan BCD 12 dan 19 dalam BCDakan dilambangkan sebagai 12H dan 19H. Penjumlahan kedua bilanagn (denagn add atau addc tanpa bit carry) akan menghasilkan bilanagn 2BH.

Bilanagn 2BH bukan bilanagn BCD karena Bh melebihi bilangan 9, sehingga diperlikan wsebuah pengaturan. Penagturan ini dilakukan dengan mengurangkan nibble rendah akan bernilai (BH – 10 =1) dan nibble tinggi akan bernilai (2+1=3). Jadi hasil akhir adalah 31H.

Intruksi penagturan decimal (mnemonic) da) menyederhanakan proses penagturan diatas denagn menambahkan 6 ke nibble rendah atau 06H ke byte hasil (2Bh+6=31H). Pengaturan juga dilakukan jika jumlah kedua nibble rendah melebihi 16. Intruksi da memndeteteksi keadaan ini berdasarkan kenyataan bahwa bit AC akan di-set jika intruksi add atau addc menghasilkan carry dari bit 3 ke bit 4. Selain itu, jika penjumlahan nibble tinggi melebihi 9, perintah da akan menambahkan 6 ke nibble tinggi atau menambahkan 60H ke byte hasil. Denagn demikian intruksi penagturan desimal bisa dipandang sebaga.i penambahan 0, 6 60H atau 66H ke akumulator, bergantung apda isi akumulator dan PSW. Perhatiakn contoh program berikut

org 0000H

mov A, #12H

mov B, #19H

add A, B

da A

Page 25: Bahasa Assembler 8051

end

Setelah intruksi add, akumulator akan menyimpan 2BH (bukan bilangan BCD). Denagn intruksi da, akumulator akan menyimpan bialnagn BCD yang benar, yaitu 31H. Perhatiak contoh program berikutnya

org 0000H

mov A, #55H

mov B, #66H

add A, B

da A

end

Setelah intruksi add, akumulator akan menyimpan BBh (juga bukan bilanagn BCD). Karena penjumlahan nibble tinggi sama-sama melebihi 9, maka intruksi da akan menambahkan 66H ke hasil penjumlahan, swhingga hasil akhir adalahBBH+66H=121H. Akumulator akan menyimpan 21H dan bit C akan di-set.

Intruksi da tidak bisa mengubah bilangan heksadesimal ke bilanagn decimal secara langsung.

INTRUKSIIINTRUKSI LOGIKA

Intruksi logika adalah intruksi yang akan melakuakn operasi-operasi logika seperti, logika AND, OR, eksklusif-OR (XOR). Operasi komplemen akumulator, memutar bit akumulator, dan operasi swap juga termasuk ke dalam operasi logika ini. Operasi logika bisa digunakan untuk data berbentuk byte atau bit. Tabel 4.4 merangkum intruksi-intruksi logika ini.

Tabel $4.4 Intruksi-intruksi logika

Intruksi Bentuk Intruksi Keterangan

Logika AND

(byte)

anl A, Rn AND-kan isi akumulator denagn salah satu register (R0 – R7)

anl A, direct AND akumulator denagn RAM internal/SFR

anl A, @Ri AND-kan A denagn register yang ditunjukan R0 atau R1

anl A, #data AND-kan A denagn konstanta

anl direct, A AND-kan RAM/SFR denagn A. hasil disimpan di RAN/SFR

Anl direct, #data AND-kan RAM/SFR dengan konstanta

Logika AND

(bit)

orl A, Rn OR-kan A dengan salah satu register (R0 – R7)

orl A, direct OR-kan A dengan RAM/SFR

Page 26: Bahasa Assembler 8051

orl A, @Ri OR-kan A dengan R0 atau R1

orl A, #data OR-kan A denagn konstanta

orl direct, A OR-kan RAM/SFR dengan A

orl direct, #data OR-kan RAM/SFR dengan konstanta

Logika OR

(bit)

orl C, bit OR-kan C dengan bit (RAM/SFR)

orl C, /bit OR-kan C dengan komplemen bit (RAM/SFR)

Logika XOR

(byte)

xrl A, Rn XOR-kan A dengan salah satu register (R0 – R7)

xrl A, direct XOR-kan A dengan RAM/SFR

xrl A, @Ri XOR-kan A dengan register yang ditunjukan R0 atau R1

xrl A, #data XOR-kan A dengan konstanta

xrl direct, A XOR-kan A RAM/SFR dengan A

xrl direct, #data XOR-kan A RAM/SFR dengan konstanta

Komplemencpl A Komplemenkan Akumulator

Cpl C Komplemenkan C

Cpl bit Komplemenkan bit

Putar

(Rotar)

rl A Putar A ke kiri 1 bit

cpl A Putar A ke kiri 1 bit melalui carry

rr A Putar A ke kanan 1 bit

rrc Putar A ke kanan 1 bit

Swap swap A Swap (tukarkan) nibble rendah denagn nibble tinggi akumulator

Clear crl A Clear (nol-kan) akumulator

crl bit Clear (reset) bit

crl C Clear (reset) C

Operasi Set bit setb C Set c

Page 27: Bahasa Assembler 8051

setb bit Set bit

Intruksi ANG, OR, dan XOR

Intruksi AND< OR< dan XOR akan melakukanoperasi logika and,or, dan xor (eksklusive or). Opersi ini melakukan 2 operand yang bisa berupa byter atau bit (semua intruksi bisa berlaku untuk bit kecuali intruksi XOR). Pada mode byte, intruksi-inrtuksi ini menangani bit-birt operand pertama denagn op[errand kedua, perhatikan contoh berikut

mov A, #34H

anl A,#12H

Program ini akan meng-AND-kan akumulator dengan konstanta 12h (yaitu 34H AND12H), dalam biklangan biner dinyatakan sebagai

Denagn neng-AND-kan antar-bit, hasilnya adalah 10H. Tidak ada bit PSW yang terpenaruh.

Perhatikan contoh lain di bawah ini

org 000H

mov R7, #0FH

mov A, #76H

anl A, R7

mov 30H, #34H

orl A, 3 0H

mov 31h, #12H

mov R0, #31H

xrl aA< @R0

anl 30H, A

orl 31H, #0FH

end

Register R7 dan akumulator masing-masing menyimpan 0FH dan76H.

Page 28: Bahasa Assembler 8051

Akumulator di-AND-kan dengan R7, hasilnya akumulator akan menyimpan 06H.

Perhatikan,denagn di-AND-kan denagn 0FH, isi register menjadi 06H, artinya nibble tinggi “dipaksa” menjadi 0 sedangkan nibble rendah tidak berubah. Selanjutnya register 30H akan menyimpan 34h DAN AKUMULATOR DI-OR-kan denagn register 30H. hasilnya akumulator akan menyimpan 36H.

Baris perintah selanjutnya akan menyimpan data 12H di register 31H dan R0 dipakai untuk menyimpan 30H sebagai almat tak langsung. Akumulator akan di-XOR –kan dengan alamt 31H secara tak langsung melalui R0, hasilnya akumulator akn menyimpan 24H. Register 30H akn di-AND-kan dengan akumulator , hasilnjya register 30H akn menyimpan 0FH, hasil register 31H akn menyimpan 1FH.

Untuk mode bit(hanya berlaku untuk intruksi AND dan OR), C selalu menjadi operand pertama, sedangkan operand kedua adalah SFR atuau RAM yang bisa diamati per bit. Misalny

anl C, ACC. 0

orl C, /ACC. 0

Baris pertama akan meng-AND-kan bit C denagn bit ke-0 akumulator, sedangkan baris kedua akn meng-OR-kan bit C dengan komplemen dari bit ke-0 akumulator.

Intruksi putar

Intrukisi putar (rotate) akan memutar isi akumulator 1 bit ke kiri atau ke kanan . Pemutaran ini bisa dengan atau tanpa melalui bit carry. Intruksi putar ini hampir sama dengan operasi register geser, bedanya bit yang diputar akan menjadi bit baru yang masuk, jika diputar ke kanan bit ke-0 (LSB) akan menjadi bit ke-7 (MSB) dan jika diputar ke kiri bit ke-7 (MSB) akan nmenjadi bit ke-0 (LSB). Jilka diputar melalui carry, bit yang diputar akan menempati bit carry, sedangkan bit carry akan menjadi bit baru. Perhatikan contoh program berikut , asumsi bit carry awalnya 0.

mov A, #000111001b

rr A

rl A

rrc A

rlc A

Program dimulai dengan men.kyimpaan data 00111001B (39). Kemudian perintah putar ke kanan akan membuat register A menjadi 10011100B(9CH), lalu dipurat ke kiri sehingga data kembali menjadi 00111001B (39). Program selanjutnya adalah memutar akumulator melalui carry ke kanan, bit carry akan di-set, sedangkan A akan menyimpan 00011100B (1CH). Perin tah terakhir akan memutar A ke kiri melallui carry, sehingga A akan menyimpan 00111001B (39) dan bit carry 0.

Page 29: Bahasa Assembler 8051

Perintah putar bisa dipakai untuk mengirim data rep bit (serial). Perhatikan contoh berikut. Isi akumulator akan dikirim melalui P1.0 secara serial denagn data dikirim MSB dahulu, untuk itu A harus diputar ke kiri melalui carry, bit carry-lah yang akan dikirim ke P1.0. R1 bertindak sebagai pencacah (8 bit) sampai semua bit A terkirim.

org 0000H

mov A, #45H

mov R7, #8

Loop1

rlc A

mov P1.0, C

djnz R7, Loop1

end

Komplemen, Swap, Clear, dan Set Bit

Intruksi komplemen adalah intruksi untuk menngkomplemenkan akumulator (dalam bit), C atau alamat bit (dalam bit). Bit-bit yang bernilai 1 akan diubah menjadi 0 dan sebaliknya, 0 diubah menjadi 1.Perhatiakn contoh program berikut

mov A, #1111000B

cpl A

cpl ACC. 0

Setelah di-komplemen-kan isi A akan menjadi 0000111B, dan bit ke-0 akan menjadi 0.

Intruksi swap akan menuka nibble rendah dengan nibble

Tinggi akumulator. Intruksi ini sama dengan register A diputar 4 kali (kea rah manapun tanpa melalui carry). Contohnya

mov A, #45H

swap A

Setelah perintah swap, A akan memnjadi 54H.

Perintah clear akn membuautu akumulator atau alamat bit menjadi nol.

Perintah ini sama denagn memberikan konstanta 0 ke akumulator.

Contohnya

mov A, #45H

clr A

Page 30: Bahasa Assembler 8051

mov A, #01H

clr ACC.0

Setelah perintah clear, akumulator akan menjadi 0. Perintah terakhir adalah meng-clear bit ke 0 register A.

Perinath set bit akn mengeset sebuah bit (kebalikan perintah clr).

Contohnya

setb C

clr A

setb ACC. 0

Setelah perintah terakhir, C akan di-set dan A menjadi 01H(bit ke-0 di-set)

PENGATURAN ALUR PROGRAM

Dalam sebuah aplikasi, mikrokontroler mungkin tidaka akn mengerjakan perintah secra berurutan, tatapi akan berpindah dari subrutin yang satu ke yang alinnya bergantung pada data yang terbaca. Misalnya mikrokontroler yang dipakai sebagai pengendali pemanas ruang akan mengerjakan hal yang berbeda, menghidupkan pemanas atu mematikan tergantung padapenagtuaarn suhunya. Mikrokontroler akn mengidupkan pemanas jika suhu ruanagn terukur daru suhu yang diinginkan dan akan mematikannyja jika suhu ruangajn telah sesuai denagn yang diinginkan . Hal ini mengharuskan mikrokontroler untuk mengambil keputusan untuk kemuduian mengerjakan subrutin yang sesuai.

Seperti telah dijelaskan, mikrokontroler mengerjakan program denagn membaca isi memori program, dan data yang terbaca akan diartikan sebagai perintah yang harus dikerjakan. Alamat memori program yang harus dibaca ditunjukan oleh SFR PC (program counter). Setelah mengerjakan sebuah intruksi, PC dinaikan dan menunjukan ke alamat untuk intruksi selanjutnya. Jika sebuah intruksi menyimpan data yang berbeda ke dalam PC, maka intruksi selanjutnya yang harus dikerjakan oleh mikrokontroler bisa terletak di alamat manapun di memori program.

Intruksi-intruksi yang akan mengubah isi PC dinamakan intruksi pencabangan (branching intrucktions) karena intruksi ini akanmembuaut alur program percabangan. Intruksi-intruksi yang termasuk ke dalam intruksi percabangan adalah intruksi lompat (jump), yang akan me3lompat ke sebuah alamat programdan intruksi panggil (call), yang akan memanggil sebuah subrutin di memori program, termasuk intruksi kembali (retrun) setelah intruksi panggil. Intruksi lompat bisa dibagi menjadi lompat tak bersyarat (unconditional jump0 dan lompat bersyarat (conditional jump).

INTRUKSI LOMPAT T5AK BERSYARAT

Inrtuksi lompat tak bersyarat digunakan untuk membuat mikrokontroler melompat ke sebuah alamat program secara langsung dengan tdak melihat kondisi sebelumnya. Tabel 4.5 merangkum intruksi lompat tak bersyarat .

Pada dasarnya yang membedakan intruksi-intrukasi yang ditunjukan oleh tabel adalah jangkauan alamat tujuan lompatan. Intruksi sjmp memiliki jangkau

An lompat yang terendah, hanya 127 alamat ke depan dan 128 alamat ke belakang. Jika alamat tujuan melebihi batas tersebut , assembler 8051 akan menimbulkan error. Intruksi ljmp dan jmp mempunyai alamat

Page 31: Bahasa Assembler 8051

tujuan ke semua lokasi memori program (64 KB). Intruksi ini bisa menggantikan intruksi sjmp dan ljmp secara langsung, namun yang perlu diperhatikan, intruksi jmp dan ljmp dikodekan dengan lebih banyak byte daripada sjmp dan ajmp.

Perhatikan contoh program berikut:

org 0000H

mov A, P1

mov P0, A

sjmp 0000H

Tabel 4.5 Intruksi-intruksi lompat atk bersyarat

Bentuk Intruksi Keterangan

sjmp rel Lompat pendek (short jump). Alamat tujuan didapatkan dengan menjumlahkan rel ( relative) denagn pc setelah PC dinaikan 2 kali. Alamat tujuan akan berada 127 byte ke depan atau 128 byte ke belakang.

ajmp addr11 Lompat absalu (absolute jump). Alamat tujuan adalah alamat 11 bit dan harus berada dalam blok 2 KB memori program yang sama.

ljmp addr16 Lompat jauh (long jump). Alamat tujuan berada di mana saja dalam 64 KB memori program.

jmp addr16 Sama dengan ljmp

jmp @A+DPRT Lompat berindeks. Alamat tujuan adalah isi DPRT setelah dijumlahkan dengan akumulator.

Alamat program dimulai di 0000H.Pro gram ini akan memba ca P1 untuk disimpan di akumulator dan dikirim ke p0. Setelah itu program akan melompat bisa langsung dituliskan alamatnya atau menuliskan label. Dengan menuliskan alamat secara lamngsung , jika alamt awal berubah, maka alamat tujuan juga diperbarui. Jika tidak, program ini tidak akan berjalan dengan baik. Dengan menggunakan label , hal itu tidak perlu dilakukan. Perhatikan contoh program berikut

org 0000H

Srart:

mov A, P1

mov P0, A

sjmp start

Page 32: Bahasa Assembler 8051

Jika alamat awal berubah menjadi 0100H, program tetap akan bekerja dengan baik karena label start akan menjadi 0100H.

Perhatikan contoh program berikut

Start

sjmp start

jika program dijalankan maka akan terjadi loop yang tak berhenti. Program diatas bisa digantikan dengan mengganti alamat tujuan lompat denagn tanda $.

Akan mempunyai arrti yang sama dengan program sebelumnya.

Intruksi lompat berindeks cara kerjanya hampir sama denagn operasi pemindahan data modepengalamatan berindeks. Bedanya pada operasi pemindahan data, yang dilakukan adalah membaca byte konstanta deri tabel konstanta yang ada di memori program, sedangkan intruksi lompat berindeks akan membaca dan mengerjakan program atau subrutin dalam sebuah tabel intruksi. Dalam intruksi lo/mpat berindeks, digunakan DPRT daan akumulator. Dprt akan menyimpan alamat awal (base addres) dari tabel, sedangakn akumulator akan menyimpan alamat offset yaitu alamat sebenarnya ke mana program akan melompat. Perlu diperhatikan program atau subrutin dalam tabel intruksi mungkin membutuhkan bebebrapa byte intruksi, karena itu akumulator perlu disesuaikan sebelum perintah lompat berindeks dikerjakan. Perhatikan contoh program berikut

org 0000H

Star:

mov A, P0

anl A, #3

mov B, #5

mul AB

mov DPRT, #routine_table

jmp @A+DPRT

Routine_Table:

mov B, P1

sjmp Routine_Table_Exit

mov B, P2

sjmp Routine_Table_Exit

mov B, P3

sjmp Routine_Table_Exit

Page 33: Bahasa Assembler 8051

mov B, #0

Routine_Table_Exit:

mov A, #0AH

mul AB

ljmp Start

end

Program di atas akan membaca data dari P0 dan disimpan di akumulator. Hasil Pembacaan akan Menentukan membaca P1, P2, P3 atau konstanta 0 untuk kemudian dikalikan dengan 0AH. Ini berarti aka nada 4 kemungkinan tabel intruksi yang akan dilaksanakan, karena itu akumulator di-AND-kan denagn 3 untuk memastikan akumulator yang berada di antara 0 sampai 3. Masing-masing tabel intruksi terdiri atas 2 intruksi:intruksi pemindahan data dan intruksi lompat pendek. Kedua intruksi ini akan dikodekan menjadi % byte alamat. Oleh karena itu, akumulator harus dikalikandengan 5. Jadi, perintah berindeks akan molompat dengan kelipatan 5 sesuai dengan akumulator.

Jika tabel intruklsi memerlukan intruksi-intruksi yang yang mememrlukan lebih banyak byte-byte kode, program di atas bisa dimodifikasi untuk membaca tabel lompatan. Perhatikan program berikut.

org 0000H

mov A, P0

anl A, #3

mov B, #3

mul AB

mov DPRT, #jump_table

jmp @A+DPRT

Jump_Tabel:

ljmp First_Routine

ljmp Second_Routine

ljmp Third_Routine

ljmp Fourth_Routine

First_Routine

mov B, P1

ljmp Jump_tabel_exit

Page 34: Bahasa Assembler 8051

Second_Routine

mov B, P2

ljmp Jump_tabel_exit

Third_Routine

mov B, P3

ljmp Jump_tabel_exit

Fourth_Routine

mov B, #0

ljmp Jump_tabel_exit

Jump_Tabel_Exit:

mov A, #0AH

mul AB

ljmp Start

end

Tabel lompatan sekarang hanya terdiri atas 1 intruksi, yaitu intruksi lompatan panjang (ljmp). Intruksi ini akan dikodekan menjadi 3 byte, karena itu akumulator akan disesuaikan dengan mengalikannya dengan 3. Oleh karena intruksi yang akan dieksekusi berada dalam subrutin lain(seperti terlihat dalam tabel lompatan ada 4 subrutin), maka subrutin tersebut bisa berisi intruksi-intruksi yang panjang (selama dalam kapasitas 64 KB).

INTRUKSI LOMPAT BERSYARAT

Intruksi lompat bersyarat digunakan untuk membuat mikrokontroler melompat ke sebuah alamat program tertentu apabila sebuah persyaratan terpenuhi. Sebagai contoh, jika isi akumulator nol maka program akan melompat ke alamat program yang dimaksud. Jika tidak nol, program akan melanjutkan ke alamat selanjutnya. Selain akumulator, persyaratan juga bisa didapatkan dari bank register, SFR, alamat RAM (langsung atatu tak langsung),atau juga didapat dari sebuah bit. Tabel 4.6 memperlihatkan intruksi-intruksi yang termaduk ke dalalm intruksi lompat bersyarat.

Semua alamat tujuan lompat bersyarat adlah relative, artinya alamat lompatan akan berada 128 byte sebelum atau 127 byte sesudahnya.

Tabel 4.6 Intruksi-intruksi lompatan bersyarat

Bentuk Intruksi Keterangan

jz rel Program akan melompat ke alamat rel jika akumulator nol. Jika tidak nol, program akan melanjutkan ke alamat selanjutnya.

jnz rel Program akan melompat ke alamat rel jika akumulator tidak nol. Jika nol, program akan

Page 35: Bahasa Assembler 8051

melanjutkan ke alamat selanjutnya.

jc rel Program akan melompat ke alamat rel kalau carry © di-set. Jika tidak, program akan melanjutkan ke alamat selanjutnya.

jnc rel Program akan melompat ke alamat rel kalau bit C tidak di-set. Jika bit C di-set, program akan melanjutkan ke alamat selanjutnya.

jb bit, rel Program akan melompat ke alamat rel kalau bit (di SFR atau RAM internal yang bisa diakses per bit) di-set. Jika di-set, program akan melanjutkan ke alamat selanjutnya.

jbc bit, rel Program akan melompat ke alamat rel kalau bit (di SFR atau RAM internal yang bisa diakses per bit) di-set setelah itu bit akan di-nolkan(clear). Jika tidak, program akan melanjutkan ke alamat selanjutnya.

cjne A, direct, rel Program akan melompat ke alamat rel jika isi akumulator tidak sama dengan isi alamat langsung RAM dan SFR. Jika sama, program akan melanjutkan ke alamat selanjutnya.

cjne A, #data, rel Program akan melompat ke alamat rel jika isi akumulator tidak sama dengan byte konstanta.jika sma, program akan melanjutkan ke alamat selanjutnya.

cjne Rn, #data, rel Program akan melompat ke alamat rel jika isi salah satu register (R0 – R7) tidak sama dengan byte konstanta. Jika sama, program akan melanjutkan ke alamat selanjutnya.

cjne @Ri, #data, rel Program akan melompat ke alamat rel jika isi alamat RAM yang ditunjukan oleh R0 atau R1 tidak dama dengan byte konstanta. Jika sama, program akan melanjutkan ke alamat selanjutnya.

djnz Rn, rel Kurangi satu isi register Rn (n=0,1,2,…,7); jika belum nol melompati ke alamat rel, jika sudah nol lanjutkan ke alamat selanjutnya.

djnz direct, rel Kurangi satu isi RAM atau SFR; jika belum nol melompat ke alamat rel, jika sudah nil lanjutkan ke alamat selanjutnya.

Page 36: Bahasa Assembler 8051
Page 37: Bahasa Assembler 8051