|
Program sumber assembly
Program-sumber assembly (assembly source
program) merupakan kumpulan dari baris-baris perintah yang ditulis dengan program
penyunting-teks (text editor) sederhana, misalnya program EDIT.COM dalam DOS,
atau program NOTEPAD dalam Windows atau MIDE-51. Kumpulan baris-printah
tersebut biasanya disimpan ke dalam file dengan nama ekstensi *.ASM dan lain
sebagainya, tergantung pada program Assembler yang akan dipakai untuk
mengolah program-sumber assembly tersebut.
Setiap baris-perintah merupakan sebuah
perintah yang utuh, artinya sebuah perintah tidak mungkin dipecah menjadi
lebih dari satu baris. Satu baris perintah bisa terdiri atas 4 bagian, bagian
pertama dikenali sebagai label atau sering juga disebut sebagai symbol,
bagian kedua dikenali sebagai kode operasi, bagian ketiga adalah operand dan
bagian terakhir adalah komentar.
Antara bagian-bagian tersebut dipisahkan dengan sebuah spasi atau tabulator.
Bagian label
Label dipakai untuk memberi nama pada sebuah baris-perintah, agar bisa mudah
menyebitnya dalam penulisan program. Label bisa ditulis apa saja asalkan
diawali dengan huruf, biasa panjangnya tidak lebih dari 16 huruf. Huruf-huruf
berikutnya boleh merupakan angka atau tanda titik dan tanda garis bawah.
Kalau sebuah baris-perintah tidak memiliki bagian label, maka bagian ini
boleh tidak ditulis namun spasi atau tabulator sebagai pemisah antara label
dan bagian berikutnya mutlak tetap harus ditulis.
Dalam sebuah program sumber
bisa terdapat banyak sekali label, tapi tidak boleh ada label yang kembar.
Sering sebuah baris-perintah hanya terdiri dari bagian label saja, baris
demikian itu memang tidak bisa dikatakan sebagai baris-perintah yang
sesungguhnya, tapi hanya sekedar memberi nama pada baris bersangkutan.
Bagian label sering
disebut juga sebagai bagian symbol, hal ini terjadi kalau label tersebut
tidak dipakai untuk menandai bagian program, melainkan dipakai untuk menandai
bagian data.
Bagian kode operasi
Kode operasi (operation code atau sering disingkat sebagai OpCode) merupakan
bagian perintah yang harus dikerjakan. Dalam hal ini dikenal dua macam kode
operasi, yang pertama adalah kode-operasi untuk mengatur kerja mikroprosesor
/ mikrokontroler. Jenis kedua dipakai untuk mengatur kerja program assembler,
sering dinamakan sebagai assembler directive.
Kode-operasi ditulis dalam
bentuk mnemonic, yakni bentuk singkatan-singkatan yang relatip mudah diingat,
misalnya adalah MOV, ACALL, RET dan lain sebagainya. Kode-operasi ini
ditentukan oleh pabrik pembuat mikroprosesor/mikrokontroler, dengan demikian
setiap prosesor mempunyai kode-operasi yang berlainan.
Kode-operasi berbentuk mnemonic tidak dikenal mikroprosesor/mikrokontroler,
agar program yang ditulis dengan kode mnemonic bisa dipakai untuk
mengendalikan prosesor, program semacam itu diterjemahkan menjadi program
yang dibentuk dari kode-operasi kode-biner, yang dikenali oleh
mikroprosesor/mikrokontroler.
Tugas penerjemahan tersebut dilakukan oleh
program yang dinamakan sebagai Program Assembler.
Di luar kode-operasi yang ditentukan pabrik pembuat
mikroprosesor/mikrokontroler, ada pula kode-operasi untuk mengatur kerja dari
program assembler, misalnya dipakai untuk menentukan letak program dalam
memori (ORG), dipakai untuk membentuk variabel (DS), membentuk tabel dan data
konstan (DB, DW) dan lain sebagainya.
Bagian operand
Operand merupakan pelengkap bagian kode operasi, namun tidak semua kode operasi
memerlukan operand, dengan demikian bisa terjadi sebuah baris perintah hanya
terdiri dari kode operasi tanpa operand. Sebaliknya ada pula kode operasi
yang perlu lebih dari satu operand, dalam hal ini antara operand satu dengan
yang lain dipisahkan dengan tanda koma.
Bentuk operand sangat
bervariasi, bisa berupa kode-kode yang dipakai untuk menyatakan Register
dalam prosesor, bisa berupa nomor-memori (alamat memori) yang dinyatakan
dengan bilangan atau pun nama label, bisa berupa data yang siap di-operasi-kan.
Semuanya disesuaikan dengan keperluan dari kode-operasi.
Untuk membedakan operand yang berupa nomor-memori atau operand yang berupa
data yang siap di-operasi-kan, dipakai tanda-tanda khusus atau cara penulisan
yang berlainan.
Di samping itu operand
bisa berupa persamaan matematis sederhana atau persamaan Boolean, dalam hal
semacam ini program Assembler akan menghitung nilai dari persamaan-persamaan
dalam operand, selanjutnya merubah hasil perhitungan tersebut ke kode biner
yang dimengerti oleh prosesor. Jadi perhitungan di dalam operand dilakukan
oleh program assembler bukan oleh prosesor.
Bagian komentar
Bagian komentar merupakan catatan-catatan penulis program, bagian ini
meskipun tidak mutlak diperlukan tapi sangat membantu masalah dokumentasi.
Membaca komentar-komentar pada setiap baris-perintah, dengan mudah bisa
dimengerti maksud tujuan baris bersangkutan, hal ini sangat membantu orang
lain yang membaca program.
Pemisah bagian komentar dengan bagian sebelumnya adalah tanda spasi atau tabulator,
meskipun demikian huruf pertama dari komentar sering-sering berupa tanda
titik-koma, merupakan tanda pemisah khusus untuk komentaru ntuk keperluan
dokumentasi yang intensip, sering-sering sebuah baris yang merupakan komentar
saja, dalam hal ini huruf pertama dari baris bersangkutan adalah tanda
titik-koma.
AT89S51 memiliki sekumpulan instruksi yang sangat lengkap. Instruksi MOV
untuk byte dikelompokkan sesuai dengan mode pengalamatan (addressing modes).
Mode pengalamatan menjelaskan bagaimana operand dioperasikan. Berikut
penjelasan dari berbagai mode pengalamatan. Bentuk program assembly yang umum
ialah sebagai berikut :
|
Label/Simbol
|
Opcode
|
Operand
|
Komentar
|
|
Org
|
0H
|
|
|
Start:
Kiri:
Delay:
Del1:
Del2:
|
Mov
Mov
Mov
Call
RL
DEC
CJNE
Sjmp
mov
mov
djnz
djnz
ret
end
|
A, #11111110b
R0, #7
P0, A
Delay
A
R0
R0, #0, Kiri
Start
R1, #255
R2, #255
R2, del2
R1, del1
|
; Isi Akumulator
; Isi R0 dengan 7
; Copy A ke P0
; Panggil Delay
|
Isi memori ialah bilangan heksadesimal yang
dikenal oleh mikrokontroler kita, yang merupakan representasi dari bahasa
assembly yang telah kita buat. Mnemonic atau opcode ialah kode yang akan
melakukan aksi terhadap operand . Operand ialah data yang diproses oleh
opcode. Sebuah opcode bisa membutuhkan 1 ,2 atau lebih operand, kadang juga
tidak perlu operand. Sedangkan komentar dapat kita berikan dengan menggunakan
tanda titik koma (;). Berikut contoh jumlah operand yang berbeda beda dalam
suatu assembly.
CJNE R5,#22H, aksi ;dibutuhkan 3 buah
operand
MOVX @DPTR, A ;dibutuhkan 2 buah operand
RL A ;1 buah operand
NOP ; tidak memerlukan operand
Program yang telah selesai kita buat dapat
disimpan dengan ekstension .asm. Lalu kita dapat membuat program objek dengan
ekstension HEX dengan menggunakan compiler MIDE-51, yang dijelaskan sebagai
berikut:
Assembly Listing
Program-sumber assembly di atas, setelah
selesai ditulis diserahkan ke program Assembler untuk diterjemahkan. Setiap
prosesor mempunyai program assembler tersendiri, bahkan satu macam prosesor
bisa memiliki beberapa macam program Assembler buatan pabrik perangkat lunak
yang berlainan.
Hasil utama pengolahan program Assembler
adalah program-obyek. Program-obyek ini bisa berupa sebuah file tersendiri,
berisikan kode-kode yang siap dikirimkan ke memori-program
mikroprosesor/mikrokontroler, tapi ada juga program-obyek yang disisipkan
pada program-sumber assembly seperti terlihat dalam Assembly Listing.
Bagian kanan merupakan program-sumber
Assembly, setelah diterjemahkan oleh program Assembler kode-kode yang
dihasilkan berikut dengan nomor-nomor memori tempat penyimpanan kode-kode
tadi, disisipkan pada bagian kiri setiap baris perintah, sehingga bentuk program
ini tidak lagi dikatakan sebagai program-sumber assembly tapi dikatakan
sebagai Assembly Listing.
Membaca Assembly Listing bisa memberikan
gambaran yang lebih jelas bagi program yang ditulis, bagi pemula Assembly
Listing memberi pengertian yang lebih mendalam tentang isi memori-program,
sehingga bisa lebih dibayangkan bagaimana kerja dari sebuah program.
Line Addr
Code
Source
1:
Org 0H
2:
0000 74 FE Start:
Mov A,#11111110b
3:
0002 78
07
Mov R0,#7
4:
0004 F5 80
Kiri: Mov P0,A
5:
0006 12 00 1C
Call Delay
6:
0009
23
RL A
7: 000A
18
DEC R0
8: 000B
B8 00 F6
CJNE R0,#0,Kiri
9: 000E
78
07
Mov R0,#7
10: 0010 F5
80 Kanan: Mov P0,A
11: 0012 12 00
1C
Call Delay
12: 0015
03
RR A
13: 0016
18
DEC R0
14: 0017 B8 00
F6
CJNE R0,#0,Kanan
15: 001A 80
E4
Sjmp Start
16: ;
17: 001C 79 FF
Delay: mov R1,#255
18: 001E 7A
FF Del1: mov R2,#255
19: 0020 DA
FE Del2: djnz R2,del2
20: 0022 D9
FA
djnz R1,del1
21: 0024
22
ret
22:
end
SET INSTRUKSI DAN PENGALAMATAN
Set instruksi
(instruction set) adalah sekumpulan lengkap instruksi yang dapat di mengerti
oleh sebuah CPU, set instruksi sering juga disebut sebagai bahasa mesin
(machine code), karna aslinya juga berbentuk biner kemudian dimengerti
sebagai bahasa assembly, untuk konsumsi manusia (programmer), biasanya
digunakan representasi yang lebih mudah dimengerti oleh manusia.
Sebuah instruksi
terdiri dari sebuah opcode, biasanya bersama dengan beberapa informasi
tambahan seperti darimana asal operand-operand dan kemana hasil-hasil akan
ditempatkan. Subyek umum untuk menspesifikasikan di mana operand-operand
berada (yaitu, alamat-alamatnya) disebut pengalamatan
Pada beberapa
mesin, semua instruksi memiliki panjang yang sama, pada mesin-mesin yang lain
mungkin terdapat banyak panjang berbeda. Instruksi-instruksi mungkin lebih
pendek dari, memiliki panjang yang sama seperti, atau lebih panjang dari
panjang word. Membuat semua instruksi memiliki panjang yang sama lebih muda
dilakukan dan membuat pengkodean lebih mudah tetapi sering memboroskan ruang,
karena semua instruksi dengan demikian harus sama panjang seperti instruksi
yang paling panjang.
Di dalam sebuah
instruksi terdapat beberapa elemen-elemen instruksi:
Operation code
(op code)
Source operand
reference
Result operand
reference
Xext instruction
preference
Format instruksi
(biner):
Missal instruksi
dengan 2 alamat operand : ADD A,B A dan B adalah suatu alamat register.
Beberapa
simbolik instruksi:
ADD :
Add (jumlahkan)
SUB :
Subtract (Kurangkan)
MPY/MUL :
Multiply (Kalikan)
DIV :
Divide (Bagi)
LOAD :
Load data dari register/memory
STOR :
Simpan data ke register/memory
MOVE :
pindahkan data dari satu tempat ke tempat lain
SHR :
shift kanan data
SHL :
shift kiri data .dan lain-lain
Cakupan jenis
instruksi:
Data
processing
: Aritmetik (ADD, SUB, dsb); Logic (AND, OR,
NOT, SHR, dsb); konversidata
Data storage
(memory) : Transfer data (STOR, LOAD, MOVE, dsb)
Data
movement :
Input dan Output ke modul I/O
Program flow
control : JUMP, HALT, dsb.
Bentuk
instruksi:
- Format
instruksi 3 alamat
Mempunyai bentuk
umum seperti : [OPCODE][AH],[AO1],[AO2]. Terdiri dari satu alamt hasil, dan
dua alamat operand, misal SUB Y,A,B Yang mempunyai arti dalam bentuk
algoritmik : Y := A – B dan arti dalam bentuk penjelasan : kurangkan isi reg
a dengan isi reg B, kemudian simpan hasilnya di reg Y. bentuk bentuk pada
format ini tidak umum digunakan di dalam computer, tetapi tidak dimungkinkan
ada pengunaanya, dalam peongoprasianya banyak register sekaligus dan program
lebih pendek.
Contoh:
A, B, C, D, E, T, Y adalah register
Program: Y = (A – B) / ( C + D × E)
SUB Y, A,
B Y
:= A – B
MPY T, D,
E T
:= D × E
ADD T, T, C T
:= T + C
DIV Y, Y,
T Y:=
Y / T
Memerlukan 4
operasi
-Format
instruksi 2 alamat
Mempunyai bentuk
umum : [OPCODE][AH],[AO]. Terdiri dari satu alamat hasil merangkap operand, satu
alamat operand, missal : SUB Y,B yang mempunyai arti dalam algoritmik : Y:= Y
– B dan arti dalam bentuk penjelasan : kurangkan isi reg Y dengan isi reg B,
kemudian simpan hasillnya di reg Y. bentuk bentuk format ini masih digunakan
di computer sekarang, untuk mengoprasikan lebih sedikit register, tapi
panjang program tidak bertambah terlalu banyak.
Contoh :
A, B, C, D, E, T, Y adalah register
Program: Y = (A – B) / ( C + D × E)
MOVE Y,
A Y
:= A
SUB Y,
B Y
:= Y - B
MOVE T,
D T
:= D
MPY T,
E T
:= T × E
ADD T,
C T
:= T + C
DIV Y,
T Y:=
Y / T
Memerlukan 6
operasi
-Format
instruksi 1 alamat
Mempunyai bentuk
umum : [OPCODE][AO]. Terdiri dari satu alamat operand, hasil disimpan di
accumulator, missal : SUB B yang mempunyai arti dalam algoritmik : AC:= AC –
B dan arti dalam bentuk penjelasan : kurangkan isi Acc dengan isi reg B,
kemudian simpan hasillnya di reg Acc. bentuk bentuk format ini masih
digunakan di computer jaman dahulu, untuk mengoprasikan di perlukan
satu register, tapi panjang program semakin bertambah.
Contoh :
A, B, C, D, E, Y adalah register
Program: Y = (A – B) / ( C + D × E)
LOAD
D AC
:= D
MPY
E AC
:= AC × E
ADD
C AC
:= AC + C
STOR
Y Y
:= AC
LOAD
A AC
:= A
SUB
B AC
:= AC – B
DIV
Y AC
:= AC / Y
STOR
Y Y
:= AC
Memerlukan 8
operasi
-Format instruksi 0 alamat
Mempunyai bentuk umum : [OPCODE]. Terdiri dari semua alamat operand
implicit, disimpan dalam bentuk stack. Operasi yang biasanya membutuhkan 2
operand, akan mengambil isi stack paling atas dan dibawahnya missal : SUB
yang mempunyai arti dalam algoritmik : S[top]:=S[top-1]-S[top] dan arti
dalam bentuk penjelasan : kurangkan isi stack no2 dari atas dengan isi stack
paling atas, kemudian simpan hasilnya di stack paling atas, untuk
mengoprasikan ada beberapa instruksi khusus stack PUSH dan POP.
Contoh :
A, B, C, D, E, Y adalah register
Program: Y = (A – B) / ( C + D × E)
PUSH
A S[top]
:= A
PUSH
B S[top]
:= B
SUB S[top]
:= A - B
PUSH
C S[top]
:= C
PUSH
D S[top]
:= D
PUSH
E S[top]
:= E
MPY S[top]
:= D × E
ADD S[top]
:= C + S[top]
DIV S[top]
:= (A - B) /S[top]
POP
Y Out
:= S[top]
Memerlukan 10
operasi
Set instruksi
pada CISC:
Berikut ini
merupakan karakteristik set instruksi yang digunakan pada beberapa computer
yang memiliki arsitektur CISC
Perbandingan
set instruksi
Beberapa
computer CISC (Complex Instruction Set Computer) menggunakan cara implist
dalam menentukan mode addressing pada setiap set instruksinya. Penentuan mode
addressing dengan cara implicit memiliki arti bahwa pada set instruksi tidak
di ada bagian yang menyatakan tipe dari mode addressing yang digunakan,
deklarasi dari mode addressing itu berada menyatu dengan opcode. Lain hal nya
dengan cara imsplisit, cara eksplisit sengaja menyediakan tempat pada set
instruksi untuk mendeklarasikan tipe mode addressing. Pada cara eksplisit
deklarasi opcode dan mode addressing berada terpisah.
Data pada tempat
deklarasi mode addressing diperoleh dari logaritma basis dua jumlah mode
addressing. Jika deklarasi mode addressing dilakukan secara implicit akan
menghemat tempat dalam set instruksi paling tidak satu bit untuk IBM 3090 dan
6 bit untuk MC68040. Perubahan satu bit pada set instruksi akan memberikan
jangkauan alamat memori lebih luas mengingat range memori dinyatakan oleh
bilangan berpangkat dua.
Implementasi
hardware
Setiap set
instruksi yang berbeda membutuhkan perangkat hardware yang berbeda pula. Hal
ini terjadi karena set instruksi yang berbeda menyimpan informasi yang
berbeda sehingga dibutuuhkan hardware yang berbeda untuk mengubah set
instruksi tersebut ke bentuk sinyal-sinyal control.
Untuk
mendapatkan opcode berikutnya prosesor harus mengetahui letak dari opcode
tersebut secara pasti pada memory. Karena tipe dari mode addressing sangat
mempengaruhi posisi dari operand, maka secara tidak langsung mode addressing
mempengaruhi letak opcode selanjutnya. Sehingga dapat disimpulkan kedua cara
pendeklarasian mode addressing tersebut turut mempengaruhi arsitektur
hardware dari computer.
Pengalamatan
Program biasanya
ditulis dalam bahasa tingkat tinggi, yang memunkinkan program untuk
menggunakan konstanta, variable local dan global, pointer, dan array. Pada
saat mentranslasi program bahsa tingkat tinggi menjadi bahsa assembly,
compiler harus mampu mengimplimentasi konstruksi ini menggunakan fasilitas
yang disediakan dalam set instruksi computer dimana program akan dijalankan.
cara yang berbeda dalam menentukan lokasi suatu operand ditetapkan dalam
suatu instruksi yang disebut sebagai mode pengalamatan.
Implementasi
variable dan konstanta
Variable dan
konstanta adalah tipe data yang paling sederhana dan terdapat dalam hampir
setiap program computer. Dalam bahasa assembley, suatu variable dinyatakan
dengan mengalokasikan suatu register atau lokasi memori untuk menyimpan
nilainya. Sehingga nilai tersebut dapat diubah seperlunya menggunakan
instruksi sesuai.
Kita mengakses
operand dengan menetapkan nama register atau alamat lokasi memori tempat
operand berada. Definisi yang presisi dari dua mode tersebut adalah:
a) Mode
register operand adalah isi register prosesor, nama alamat register
dinyatakan dalam instruksi tersebut.
b) Mode
absolute operand adalah lokasi memori, alamat lokasi dinyatakan secara
eksplisit didalam instruksi tersebut. (pada bebrapa bahasa assembly, mode ini
disebut direct).
c) Mode
immediate operand dinyatakan secara eksplisit dalam instruksi, misalnya,
instruksi Move 200 immediete, RO.
Indirection
dan pointer
Pada mode
pengalamatan berikutnya, instruksi tidak menyatakana operand atau alamatnya
secara eksplisit. Sebaliknya, instruksi menyediakan informasi dari nama
alamat memori suatu operand dapat ditetapkan. Kita menyebut alamat ini
sebagai effective address (EA) suatu operand.
Selain
kesederhanaanya yang tampak jelas, pengalamatan indirect melalui memori telah
terbukti memiliki keterbatasan pengunaan sebagai mode pengalamatan, dan
jarang di gunakan dalam computer modern, pengalamatan indirect melalui
register digunakan secara luas. Maka pengalamatan indirect melalui register
memungkinkan untuk mengakses variable global dengan terlebih dahulu me-load
alamat operand dalam suatu register.
Secara umum
teknik addressing yang sering dilakukan adalah:
1. Immediate addressing
Operand (data yang akan dikomputasi) berada langsung pada set instruksi.
2. Direct Addressing
Operand berada pada memori, set instruksi memegang alamat lokasi memori
dimana operand tersebut berada.
3. Indirect Addresing
Operand berada pada memori, untuk mendapatkan operand ini CPU harus melakukan
penelusuran dua kali yaitu dari data alamat memori yang ada pada set
instruksi serta alamat yang ditunjuk oleh alamat memori yang diperoleh dari
set instruksi tadi.
4. Register
addressing
Operand berada pada register, cara kerjanya mirip dengan direct addressing
hanya saja CPU mengakses alamat register bukan alamat memori.
5.
Register Indirect Addressing
Operand berada pada memori, untuk mendapatkan operand CPU harus mengakses
register terlebih dahulu karena informasi lokasi operand berada pada register.
6.
Displacement
Operand berada pada memori, cara kerjanya merupakan gabungan dari teknik
direct addressing dan register indirect addressing.
7.
Stack
Operand berada pada stack, operand secara
berkala dimasukan ke stack sehingga ketika
operand
dibutuhkan maka operand sudah berada pada “top of the stack”.
Teknik
pengalamatan tersebut harus dapat memenuhi kebutuhan komputasi yang dilakukan
oleh computer yang secara garis besar dapat dibagi kedalam tiga kategori
yaitu:
- Operasi load (memasukan
data).
- Operasi branch
(percabangan).
- Operasi aritmatik dan
logika.
Instruksi MOV
Singkatnya
instruksi MOV adalah menyalin isi data dari register yang satu ke register
yang lain, dengan format sebagai berikut :
MOV dest, source
;salin data source ke dest
Instruksi ini
memerintahkan pada CPU untuk memindahkan (sebenarnya adalah menyalin) operand
source menuju operand destination.Seperti contohnya, "MOV A,R0"
adalah menyalin isi R0 ke register A. Setelah instruksi ini dijalankan isi
dari kedua register tersebut adalah sama. Instruksi MOV tidak mengubah isi
dari operand Source. Program berikut ini adalah contoh untuk mengubah
Akumulator menjadi 55h (h adalah hex), lalu kemudian memindahkan nilainya
kedalam beberapa register dalam CPU. Perhatikan tanda "#" dalam
instruksi tersebut. Hal itu mengindikasikan bahwa simbol dibelakangnya adalah
sebuah nilai. Hal tersebut akan kita bahas segera.
MOV A,#55
;Mengisi A dengan nilai 55h
MOV R0,A ;Salin isi A
ke dalam R0
;Sekarang R0 = 55h
MOV R1,A ;Salin isi A
ke dalam R1
;Sekarang R1 = 55h
MOV R2,A ;Salin isi A
ke dalam R2
;Sekarang R2 = 55h
MOV R3,#95h ;Mengisi R3 dengan nilai 95h
;Sekarang R3 = 95h
MOV A,R3 ;Salin isi R3
ke dalam A
;Sekarang A = 95h
Saat menulis
program untuk mikrokontroller 8051, hal-hal berikut ini harus diperhatikan.
1. Bahwa sebuah
nilai dapat langsung diberikan pada register-register misalnya A, B, R0 s/d
R7. Namun bagaimanapun juga untuk mengindikasikan bahwa sebuah simbol adalah
sebagai sebuah nilai, dan bukan sebagai alamat atau yang lain, sebelumnya
harus diberi simbol pound ataupagar atau "#".
MOV A,#23h ;Mengisi A dengan nilai
23h
MOV R0,#12h ;Mengisi R0 dengan nilai 12h
MOV R1,#1Fh ;Mengisi R1 dengan nilai 1Fh
MOV R2,#2Bh ;Mengisi R2 dengan nilai 2Bh
MOV B,#3Ch ;Mengisi R3 dengan nilai
3Ch
MOV R7,#9Dh ;Mengisi R3 denga nilai 9Dh
MOV R6,#0F9h ;Mengisi R3 denga nilai F9h
MOV R5,#12 ;Mengisi R3 denga nilai
12 desimal
Perhatikan pada
instruksi "MOV R5,#0F9h" sebelum simbol F nampak di sana diimbuhi
oleh simbol "0" sehingga menjadi "0F9h". Hal ini penting
bagi assembler untuk membedakan apakah sebuah symbol yang dituliskan itu sebagai
sebuah angka bilangan atau sebuah identifier. Sedang identifier harus selalu
dimulai dari karakter alphabeth.
2. Jika nilai 0
s/d F kita isikan pada sebuah register 8-bit, maka akan mengubah 4-bit paling
kecil dari register tersebut. Dan kita akan mendapatkan 4-bit teratas darinya
akan dibuat menjadi 0. Misalnya dengan instruksi "MOV A,#5", maka
sejatinya instruksi tersebut adalah sama dengan "MOV A,#05h", dan
menghasilkan A = 05h. Dan dalam bilangan biner adalah A = 00000101 biner.
3. Mengisikan
sebuah nilai yang terlalu besar dari nilai yang sanggup ditampung sebuah
register akan menghasilkan error.
MOV A,#7F2h ; 7F2h > (8-bit atau FFh
atau 255 desimal)
MOV R2,#456 ; 456d > (8-bit atau FFh
atau 255 dec)
4. Untuk
mengisikan nilai ke dalam register, kita harus mengimbuhkan symbol
pound (#). Jika tidak ada simbol tersebut, maka assembler akan menganggapnya
sebagai sebuah lokasi memory. Ambil contoh "MOV A,17h" yang berarti
pindahkan isi nilai dari memory 17h ke dalam A. Sedang saat kita menginginkan
untuk mengisi A dengan nilai 17h, maka kita harus menuliskan dengan "MOV
A,#17h". Tidak adanya symbol pagar tersebut tidak akan membuat assembler
menghasilkan error. Namun Assembler akan membuatkan kode yang bukan seperti
kemauan kita, hanya karena kesalahan kecil kita dalam menulis program.
Biasanya hal ini biasa terjadi bagi para pemula.
Instruksi ADD
Instruksi ADD
adalah berdasar pada format :
ADD A,Source ;Tambahakan source ke Akumulator
Instruksi ini
menambahkan sembarang tipe data ke dalam A dan A pula bertindak sebagai
penerima hasil dari operasi. Sehingga dapat dikata operand tujuan (Dest)
selalu adalah Akumulator (A). Di bawah ini contohnya…
MOV A,#25h ;Isi A dengan nilai 25h
MOV R2,#34h ;Isi R2 dengan nilai 34h
ADD A,R2 ;Tambahakan
keduanya
;Jadi A = A + R2
Menjalankan
program di atas akan menghasilkan A = 59h (25h + 34h = 59h) dan nilai pada R2
tidak berubah setelah instruksi ADD, yakni 34h. Sekali lagi operand source
tidak akan berubah. Program di bawah ini adalah contoh program yang lebih
kompleks.
MOV R5,#25h ;Isi R7 dengan nilai 25h
MOV R7,#34h ;Isi R5 dengan nilai 34h
MOV A,#0 ;Clear isi A
menjadi 0
ADD A,R5 ;Tambahakan A
dengan isi R5
;Jadi A = A + R5
ADD A,R7 ;Tambahakan A
dengan isi R7
;Jadi A = A + R7
Program di atas
menghasilkan nilai 59h yang terdapat pada A. Ada banyak jalan menuju Roma, namun
sedapat mungkin cari jalan yang paling singkat dan cepat. Ini adalah cara
lebih cepat.
MOV A,#25h ;Isi A dengan nilai 25h
ADD A,#34h ;Tambahakan A dengan 34h
Sekali lagi
dapat kita lihat dari berbagai contoh di atas operand tujuan selalu adalah A.
Jika kita memaksa menuliskan kode seperti "ADD R2,A" tentu akan
menghasilkan error. 8051 memang hanya mendukung operasi arimatika dan logika
yang hanya menggunakan A sebagai akumulator, dan dengan kata lain operasi
tersebut dibatasi selebar 8-bit. Namun walaupun demikian hal itu sudah lebih
dari cukup untuk membuat program untuk berbagai aplikasi canggih, misalnya
robot.
Kita tahu bahwa
8051 juga memiliki 2 buah register 16-bit, walaupun dirancang bukan untuk
keperluan manipulasi data. Namun jika anda bertanya apakah CPU 8051 dapat
memanipulasi data yang lebih besar dari 8-bit?? Tentu saja, tidak ada hal
yang tidak mungkin. Seperti yang sudah kita ketahui sebelumnya bahwa komputer
8-bit, idealnya hanya memproses data sampai selebar 8-bit. Dalam kasus
tertentu beberapa perintah dalam 8051 dapat diurutkan untuk dapat menangani
data yang lebih besar, seperti data 16-bit, 24-bit, maupun 32-bit. Semua bisa
dilakukan. Tentu dengan memecah data tersebut dalam beberapa data 8-bit,dan
kemudian memprosesnya satu-persatu kemudian menyatukan kembali data sehingga
seperti hasil yang kita inginkan. Dalam prakteknya hal itu bisa dilakukan
dengan membuat kode-kode yang rumit dan teliti.
Sumber: http://rangkumanarkom.blogspot.com/2013/01/bahasa-assembler.html
|