Instruksi LDI dan Direktif DEF


avrmnemonicInstruksi LDI (Load Immediate) digunakan untuk meng-copy nilai konstanta 8-bit (1 byte) ke dalam suatu register (R16 – R31). Instruksi ini tidak mempengaruhi Register Status (SREG). Sintaksis: LDI Rn, <konstanta>. Rn adalah salah satu register dari R16 – R31. <konstanta> adalah bilangan 0 – 255 yang dapat ditulis dalam format biner, oktal, desimal, atau hexadesimal. Setelah instruksi dieksekusi, maka register yang bersangkutan akan berisi nilai konstanta. Instruksi yang dieksekusi dalam 1 siklus ini menempati 1 word dari memori program.

Direktif DEF berfungsi untuk memberi nama spesifik pada suatu register. Pemberian nama bertujuan untuk memudahkan penulisan program. Dibandingkan dengan menghafalkan nomor register, masih jauh lebih mudah menghafalkan nama spesifik yang biasanya sesuai dengan fungsinya dalam program atau subrutin.

Boleh juga dianalogikan begini. Pada pemrograman Pascal atau C/C++ kita harus mendeklarasikan variabel sebelum dapat digunakan dalam program. Menempati alamat memori manakah variabel-variabel yang kita deklarasikan? Kita baru akan tahu kalau program kita dieksekusi.

Pada pemrograman assembler, pemrogram telah dibekali dengan sejumlah register yang dapat digunakan sebagai variabel sementara dalam program. Nama register jelas dan jumlahnya terbatas. Register bisa langsung digunakan dalam program assembler, kita tidak perlu lagi mendeklarasikannya. Kita hanya perlu memberinya nama, nama yang spesifik sesuai dengan fungsinya dalam program. Itulah fungsi direktif DEF. Direktif DEF dapat diletakkan bebas di mana saja dalam program assembler.

Apabila membutuhkan variabel global dalam SRAM, maka dapat digunakan direktif DSEG yang dikombinasikan dengan label dan direktif BYTE, yang (maaf) tidak dibahas dalam tulisan ini.

Biar lebih gamblang, mari kita aplikasikan LDI dan DEF di dalam sebuah program menggunakan simulator VMLAB. Berikut adalah program assemblernya untuk ATmega8 yang berfungsi melakukan perkalian register dan menyimpan hasilnya dalam register.

; LDIDEF.ASM

.include “C:\MICROC~1\VMLAB\include\m8def.inc”

.def panjang1 = r16
.def lebar1 = r17
.def luas1 = r18

.def panjang2 = r16
.def lebar2 = r17
.def luas2 = r20

.cseg
.org 0000

rjmp start

start:
ldi    panjang1, 8
ldi    lebar1, $10
mul    panjang1, lebar1
movw    luas1, r0

ldi    panjang2, 0b1010
ldi    lebar2, 18
mul    panjang2, lebar2
movw    luas2, r0

forever:
rjmp forever

Penjelasan Program
Direktif INCLUDE memberitahu assembler untuk menyertakan file m8def.inc dalam proses kompilasi. Mungkin Anda perlu mengganti path-nya untuk disesuaikan dengan lokasi file m8def.inc dalam komputer Anda.

.def panjang1 = r16
.def lebar1 = r17
.def luas1 = r18

Selanjutnya, dengan menggunakan direktif DEF, register R16 diberi nama panjang1, register R17 diberi nama lebar1, dan register R18 diberi nama luas1. Tanpa dijelaskan pun, kita sudah tahu bahwa R16 digunakan untuk menyimpan data panjang, R17 untuk menyimpan data lebar, dan R18 untuk menyimpan data luas dari suatu persegipanjang.

.def panjang2 = r16
.def lebar2 = r17
.def luas2 = r20

Pada baris selanjutnya terdapat tiga baris direktif DEF lagi. Kali ini R16 diberi nama panjang2, R17 diberi nama lebar2, dan R20 diberi nama luas2. Lho? R16 dan R17 kok masing-masing punya dua nama? Iya, benar. Gak masalah kok. Kita memang dapat memberikan lebih dari satu nama kepada sebuah register! Hal ini akan semakin membantu pemrogram dalam proses penulisan program. Register yang sama yang digunakan dalam subrutin yang berbeda, dapat diberi nama berbeda sesuai dengan fungsinya dalam masing-masing subrutin.

.cseg
.org 0000

rjmp start

Selanjutnya, direktif CSEG dan ORG 0000 digunakan untuk memberitahu assembler bahwa mulai baris ini dan seterusnya harus ditempatkan dalam memori program mulai dari alamat 0000. rjmp start adalah baris program yang pertama kali dieksekusi setelah mikrokontroler direset.

start:
ldi    panjang1, 8
ldi    lebar1, $10
mul    panjang1, lebar1
movw    luas1, r0

Instruksi LDI yang pertama mengisi register R16 (panjang1) dengan konstanta 8 (panjang1=8). Instruksi LDI yang kedua mengisi register R17 (panjang2) dengan konstanta 10 hexa atau 16 desimal (panjang2=$10= 16).

Selanjutnya, dilakukan kalkulasi luasan persegipanjang1 dengan instruksi mul panjang1, lebar1. Instruksi MUL melakukan perkalian antara dua buah register 8-bit. Hasil perkalian (1 word) disimpan dalam pasangan register R1:R0. Hasil perkalian ini di-copy ke dalam pasangan register R19:R18 yang diberi nama luas1 menggunakan instruksi MOVW (luas1=128).

ldi    panjang2, 0b1010
ldi    lebar2, 18
mul    panjang2, lebar2
movw    luas2, r0

Empat baris selanjutnya mirip dengan empat baris sebelumnya namun untuk variabel yang berbeda. Instruksi LDI pertama mengisi register R16 (panjang2) dengan konstanta 0b1010 (panjang2=10). Instruksi LDI kedua mengisi register R17 (lebar2) dengan konstanta 18 (panjang2=18).

Hasil perkalian panjang2 dan lebar2 disimpan dalam pasangan register R21:R20 yang diberi nama luas2 (luas=180).

forever:
rjmp forever

Dua baris terakhir program adalah looping tanpa batas sebagai akhir dari program.

Berikut adalah cuplikan tampilan program VMLAB ketika mensimulasikan program di atas.

pmldidef

Tampilan Window Program Memori

watchldidef

Tampilan Window Watch

Tampilan Window Watch menunjukkan nilai variabel-variabel lebar1, lebar2, luas1, luas2, panjang1, dan panjang2 pada akhir program. Semoga bermanfaat.

Selamat belajar!

One comment

  1. Anang · Agustus 3, 2009

    Programer dengan interface USB, bisa AVR & MCS51.
    bisa di download di AUDIO PLASA
    Mangkubumi No.31 Yogyakarta🙂

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s