Minggu, 22 Januari 2012

Bahasa Assembler


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:
  1. Mendefinisikan konstanta
  2. Mendefinisikan memori untuk penyimpanan data
  3. Kelompok memori kedalam segmen
  4. Melampirkan kode sumber (source code) secara kondisional (conditionally include)
  5. 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

Tidak ada komentar:

Posting Komentar