BAHASA ASSEMBLER
Element dari Bahasa Assembler
Bahasa assembly dikategorikan
sebagai bahasa tingkat rendah (low level languange). Berbeda halnya dengan bahasa tingkat tinggi
yang berlaku umum, bahasa rakitan biasanya mendukung secara spesifik untuk
suatu ataupun beberapa jenis arsitektur komputer tertentu. Ini untuk menggambarkan kekhususannya sebagai
bahasa yang berorientasi pada machine dependent. Untuk membandingkan bahasa
mesin dan bahasa assembly, kita dapat melihatnya dari tiga karakteristik
berikut :
1.
Mnemonic
operation code.
Sebagai pengganti numeric operation code (opcodes) yang digunakan pada bahasa
mesin, digunakankanlah mnemonic code pada bahasa assembly. Selain kemudahan
dalam penulisannya dibandingkan dari bahasa mesin juga mendukung pelacakan
kesalahan seperti kesalahan penulisan operation code berikut menunjukkan daftar
instuksi operation codes dari bahasa dan bahasa assembly.
Instuction
Op Code
|
Assembly
Mnemonic
|
Remarks
|
00
|
STOP
|
Operand pertama yang diasumsikan sebagai akumulator
|
01
|
ADD
|
Operand
pertama yang diasumsikan sebagai akumulator
|
02
|
SUB
|
Operand
pertama yang diasumsikan sebagai akumulator
|
03
|
MULT
|
Operand
pertama yang diasumsikan sebagai akumulator
|
04
|
LOAD
|
Memannggil
akumulator
|
05
|
STORE
|
Menyimpan
akumulator ke dalam lokasi storage
|
06
|
TRANS
|
Mentransfer
control ke alamat yang disebutkan
|
07
|
TRIM
|
Mentransfer
jika akumulator < 0
|
08
|
DIV
|
Membagi akumulator dengan isi
lokasi storage
|
09
|
READ
|
Membaca kartu
pada lokasi storage
|
10
|
PRINT
|
Mencetak isi lokasi storage
|
11
|
LIR
|
Memanggil
index register dengan 3 digit terakhir dari storage operand
|
12
|
IIR
|
Menaikkan
index register dengan 3 digit terakhir dari storage operand
|
13
|
LOOP
|
Mengurangi
index register, jika isi baru, 0 kemudian sama dengan TRANS
|
2. Symbolic
operand specification. Penamaan simbol diasosiasikan sebagai suatu data
atau instruksi. Operand lebih menunjukkan symbolic reference dibandingkan
dengan alamat mesin suatu data atau instruksi. Hal ini akan mempermudah pada
saat harus dilakukan modifikasi program.
3. Declaration
of data/storage area. Data dapat dinyatakan dalam notasi desimal. Ini
dilakukan untuk mencegah konversi secara manual dari konstanta ke dalam
representasi internal mesin. Sebagai contoh :
-5 menjadi (11111010)2 atau
10.5 menjadi (41A80000)16
Suatu
statement bahasa assembly mempunyai bentuk umum sebagai berikut :
[Label]
Menmonic OpCode Operand [operand…]
Tanda
kurung siku menunjukkan isi di dalamnya boleh digunakan atau tidak dalam
statement tersebut, sebagai contoh : label bersifat optional. Jika label digunakan,
hal tersebut menujukkan suatu symbolic name akan dibuat dalam machine word
untuk keperluan assembly statement. Bila digunakan lebih dari satu operand,
digunakan tanda “koma” untuk memisahkannya. Jika digunakan index, nomor index
register ditunjukan dalam sebuah simbol, seperti contoh berikut :
AGAIN
LOAD NUMBER(4)
Dimana ‘4’ menunjukkan register yang
memiliki index. AGAIN diasosiasikan dengan instruksi mesin yang dihasilkan
untuk statement LOAD.
Mengapa menggunakan Bahasa Assembler ?
Ada beberapa dasar
alasan menggunakan bahasa rakitan dilihat dari sudut pandang penggunaannya:
·
Bahasa rakitan dibandingkan dengan bahasa mesin, bahasa
rakitan merupakan representasi atas bahasa mesin yang dirancang agar lebih
mudah dipahami oleh manusia. Dengan menggunakan bahasa rakitan, seorang
programmer dapat lebih mudah mengingat instruksi-instruksi dengan menggunakan
simbol yang lebih dapat dimengerti dibandingkan bila menggunakan simbol mnemonic
kode mesin secara langsung. Demikian halnya pula dengan mekanisme lompatan yang
umum terdapat dalam bahasa mesin yang biasanya menggunakan alamat memori,
programmer dapat lebih mudah menggunakan fasilitas labeling yang terdapat
bahasa rakitan dibandingkan menggunakan alamat memori tertentu dalam kode mnemonic.
·
Bahasa rakitan dibandingkan dengan bahasa tingkat tinggi, bahasa
rakitan memungkinkan programmer untuk mengontrol serta memanfaatkan secara
penuh kapabilitas yang terdapat atas suatu perangkat keras, berbeda halnya
dengan bahasa pemrograman tingkat tinggi yang memiliki banyak keterbatasan
dalam pemanfaatan secara penuh suatu perangkat keras. Bahasa rakitan
menjanjikan tingkat unjuk kerja yang maksimum karena sifatnya yang
menerjemahkan secara langsung instruksi rakitan menjadi instruksi mesin,
berbeda halnya dengan bahasa pemrograman tingkat tinggi yang biasanya
menerjemahkan sebuah instruksi menjadi sejumlah kode mesin.
Program Assembly mengenal tiga jenis statement
Imperative Statement
Statement imperative dalam
bahasa assembly ditunjukan dengan suatu tindakan yang dikerjakan selama
eksekusi program assembly. Karena itu setiap statement imperative
ditranslasikan ke dalam instruksi mesin.
Format instruksi :
Sign opcode index Operand Address
register
Declarative Statement
Statement declarative dalam
bahasa assembly menunjukkan konstanta atau storage area pada suatu program.
Sebagai contoh :
A DS 1
secara sederhana storage
area sebesar 1 word ditunjukkan dengan sebuah label A. DS di sini menunjukkan
Declare Storage (DS).
Suatu konstanta
dideklarasikan melalui Declare Constant (DC) statement, contohnya :
ONE DC ‘1’
maksud dari statement di
atas adalah label ONE berisi konstanta 1. Programmer dapat mendeklarasikan
kontanta dalam desimal, binary, hexadesimal, dsb. Assembler akan mengkonversi
bentuk tersebut ke dalam bentuk internal yang tepat.
Beberapa assembler sering
pula menggunakan’literal’ khususnya pada konstanta yang dipakai sebagai
operand, seperti contoh berikut :
ADD ONE ADD = ‘1’
- -
- -
ONE DC ‘1’
Penggunaan tanda “=” pada posisi awal suatu operand menunjukkan
sebuah literal. Nilai konstanta yang ditulis dengan cara demikian sama dengan
nilai yang dihasilkan bila menggunakan statement DC.
Assembler Directive
Statement jenis ini tidak merepresentasikan instruksi mesin ke
dalm suatu objek program atau mengalokasikan storage untuk konstanta atau
variable program. Sebaliknya, statement ini secara langsung mengarahkan
assembler untukmengambil alih aksi selama proses assembling program. Statement
ini digunakan untuk menunjukkan bagaimana input program assembly dibentuk,
sebagi contoh : START 100
statement tersebut merupakan kata pertama dari objek program yang
dibuat oleh assembler untuk menempatkan lokasi mesin pada alamat ‘100’.
Begitupula dengan statement : END, yang mengindikasikan tidak ada lagi bahasa
statement bahasa assembly yang akan diproses.
Instruksi Dasar
Sebagian besar instruksi dasar adalah instruksi MOV.
Instruksi ini memindahkan data dari salah satu lokasi ke lokasi lainnya,
seperti operator assignment dalam bahasa pemrograman beraras tinggi.
Terdiri dari dua operand:
mov dest, src
Data yang dispesifikasikan oleh src
disalin ke dest. Satu pembatasan adalah bahwa keduanya tidak
diperbolehkan operand memori, artinya tidak dapat memindahkan data dari memori
ke memori.
Hal ini ini ke luar ciri-ciri dari assembly.
Sedikit banyak terdapat aturan yang harus diikuti tentang bagaimana cara
variasi instruksi digunakan. Operand harus memiliki ukuran yang sama.
Nilai register AX tidak dapat disimpan dalam register BL. Ukuran
dari register AX adalah pasangan register sebesar 32bit, sedangkan BL ukurannya
16bit untuk mikroprosesor 80486.
Sebagai contoh:
mov eax, 3 ; store 3 into EAX register(3 is immediate operand)
mov bx, ax ; store the value of AX into the BX register
Tanda semikolon ';' merupakan tanda awal untuk
penulisan komentar.
Instruksi ADD digunakan untuk
operasi penjumlahan integer:
add eax, 4 ;eax = eax + 4
add al, ah ; al = al + ah
Instruksi SUB merupakan instruksi pembagian secara integer:
sub bx, 10 ; bx = bx - 10
sub ebx, edi ; ebx = ebx - edi
Instruksi INC dan DEC adalah instruksi penaikan
(increment) atau penurunan (decrement) dengan nilai satu. Ini adalah salah satu
dari operan secara implisit, kode mesin untuk INC dan DEC adalah kecil
ukurannya dibanding dengan instruksi ADD dan SUB.
inc ecx ; ecx++
dec dl ; dl—
Pengarahan (Directive)
Directive merupakan sebuah artifak assembler
bukan CPU. Secara umum digunakan untuk menginstruksikan assembler untuk
melakukan sesuatu atau menginformasikan tentang sesuatu ke assembler. Directive
tidak diubah kedalam kode mesin.
Penggunaan umum dari directive adalah:
- Mendefinisikan
konstanta
- Mendefinisikan
memori untuk penyimpanan data
- Kelompok
memori kedalam segmen
- Melampirkan
kode sumber (source code) secara kondisional (conditionally include)
- Melampirkan
file lainnya
Pelolosan
kode NASM melalui sebuah perintah (command) preprosesor (preprocessor) seperti
C. Begitu pula, pengarahan preprosesor (directive preprocessor) dimulai dengan
% dibandingkan # dalam C.
Pengarahan
EQU
Pengarahan EQU dapat digunakan untuk
mendefinisikan sebuah simbol. Simbol adalah nama dari konstanta yang dapat
digunakan dalam program assembly.
Formatnya adalah:
simbol equ
nilai
Nilai dari simbol tidak dapat didefinisikan
secara berulang (didefinisikan kembali).
Pengarahan %define
Pengarahan ini adalah sama dengan pengarahan #define
dalam C. Ini secara umum digunakan untuk mendefinisikan mkro konstan seperti
dalam C.
%define SIZE 100
mov
eax, SIZE
Kode di atas mendefinisikan sebuah makro dengan
nama SIZE sebagai konstanta 100 dan ditunjukkan penggunaannya dalam instruksi.
Makro sangat fleksibel daripada simbol dalam dua cara. Makro dapat
didefinisikan kembali dan bisa lebih dari sekedar bilangan konstan.
Pengarahan Data
Pengarahan data digunakan dalam segmen data untuk
mendefinisikan ruang memori. Terdapat dua cara menyiapkan ruang memori. Cara
pertama, hanya mendefinisikan ruang untuk data; cara kedua mendefinisikan ruang
dan nilai awal. Metode pertama menggunakan satu dari pengarahan RESX. X
diganti dengan huruf sebagai ukuran dari obyek (atau beberapa obyek) yang akan
disimpan. Berikut ini ditunjukkan beberapa kemungkinan nilai itu.
UNIT
|
HURUF
|
byte
|
B
|
word
|
W
|
double word
|
D
|
quad word
|
Q
|
ten bytes
|
T
|
Metode kedua (mendefinisikan sebuah nilai
awal) menggunakan satu dari pengarahan DX. Huruf X adalah sama dengan
pengarahan RESX. Hal ini sangat umum untuk menandai lokasi memori dengan label.
Label merupakan salah satu cara mudah untuk mengarahkan lokasi memori dalam
kode.
Berikut ini terdapat beberapa contoh:
Tanda "..." dan '...' adalah sama perlakuannya. Konsekwensinya data
yang didefinisikan disimpan secara berurutan dalam memori. Dengan
demikian L2 disimpan secara seketika sesuada L1 dalam memori. urutan dari
memori dapat didefinisikan juga.
LABEL
|
INSTRUKSI
|
KOMENTAR
|
L9
|
db 0, 1,
2, 3
|
;
mendefinisikan ruang 4 byte dinisialisasi dengan nilai 0, 1, 2, 3
|
L10
|
db
"w", "o", "r", ’d’, 0
|
;
mendefinisikan urut-urutan karakter dalam memori yaitu ASCII w, o, r, d dan
diakhiri dengan konstanta 0
|
L11
|
db
’word’, 0
|
;
mendefinisikan urut-urutan karakter dalam memori yaitu ASCII word dan diakhir
dengan konstanta 0
|
Untuk urutan yang sangat besar, pengarahan TIMES dalam NASM seringkali
digunakan. Pengarahan ini mengulang sejumlah operand spesifik, sebagai contoh:
LABEL
|
INSTRUKSI
|
KOMENTAR
|
L12
|
times 100
db 0
|
; sama
dengan db 0 sebanyak 100 kali
|
L13
|
resw 100
|
;
menyediakan ruang memori untuk 100 word
|
Ingat bahwa label dapat digunakan untuk
mengarahkan ke data dalam kode. Terdapat dua cara bahwa sebuah label dapat
digunakan. Jika label akan digunakan, label akan diinterprestasikan sebagai
alamat (atau offset) dari data. Jika label diletakkan dalam kurung kotak
([...]), akan diinterprestasikan sebagai data pada alamat yang ditunjukkan oleh
label. Dalam bentuk yang lain, salah satu yang harus diingat bahwa sebuah label
adalah sebagai pointer data pada alamat tertentu dan kurung kotak
direferensikan sebagai pointer seperti halnya araterisk (*) dalam C. (MASM/TASM
memiliki perbedaan konvensi). Dalam mode 32bit, pengalamatannya adalah 32bit.
Berikut ini terdapat beberapa contoh:
NO
|
INSTRUKSI
|
KOMENTAR
|
1
|
mov
al, [L1]
|
;
salin byte memori dengan alamat yang ditunjukkan oleh L1 ke register AL
|
2
|
mov
eax, L1
|
;
register EAX = alamat byte ditunjukkan oleh L1
|
3
|
mov
[L1], ah
|
;
salin AH ke byte memori dengan alamat oleh L1
|
4
|
mov
eax, [L6]
|
;
salin double word memori dengan alamat oleh L6 ke register EAX
|
5
|
add
eax, [L6]
|
;
EAX = EAX + double word memori dengan alamat oleh L6
|
6
|
add
[L6], eax
|
;
double word memori dengan alamat oleh L6 += EAX
|
7
|
mov
al, [L6]
|
;
salin byte pertama dari double word memori dengan alamat oleh L6 ke AL
|
Label yang digunakan dalam contoh di atas
merupakan label yang diberikan dalam contoh sebelumnya. Baris 7 dari contoh di
atas menunjukkan sebuah properti yang penting untuk NASM. Assembler tidak dapat
menangkap dari jenis data yang ditunjukkan oleh label tersebut. Ini tergantung
pada programmer untuk membuat suatu kepastian bahwa penggunaan sebuah label
harus benar. Selanjutnya hal ini secara umum untuk menyimpan alamat dari sebuah
data dalam register dan menggunakan register seperti halnya pointer dalam
variabel C. Lagi, tidak ada pengecekan yang dilakukan bahwa sebuah pointer
digunakan secara benar. Cara ini, assembly akan lebih banyak menghasilkan error
daripada C.
Instruksi berikutnya adalah:
mov [L6], 1 ; simpan (store) 1 byte ke memori yang ditunjukkan oleh label L6
Pernyataan tersebut menghasilkan sebuah operasi
dengan ukuran yang tidak salah (error), mengapa ?. Sebab assembler tidak
mengetahui apa yang akan disimpan (store) sebagai 1 byte, word atau double
word. Untuk memperbaiki ini, tambahkan sebuah spesifikasi ukuran:
mov dword [L6], 1 ;
simpan (store) 1 byte ke memori yang ditunjukkan oleh label L6
Hal ini akan mengatakan ke assembler untuk
menyimpan 1 byte ke double word yang dimulai dengan alamat yang ditunjukkan
oleh label L6. Spesifikasi ukuran lainnya adalah: BYTE, WORD, QWORD and
TWORD.
Referensi from :
www.karmila.staff.gunadarma.ac.id/
http://images.dewi131105.multiply.multiplycontent.com