BAHASA ASSEMBLER
BAHASA ASSEMBLY
Instruksi mesin dinyatakan dengan
pola 0 dan l. Pola semacam itu sangat sulit untuk dijelaskan pada saat membahas
atau menyiapkan program. Oleh karena itu, kita menggunakan nama simbolik untuk
menyatakan pola tersebut. Sejauh ini kita telah menggunakan kata-kata biasa
seperti Move, Add, Increment, dan Branch, untuk instruksi operasi yang
menyatakan pola kode biner yang sesuai. Pada saat menulis program untuk
komputer tertentu, katakata tersebut biasanya diganti dengan akronim yang
disebut mnemonic, seperti MOV, ADD, INC, dan BR Serupa dengan kita menggunakan
notasi R3 untuk mengacu pada register 3, dan LOC untuk mengacu pada lokasi
memori. Set lengkap nama simbolik semacam dan aturan penggunaannya membentuk
bahasa pemrograman, yang biasanya disebut sebagai bahasa assembly. Set aturan
untuk menggunakan mnemonic dalam spesifikasi instruksi dan program lengkap
disebut syntax bahasa.
Program yang ditulis dalam bahasa
assembly dapat secara otomatis ditranslasikan ke rangkaian instruksi mesin oleh
suatu program yang disebut assembler. Program assembler adalah salah satu
kumpulan program yang merupakan bagian dari software sistem. Assembler, seperti
halnya program yang lain, disimpan sebagai rangkaian instruksi mesin dalam
memori komputer. Program user biasanya dimasukkan ke dalam komputer melalui
keyboard dan disimpan dalam memori atau disk magnetik. Pada titik ini, program
user hanyalah kumpulan baris karakter alfanumerik. Pada saat program assembler
dieksekusi, program tersebut membaca program user, menganalisanya, dan kemudian
menghasilkan program bahasa mesin yang diinginkan. Bahasa mesin tersebut berisi
pola 0 dan 1 yang menetapkan instruksi yang akan dieksekusi oleh komputer
tersebut. Program user dalam format teks alfanumerik aslinya disebut source
program, dan program bahasa mesin yang diassemble disebut object program.
Bahasa assembly untuk suatu komputer mungkin case sensitive
atau mungkin tidak, sehingga, komputer tersebut bisa membedakan antara huruf
kapital dan huruf kecil atau tidak dapat
Kita akan menggunakan huruf
kapital mark menunjukkan semua nama dan label dalam contoh kita untuk dapat
meningkatkan kemudahan pembacaan teks. Misalnya, kita akan menuliskan instruksi
Move sebagai berikut MOVE R0, SUM MOVE mnemonic menyatakan pola biner, atau OP
code, untuk operasi yang dilakukan oleh instruksi tersebut. Assembler
mentranslasi rnnemonic ini menjadi OP code biner yang dipahatni komputer.
Mnemonic OP code diikuti oleh setidaknya satu karakter spasi kosong. Kemudian
informasi yang menyatakan operand ditetapkan. Dalam contoh kita, source operand
berada dalam register R0. Informasi ini diikuti oleh spesifikasi destination
operand, dipisah dari source operand dengan koma, tanpa jeda kosong.
Destination operand berada dalam
lokasi memori yang alamat binernya dinyatakan dengan nama SUM. Karena terdapat
beberapa mode pengalamatan yang dapat digunakan untuk menetapkan lokasi
operand, maka bahasa assembly barns mengindikasikan mode mana yang digunakan.
Misalnya, nilai numerik atau nama yang digunakannya, seperti SUM pada instruksi
sebelumnya, dapat digunakan untuk menunjukkan mode Absolute. Sehingga instruksi
ADD #5, R3 menambahkan bilangan 5 ke isi register R3 dan meletakkan hasilnya
kembali ke register R3. tanda sharp bukanlah cara satu satunya untuk
menunjukkan mode pengalamatan Immediate. Dalam beberapa bahasa assembly, mode
pengalamatan yang dimaksud dinyatakan dalam mnemonic OPcode.
Dalam hal ini, suatu instruksi memiliki
mnonemonic OPcode yang berbeda untuk mode peugalamatan yang berbeda. Misalnya,
iustruksi Add sebelumnya dapat ditulis sebagai berikut ADDI 5, R3 Akhiran I
dalam mnemonic ADDI menyatakan bahwa source operand dinyatakan dalam mode
pengalamatan Immediate. Pengalamatan Indirect biasanya dinyatakan dengan
meletakkan tanda kurung di sekitar nama atau simbol yang menunjukkan pointer ke
operand. Misalnya, jika nomor 5 ditempatkan dalam lokasi memori yang alamatnya
disimpan dalam register R2, maka aksi yang diinginkan dapat ditetapkan sebagai
berikut MOVE #5, (R2) atau mungkin MOVE 5, (R2)
OPERASI
ARITMATIKA
1. OPERASI PERNAMBAHAN
1.1. ADD
Untuk menambah dalam bahasa assembler digunakan perintah ADD
dan ADC serta INC. Perintah ADD digunakan dengan syntax :
ADD Tujuan, Asal
Perintah ADD ini akan
menambahkan nilai pada Tujuan dan Asal. Hasil yang didapat akan ditaruh pada
Tujuan, dalam bahasa pascal sama dengan instruksi Tujuan:=Tujuan + Asal.
Sebagai contohnya :
MOV AH,15h ; AH:=15h
MOV AL,4 ; AL:=4
ADD AH,AL ; AH:=AH+AL, jadi AH=19h
Perlu anda perhatikan bahwa pada
perintah ADD ini antara Tujuan dan Asal harus mempunyai daya tampung yang sama,
misalnya register AH(8 bit) dan AL(8bit), AX(16 bit) dan BX(16 bit). Mungkin
ada yang bertanya-tanya, apa yang akan terjadi bila Tujuan tempat hasil
penjumlahan disimpan tidak mencukupi seperti pertambahan 1234h dengan F221h.
1234 h Biner --> 0001 0010
0011 0100
F221 h Biner --> 1111 0010
0010 0001
---------- +
--------------------- +
10455 h 1 0000 0100 0101 0101
Pada pertambahan diatas dapat
dilihat bahwa pertambahan bilangan 1234 dengan F221 akan menghasilkan nilai
10455. Supaya lebih jelas dapat anda lihat pada pertambahan binernya dihasilkan
bit ke 17, padahal register terdiri atas 16 bit saja. Operasi pertambahan yang
demikian akan menjadikan carry flag menjadi satu
2. OPERASI PENGURANGAN
2.1. SUB
Untuk Operasi pengurangan dapat digunakan perintah SUB
dengan syntax:
SUB Tujuan, Asal
Perintah SUB akan mengurangkan
nilai pada Tujuan dengan Asal. Hasil yang didapat akan ditaruh pada Tujuan,
dalam bahasa pascal sama dengan instruksi
Tujuan:=Tujuan-Asal.
Contoh :
MOV AX,15 ; AX:=15
MOV BX,12 ; BX:=12
SUB AX,BX ; AX:=15-12=3
SUB AX,AX ; AX=0
Untuk menolkan suatu register bisa anda kurangkan dengan
dirinya sendiri seperti SUB AX,AX.
2.2. SBB
Seperti pada operasi penambahan,
maka pada operasi pengurangan dengan bilangan yang besar(lebih dari 16 bit), bisa
anda gunakan perintah SUB disertai dengan SBB(Substract With Carry). Perintah
SBB digunakan dengan syntax:
SBB Tujuan,asal
Perintah SBB akan mengurangkan
nilai Tujuan dengan Asal dengan cara yang sama seperti perintah SUB, kemudian
hasil yang didapat dikurangi lagi dengan Carry Flag
(Tujuan:=Tujuan-Asal-CF).
3.OPERASI PERKALIAN
Untuk perkalian bisa digunakan perintah MUL dengan syntax:
MUL Sumber
Sumber disini dapat berupa suatu
register 8 bit(Mis:BL,BH,..), register 16 bit(Mis: BX,DX,..) atau suatu
varibel. Ada 2 kemungkinan yang akan terjadi pada perintah MUL ini sesuai
dengan jenis perkalian 8 bit atau 16 bit. Bila Sumber merupakan 8 bit seperti
MUL BH maka komputer akan mengambil nilai yang terdapat pada BH dan nilai pada
AL untuk dikalikan. Hasil yang didapat akan selalu disimpan pada register AX.
Bila sumber merupakan 16
bit seperti MUL BX maka komputer akan mengambil nilai yang terdapat pada BX dan
nilai pada AX untuk dikalikan. Hasil yang didapat akan disimpan pada register
DX dan AX(DX:AX), jadi register DX menyimpan Word tingginya dan AX menyimpan
Word rendahnya.
4. OPERASI PEMBAGIAN
Operasi pada pembagian pada
dasarnya sama dengan perkalian. Untuk operasi pembagian digunakan perintah DIV
dengan syntax:
DIV Sumber
Bila sumber merupakan
operand 8 bit seperti DIV BH, maka komputer akan mengambil nilai pada register
AX dan membaginya dengan nilai BH. Hasil pembagian 8 bit ini akan disimpan pada
register AL dan sisa dari pembagian akan disimpan pada register AH. Bila sumber
merupakan operand 16 bit seperti DIV BX, maka komputer akan mengambil nilai
yang terdapat pada register DX:AX dan membaginya dengan nilai BX. Hasil
pembagian 16 bit ini akan disimpan pada register AX dan sisa dari pembagian
akan disimpan pada register DX
5. OPERASI STRING
Suatu String dalam Bahasa Pascal
dapat dioperasikan dengan berbagai macam tujuan. Pascal menyediakan berbagai
prosedur standar dan fungsi stanfar untuk opersai string.
Prosedur Standar Fungsi Standar
DELETE 1. CONCAT
INSERT 2. COPY
STR 3. POS
VAL 4. LENGTH
Dalam Operasinya String hanya
mempunyai sebuah operator, yaitu operator ‘+’. Bila operator ini digunakan
untuk dua buah elemen string, maka akan menjadi penggabungan dua buah string
menjadi satu.
Panjang Maksimal suatu string yang
diijinkan oleh Pascal adalah 255 karakter
Procedure Standart pada String
1. DELETE (Procedure)
→ menghapus substring dari suatu
string, dimulai dari posisi i, sebanyak n →String
BU :
DELETE ( string, i, n)
Cat. Jika jumlah I lebih besar dari jumlah karakter dalam
string, maka tidak ada karakter yang terhapus
2 INSERT
→ insert (menyisipkan) substring
(string1) dalam suatu string (string2), pada posisi I → String
BU :
INSERT (string1, string2, i)
Cat. Apabila hasil penyisipan menjadi String yang panjangnya
lebih dari 255 karakter, maka yang dianggap signifikan hanya sampai 255
karakter saja.
3 STR
→ mengubah bentuk numerik (x) menjadi nilai string (s)
BU :
STR (x [ : n [ :m ] ], string)
Nilai ‘n’ menunjukkan format panjang
dari nilai utuh dan nilai ‘m’ menunjukkan format panjang desimal (nilai
dibelakang koma)
4 VAL
→ mengubah nilai suatu argumen string menjadi nilai
numerik
BU :
Val(Var_string_angka,Var_nilai,kode)
posisi salah
Cat. Var_string_angka berisi data
string yang berupa angka Var_nilai berisi data hasil konversi.
Jika terjadi kesalahan data maka akan posisi kesalahan
disimpan pada Kode
Fungsi Standar pada Operasi String
1 CONCAT → menggabungkan dua string secara berurut
BU :
ConCat(S1,S2[,S3,…, Sn])
Cat. Fungsi standar ini mempunyai
operasi yang sama dengan operator string ‘+’, yaitu merangkai beberapa nilai
string
2 COPY → mengambil bagian string (substring) dari
suatu string, dimulai dari posisi i, sebanyak n → String
BU :
COPY (String, i, n )
3 POS→ Mencari posisi letak dari suatu substring yang
ada dalam suatu string → Interger
BU :
POS (subString, string)
Cat : Jika SubString yang dicari
terdiri dari beberapa karakter, maka dalam pencariannya akan mencari deretan
karakter yang sesuai.
4 LENGTH → memberikan nilai panjang atau jumlah
karakter dari suatu string → integer
C/: VAR s : string[20];
i : word;
BEGIN
. s := ‘program pascal’;
i := LENGTH(s);
WriteLn(‘Panjang string : ’, ‘‘‘‘,s, ‘‘‘‘ ,‘ adalah ‘, I, ‘
karakter’); END.
Panjang string “program pascal” adalah 14 karakter
|
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 :
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
|

No comments:
Post a Comment