Sunday, June 30, 2013

BAHASA ASSEMBLER



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 :







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

https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmoGeC6rRMQ9fu52mhr5F6iWeYlUdKJvMuCdEUD-ALjw7CJd8vS463HF5M7dBOMQ6yVlWD6AWa5J5ethNAyJ9baVp7-Tq7QB5CpvbleP2lRBdSsEJ_QIfl8wPwbHkY1NkPG-FW2fRcgnob/s320/Untitled.jpg


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