a).Pengertian Bahasa Assembly
Bahasa assembly adalah sebuah program
yang terdiri dari instruksi-instruksi yang menggantikan kode-kode biner
dari bahasa mesin dengan “mnemonik” yang mudah diingat. Misalnya
sebuah instruksi penambahan dalam bahasa mesin dengan kode “10110011”
yang dalam bahasa assembly dapat dibuat dalam instruksi mnemonik ADD,
sehingga mudah diingat dibandingkan dengan angka 0 dan 1, dalam setiap
instruksi membutuhkan suatu operand baik berupa data langsung maupun
suatu lokasi memori yang menyimpan data yang bersangkutan. Bahasa
assembly sering juga disebut kode sumber atau kode simbolik yang tidak
dapat dijalankan oleh prosesor, sedangkan assembler adalah suatu program
yang dapat menerjemahkan program bahasa assembly ke program bahasa
mesin. bahasa mesin adalah kumpulan kode biner yang merupakan instruksi
yang bisa dijalankan oleh komputer. Program bahasa mesin sering disebut
sebagai kode objek.
Baris-baris program yang mengandung
instruksi mesin atau pengarah assembler harus mengikuti aturan program
assembler ASM51. Masing-masing baris atas beberapa field yang
dipisahkan dengan spasi atau tabulasi adalah bagian label, bagian
mnemonic, bagian operand yang bisa lebih dari satu bagian komentar dan
diakhiri dengan END.
b). Contoh-contoh dan Kegunaan Bahasa Assembly
1.
Assembly Directive (yaitu merupakan kode yang menjadi arahan bagi
assembler/compiler
untuk menata program)
Assembly Directive
|
Keterangan
|
EQU
|
Pendefinisian
konstanta
|
DB
|
Pendefinisian data
dengan ukuran satuan 1 byte
|
DW
|
Pendefinisian data
dengan ukuran satuan 1 word
|
DBIT
|
Pendefinisian data
dengan ukuran satuan 1 bit
|
DS
|
Pemesanan tempat
penyimpanan data di RAM
|
ORG
|
Inisialisasi
alamat mulai program
|
END
|
Penanda akhir
program
|
CSEG
|
Penanda penempatan
di code segment
|
XSEG
|
Penanda penempatan
di external data segment
|
DSEG
|
Penanda penempatan
di internal direct data segment
|
ISEG
|
Penanda penempatan
di internal indirect data segment
|
BSEG
|
Penanda penempatan
di bit data segment
|
CODE
|
Penanda mulai
pendefinisian program
|
XDATA
|
Pendefinisian
external data
|
DATA
|
Pendefinisian
internal direct data
|
IDATA
|
Pendefinisian
internal indirect data
|
BIT
|
Pendefinisian data
bit
|
#INCLUDE
|
Mengikutsertakan
file program lain
|
DAFTAR ASSEMBLY DIRECTIVE
2.
Instruksi (yaitu kode yang harus dieksekusi oleh CPU mikrokontroler dengan
melakukan
operasi
tertentu sesuai dengan daftar yang sudah tertanam dalam CPU).
DAFTAR INSTRUKSI
Instruksi
|
Keterangan Singkatan
|
ACALL
|
Absolute Call
|
ADD
|
Add
|
ADDC
|
Add with Carry
|
AJMP
|
Absolute Jump
|
ANL
|
AND Logic
|
CJNE
|
Compare and Jump if Not Equal
|
CLR
|
Clear
|
CPL
|
Complement
|
DA
|
Decimal Adjust
|
DEC
|
Decrement
|
DIV
|
Divide
|
DJNZ
|
Decrement and Jump if Not Zero
|
INC
|
Increment
|
JB
|
Jump if Bit Set
|
JBC
|
Jump if Bit Set and Clear Bit
|
JC
|
Jump if Carry Set
|
JMP
|
Jump to Address
|
JNB
|
Jump if Not Bit Set
|
JNC
|
Jump if Carry Not Set
|
JNZ
|
Jump if Accumulator Not Zero
|
JZ
|
Jump if Accumulator Zero
|
LCALL
|
Long Call
|
LJMP
|
Long Jump
|
MOV
|
Move from Memory
|
MOVC
|
Move from Code Memory
|
MOVX
|
Move from Extended Memory
|
MUL
|
Multiply
|
NOP
|
No Operation
|
ORL
|
OR Logic
|
POP
|
Pop Value From Stack
|
PUSH
|
Push Value Onto Stack
|
RET
|
Return From Subroutine
|
RETI
|
Return From Interrupt
|
RL
|
Rotate Left
|
RLC
|
Rotate Left through Carry
|
RR
|
Rotate Right
|
RRC
|
Rotate Right through Carry
|
SETB
|
Set Bit
|
SJMP
|
Short Jump
|
SUBB
|
Subtract With Borrow
|
SWAP
|
Swap Nibbles
|
XCH
|
Exchange Bytes
|
XCHD
|
Exchange Digits
|
XRL
|
Exclusive OR Logic
|
1. Acall
1.(absolute call)
Instruksi acall digunakan untuk memanggil sub rutin program
Contoh :
Start:
Acall tunda ; panggil procedure penundaan waktu
….
Tunda: ; label tunda
Mov r7,#0ffh ; isikan register 7 dengan data 0ffh(255
2. Add (add immediate data)
Instruksi ini akan menambah 8 bit data langsung ke dalam
Isi akumulator dan menyimpan
hasilnya pada akumulator.
Contoh : Add a, #data
Add a, #@r1 ; add indirect address
Add a, r6 ; add register
Add a, 30h ; add memori
3. Addc (add carry plus immediate data to accumulator)
Instruksi ini akan menambahkan isi carry flag (0 atau 1) ke dalam
isi akumulator. Data langsung 8 bit ditambahkan ke akumulator
Contoh: Addc a,#012h
Addc a, @r1 ; add carry plues indirect address
4. Ajmp (absolute jump)
Ajmp adalah perintah jump mutlak. Jump
dalam 2 kb dimulai dari alamat yang mengikuti perintah ajmp. Ini mentransfer
kendali program ke lokasi dimana alamat dikalkulasi dengan cara yang sama
dengan perintah acall. Konter program ditambahkan dua kali dimana perintah ajmp
adalah perintah 2-byte. Konter program di-load dengan a10 – a0 11 bits, untuk
membentuk alamat tujuan 16-bit.
5. Anl (logical and memori ke akumulator)
Instruksi ini mengand-kan isi alamat data
dengan isi akumulator
Contoh : Anl a,#0001000b ;data acumulator akan dikalikan dengan
00010000 biner
Anl a, 57h,#01h; logical and immediate data ke memori
6. Cjne (compare indirect address to immediate data)
Instruksi ini akan membandingkan data
langsung dengan lokasi memori yang dialamati oleh register r atau akumulator a.
Apabila tidak sama maka instruksi akan menuju ke alamat kode.
Format : Cjne r,#data,alamat kode
Contoh:
Cjne r7,#001h,command0
Mov a,stepcontrol
Ajmp command1
7. Clr (clear accumulator)
Instruksi clr akan mereset data akumulator
menjadi 00h.
Format : Clr a
8. Cpl (complement accumulator)
Instruksi cpl akan mengkomplemen isi
akumulator
Contoh : Cpl a
Cpl c ; mengkomplemen isi carry flag
9. Da (decimal adjust accumulator)
Instruksi da akan mengatur isi akumulator
ke padanan bcd, steleah penambahan dua angka bcd.
10. Dec (decrement indirect address)
Instruksi dec akan mengurangi isi lokasi
memori yang ditujukan oleh register r dengan 1, dan hasilnya disimpan pada
lokasi tersebut.
Contoh: Dec 40h
Dec r7 ; decrement register
11. Div (divide accumulator by b)
Instruksi div akan membagi isi akumulator
dengan isi register b. Akumulator berisi hasil bagi, register b berisi sisa
pembagian.
Contoh : Mov b,#1h
Div ab
12. Djnz (decrement register and jump id not zero)
Instruksi djnz akan mengurangi nilai
register dengan 1 dan jika hasilnya sudah 0 maka instruksi selanjutnya akan
dieksekusi. Jika belum 0 akan menuju ke alamat kode.
Format : Djnz rr,alamat kode
13. Inc (increment indirect address)
Instruksi inci akan menambahkan isi memori
dengan 1 dan menyimpannya pada alamat tersebut.
Contoh: Inc a
Inc r7 ; increment register
14. Jb (jump if bit is set)
Instruksi ini akan membaca data
Per satu bit, jika data tersebut adalah 1 maka akan menuju ke alamat
kode dan jika 0 tidak akan menuju ke alamat kode.
Format : Jb alamat bit,alamat kode
15. Jbc (jump if bit set and clear bit)
Bit jbc, perintah rel menguji yang
terspesifikasikan secara bit. Jika bit di-set, maka jump dilakukan ke alamat
relatif dan yang terspesifikasi secara bit di dalam perintah dibersihkan.
Segmen program berikut menguji bit yang kurang signifikan (lsb: Least
significant byte), dan jika diketemukan bahwa ia telah di-set, program melompat
ke read lokasi. Perintah tersebut juga membersihkan lsb dari akumulator.
16. Jc (jump if carry is set)
Instruksi jc akan menguji isi carry flag.
Jika berisi 1, eksekusi menuju ke alamat kode, jika berisi 0, instruksi
selanjutnya yang akan dieksekusi.
17. Jmp (jump to sum of accumulator and data pointer)
Instruksi jmp untuk memerintahkan loncat
kesuato alamat kode tertentu.
Format : Jmp alamat kode.
Contoh :
Loop:
…
Rl a ; geser data akumulator ke kiri
Acall long_delay ; panggil procedure penundaan waktu
Jmp loop ; loncat ke procedure loop
18. Jnb (jump if bit is not set)
Instruksi jnb akan membaca data per satu
bit, jika data tersebut adalah 0 maka akan menuju ke alamat kode dan jika 1
tidak akan menuju ke alamat kode.
Format : Jnb alamat bit,alamat kode
19. Jnc (jump if carry not set)
Perintah jnc menguji bit carry, dan jika
tidak di-set, maka sebuah lompatan akan dilakukan ke alamat relatif yang telah
ditentukan. Sebagai contoh, perintah berikut akan menyebabkan loop tanpa henti,
karena carry dibersihkan oleh perintah clr c dan jnc akan selalu menyebabkan
lompatan ke lokasi yang sama yang berlabel ‘loop’.
20. Jnz ( jump if accumulator not zero )
Jnz adalah mnemonik untuk instruksi jump
if not zero (lompat jika tidak nol). Dalam hal ini suatu lompatan akan terjadi
bilamana bendera nol dalam keadaan “clear”, dan tidak akan terjadi lompatan
bilamana bendera nol tersebut dalam keadaan set. Andaikan bahwa jnz 7800h
disimpan pada lokasi 2100h. Jika z=0, instruksi berikutnya akan berasal dari
lokasi 7800h: Dan bilamana z=1, program akan turun ke instruksi urutan
berikutnya pada lokasi 2101h.
21. Jz ( jump if accumulator is zero )
Perintah ini menguji konten-konten
akumulator. Jika bukan nol, maka lompatan dilakukan ke alamat relatif yang
ditentukan dalam perintah.
22. Lcall ( long call )
Lcall memungkinkan panggilan ke subrutin
yang berlokasi dimanapun dalam memori program 64k. Operasi lcall berjalan
seperti berikut:
(i) menambahkan ke dalam konter program sebanyak 3, karena
perintahnya adalah perintah 3-byte.
(ii) menambahkan penunjuk stack sebanyak 1.
(iii) menyimpan byte yang lebih rendah dari konter program ke dalam
stack.
(iv) menambahkan penunjuk stack.
(v) menyimpan byte yang lebih tinggi dari program ke dalam stack.
(vi) me-load konter program dengan alamat tujuan 16-bit.
Sebagai contoh, jika penunjuk stack dimulai pada 54h, maka perintah
lcall 0400h di lokasi 0100h dalam memori program akan menghasilkan nilai sp, pc
dan stack,.
23. Ljmp ( long jump )
Long jump memungkinkan lompatan tak
bersyarat kemana saja dalam lingkup ruang memori program 64k. Lcall adalah
perintah 3-byte. Alamat tujuan 16-bit ditentukan secara langsung dalam perintah
tersebut. Alamat tujuan ini di-load ke dalam konter program oleh perintah ljmp.
Sebagai contoh, untuk melompat ke lokasi 0200h, kita dapat menulis “ljmp
0200h”.
24. Mov ( move from memory )
Instruksi ini untuk memindahkan isi
akumulator/register atau data dari nilai luar atau alamat lain.
Contoh :
Mov a,#40h
Mov @ro,a
Mov a, p3
Mov c, p1.0
Mov dptr, #20h
Movc a, @a+dptr ; pindahkan code memory offset dari data pointer ke
a
Movx @dptr, a ; pindahkan akumulator ke memoeri eksterlah yang
dialamati oleh
; data pointer
25. Movc ( move from codec memory )
Fungsi : Mengisikan (move) byte kode
(code) atau byte konstanta (constant). Instruksi movc akan mengisi accumulator
dengan byte kode atau konstanta dari program memory. Alamat byte tersebut
adalah hasil penjumlahan unsigned 8 bit pada accumulator dan 16 bit register
basis yang dapat berupa data pointer atau program counter. Instruksi ini tidak
mempengaruhi flag apapun juga.
26. Movx (move accumulator to external memory addressed by data
pointer)
Instruksi pop akan memindahkan isi
akumulator ke memori data eksternal yang alamatnya ditunjukkan oleh isi data
pointer.
Contoh: Movx @dptr,a
Movx @r0,a
27. Mul ( multiply )
Fungsi : Perkalian (multiply). Mul ab akan
mengalikan unsigned 8 bit integer pada accumulator dan register b. Byte rendah
(low order) dari hasil perkalian akan disimpan dalam accumulator sedangkan byte
tinggi (high order) akan disimpan dalam register b. Jika hasil perkalian lebih
besar dari 255 (0ffh), overflow flag akan bernilai ‘1’. Jika hasil perkalian
lebih kecil atau sama dengan 255, overflow flag akan bernilai ‘0’. Carry flag
akan selalu
Dikosongkan.
28. Nop ( no operation )
Fungsi : Tidak ada (no) operasi. Eksekusi
program akan dilanjutkan ke instruksi berikutnya. Selain pc, instruksi ini
tidak mempengaruhi register atau flag apapun juga.
29. Orl (logical or immediate data to accumulator)
Instruksi orl sebagai instruksi gerbang
logika or yang akan menjumlahkan accumulator terhadap nilai yang ditentukan.
Format : Orl a,#data
Contoh : Orl a,#0001000b
Ini berarti data acumulator akan dijumlahkan dengan 00010000 biner
Jika a bernilai 11100001 maka hasilnya adalah 11110001
30. Pop (pop stack to memory)
Instruksi pop akan menempatkan byte yang
ditunjukkan oleh stack pointer ke suatu alamat data.
Contoh: Pop psw
Pop 03h
31. Push (push memory onto stack)
Instruksi ini akan menaikkan stack pointer
kemudian menyimpan isinya ke suatu alamat data pada lokasi yang ditunuk oleh
stack pointer.
Contoh: Push 30h
32. Ret (return from subroutine)
Intruksi untuk kembali dari suatu subrutin
program ke alamat terakhir subrutin tersebut di panggil.
33. Reti ( return from interrupt )
Fungsi : Kembali (return) dari interrupt.
Reti akan mengambil nilai byte tinggi dan rendah dari pc dari stack dan
mengembalikan kondisi logika interrupt agar dapat menerima interrupt
Lain dengan prioritas yang sama dengan prioritas interrupt yang baru
saja diproses. Stack pointer akan dikurangi dengan 2. Instruksi ini tidak
mempengaruhi flag apapun juga. Nilai psw tidak akan dikembalikan secara
otomatis ke kondisi sebelum interrupt. Eksekusi program akan dilanjutkan pada
alamat yang diambil tersebut. Umumnya alamat tersebut adalah alamat setelah
lokasi dimana terjadi interrupt. Jika interrupt dengan prioritas sama atau
lebih rendah tertunda saat reti dieksekusi, maka satu instruksi lagi akan
dieksekusi sebelum interrupt yang tertunda tersebut diproses.
34. Rl (rotate accumulator left)
Instruksi rl akan memutar setiap bit dalam
akumulator satu posisi ke kiri.
Contoh : Rl a
Rlc a ; rotasi akumulator dan carry flag ke kiri
Rr a ; rotasi akumulator ke kanan
35. Rlc ( rotate left through carry )
Fungsi : Memutar (rotate) accumulator ke
kiri (left) melalui carry flag. Kedelapan bit accumulator dan carry flag akan
diputar satu bit ke kiri secara bersama-sama. Bit 7 akan dirotasi ke carry
flag, nilai carry flag akan berpindah ke posisi bit 0. Instruksi ini tidak
mempengaruhi flag lain.
36. Rr ( rotate right )
Fungsi : Memutar (rotate) accumulator ke
kanan (right). Kedelapan bit accumulator akan diputar satu bit ke kanan. Bit 0
akan dirotasi ke posisi bit 7. Instruksi ini tidak mempengaruhi flag apapun
juga.
37. Rrc ( rotate right through carry )
Fungsi : Memutar (rotate) accumulator ke kanan
(right) melalui carry flag. Kedelapan bit accumulator dan carry flag akan
diputar satu bit ke kanan secara bersama-sama. Bit 0 akan dirotasi ke carry
flag, nilai carry flag akan berpindah ke posisi bit 7. Instruksi ini tidak
mempengaruhi flag lain.
38. Setb (set carry flag)
Instruksi setb akan menset carry flag
Contoh : Setb c
39. Sjmp (short jump)
Sebuah short jump mentransfer kendali ke
alamat tujuan dalam 127 bytes yang mengikuti dan 128 yang mengawali perintah
sjmp. Alamat tujuannya ditentukan sebagai sebuat alamat relative 8-bit. Ini
adalah jump tidak bersyarat. Perintah sjmp menambahkan konter program sebanyak
2 dan menambahkan alamat relatif ke dalamnya untuk mendapatkan alamat tujuan.
Alamat relatif tersebut ditentukan dalam perintah sebagai ‘sjmp rel’.
40. Subb ( subtract with borrow )
Fungsi : Pengurangan (subtract) dengan
peminjaman (borrow). Subb mengurangi variabel yang tertera pada operand kedua
dan carry flag sekaligus dari accumulator dan menyimpan hasilnya pada
accumulator. Subb akan memberi nilai ‘1’ pada carry flag jika peminjaman ke bit
7 dibutuhkan dan mengosongkan c jika tidak dibutuhkan peminjaman. Jika c
bernilai ‘1’ sebelum mengeksekusi subb, hal ini menandakan bahwa terjadi
peminjaman pada proses pengurangan sebelumnya, sehingga carry flag dan source
byte akan dikurangkan dari accumulator secara bersama-sama. Ac akan bernilai
‘1’ jika peminjaman ke bit 3 dibutuhkan dan mengosongkan ac jika tidak
dibutuhkan peminjaman. Ov akan bernilai ‘1’ jika ada peminjaman ke bit 6 namun
tidak ke bit 7 atau ada peminjaman ke bit 7 namun tidak ke bit 6. Saat
mengurangi signed integer, ov menandakan adanya angka negative sebagai hasil
dari pengurangan angka negatif dari angka positif atau adanya angka positif
sebagai hasil dari pengurangan angka positif dari
Angka negative. Addressing mode yang dapat digunakan adalah:
Register, direct, register
Indirect, atau immediate data.
41. Swap ( swap nibbles )
Fungsi : Menukar (swap) upper nibble dan
lower nibble dalam accumulator. Swap a akan menukar nibble (4 bit) tinggi dan
nibble rendah dalam accumulator. Operasi ini dapat dianggap sebagai rotasi 4
bit dengan rr atau rl. Instruksi ini tidak mempengaruhi flag apapun juga.
42. Xch ( exchange bytes )
Fungsi : Menukar (exchange) accumulator
dengan variabel byte. Xch akan mengisi accumulator dengan variabel yang tertera
pada operand kedua dan pada saat yang sama juga akan mengisikan nilai
accumulator ke dalam variabel tersebut. Addressing mode yang dapat digunakan
adalah: Register, direct, atau register indirect.
43. Xchd ( exchange digits )
Fungsi : Menukar (exchange) digit. Xchd
menukar nibble rendah dari accumulator, yang umumnya mewakili angka
heksadesimal atau bcd, dengan nibble rendah dari internal data memory yang
diakses secara indirect. Nibble tinggi kedua register tidak akan terpengaruh.
Instruksi ini tidak mempengaruhi flag apapun juga.
44. Xrl ( exclusive or logic )
Fungsi : Logika exclusive or untuk
variabel byte xrl akan melakukan operasi bitwise logika exclusive or antara
kedua variabel yang dinyatakan. Hasilnya akan disimpan pada destination byte.
Instruksi ini tidak mempengaruhi flag apapun juga. Kedua operand mampu
menggunakan enam kombinasi addressing mode. Saat destination byte adalah
accumulator, source byte dapat berupa register, direct, register indirect, atau
immediate data. Saat destination byte berupa direct address, source byte dapat
berupa accumulator atau immediate data.
Tidak ada komentar:
Posting Komentar