Modul Praktikum Bahasa Rakitan MODUL I SISTEM BILANGAN DAN REGISTER TUJUAN ¾ Mahasiswa mengenal sistem bilangan ¾ Mahasiswa mampu mengkonversikan sistem bilangan ¾ Menampilkan dan membaca isi register ¾ Mengetahui fungsi-fungsi register sebagai pengalamat data DASAR TEORI BERBAGAI JENIS BILANGAN Didalam pemrograman dengan bahasa assembler, bisa digunakan berbagai jenis bilangan. Jenis bilangan yang bisa digunakan, yaitu: Bilangan biner, oktaf, desimal dan hexadesimal. Pemahaman terhadap jenis-jenis bilangan ini adalah penting, karena akan sangat membantu kita dalam pemrograman yang sesungguhnya. BILANGAN BINER Sebenarnya semua bilangan, data maupun program itu sendiri akan diterjemahkan oleh komputer ke dalam bentuk biner. Jadi pendefinisisan data dengan jenis bilangan apapun(Desimal, oktaf dan hexadesimal) akan selalu diterjemahkan oleh komputer ke dalam bentuk biner. Bilangan biner adalah bilangan yang hanya terdiri atas 2 kemungkinan(Berbasis dua), yaitu 0 dan 1. Karena berbasis 2, maka pengkorversian ke dalam bentuk desimal adalah dengan mengalikan suku ke-N dengan 2N. Contohnya: bilangan biner 01112 = (0 X 23) + (1 X 22) + (1 X 21) + (1 X 20) = 710.
1
Laboratorium Elektronika dan Teknik Digital
Modul Praktikum Bahasa Rakitan BILANGAN DESIMAL Tentunya jenis bilangan ini sudah tidak asing lagi bagi kita semua. Bilangan Desimal adalah jenis bilangan yang paling banyak dipakai dalam kehidupan sehari-hari, sehingga kebanyakan orang sudah akrab dengannya. Bilangan desimal adalah bilangan yang terdiri atas 10 buah angka(Berbasis 10), yaitu angka 0-9. Dengan basis sepuluh ini maka suatu angka dapat dijabarkan dengan perpangkatan sepuluh. Misalkan pada angka 12310 = (1 X 102) + (2 X 101) + (1 X 100). BILANGAN OKTAL Bilangan oktal adalah bilangan dengan basis 8, artinya angka yang dipakai hanyalah antara 0-7. Sama halnya dengan jenis bilangan yang lain, suatu bilangan oktal dapat dikonversikan dalam bentuk desimal dengan mengalikan suku ke-N dengan 8 N. Contohnya bilangan 128 = (1 X 81) + (2 X 80) = 1010. BILANGAN HEXADESIMAL Bilangan hexadesimal merupakan bilangan yang berbasis 16. Dengan angka yang digunakan berupa: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Dalam pemrograman assembler, jenis bilangan ini boleh dikatakan yang paling banyak digunakan. Hal ini dikarenakan mudahnya pengkonversian bilangan ini dengan bilangan yang lain, terutama dengan bilangan biner dan desimal. Karena berbasis 16, maka 1 angka pada hexadesimal akan menggunakan 4 bit. BILANGAN BERTANDA DAN TIDAK Pada assembler bilangan-bilangan dibedakan lagi menjadi 2, yaitu bilangan bertanda dan tidak. Bilangan bertanda adalah bilangan yang mempunyai arti plus(+) dan minus(-), misalkan angka 17 dan -17. Pada bilangan tidak bertanda, angka negatif(yang mengandung tanda '-') tidaklah dikenal. Jadi angka -17 tidak akan akan dikenali sebagai angka -17, tetapi sebagai angka lain. Kapan suatu bilangan
2
Modul Praktikum Bahasa Rakitan perlakukan sebagai bilangan bertanda dan tidak? Assembler akan selalu melihat pada Sign Flag, bila pada flag ini bernilai 0, maka bilangan akan diperlakukan sebagai bilangan tidak bertanda, sebaliknya jika flag ini bernilai 1, maka bilangan akan diperlakukan sebagai bilangan bertanda. Pada bilangan bertanda bit terakhir (bit ke 16) digunakan sebagai tanda plus(+) atau minus(-). Jika pada bit terakhir bernilai 1 artinya bilangan tersebut adalah bilangan negatif, sebaliknya jika bit terakhir bernilai 0, artinya bilangan tersebut adalah bilangan positif(Gambar 1.1). +--------------------------------------------+ | >>>> Bilangan <<<< | +------------+---------------+---------------+ | Biner |Tidak Bertanda | Bertanda | +------------+---------------+---------------+ | 0000 0101 | + 5 | + 5 | | 0000 0100 | + 4 | + 4 | | 0000 0011 | + 3 | + 3 | | 0000 0010 | + 2 | + 2 | | 0000 0001 | + 1 | + 1 | | 0000 0000 | 0 | 0 | | 1111 1111 | + 255 | - 1 | | 1111 1110 | + 254 | - 2 | | 1111 1101 | + 253 | - 3 | | 1111 1100 | + 252 | - 4 | | 1111 1011 | + 251 | - 5 | | 1111 1010 | + 250 | - 6 | +------------+---------------+---------------+
3
Modul Praktikum Bahasa Rakitan PENGERTIAN REGISTER Dalam pemrograman dengan bahasa Assembly, mau tidak mau anda harus berhubungan dengan apa yang dinamakan sebagai Register. Lalu apakah yang dimaksudkan dengan register itu sebenarnya ?. Register merupakan sebagian memori dari mikroprosesor yang dapat diakses dengan kecepatan yang sangat tinggi. Dalam melakukan pekerjaannya mikroprosesor selalu menggunakan register-register sebagai perantaranya, jadi register dapat diibaratkan sebagai kaki dan tangannya mikroprosesor. JENIS-JENIS REGISTER Register yang digunakan oleh mikroprosesor dibagi menjadi 5 bagian dengan tugasnya yang berbeda-beda pula, yaitu : Segmen Register. Register yang termasuk dalam kelompok ini terdiri atas register CS,DS,ES dan SS yang masing-masingnya merupakan register 16 bit. Register-register dalam kelompok ini secara umum digunakan untuk menunjukkan alamat dari suatu segmen. Register CS(Code Segment) digunakan untuk menunjukkan tempat dari segmen yang sedang aktif, sedangkan register SS(Stack Segment) menunjukkan letak dari segmen yang digunakan oleh stack. Kedua register ini sebaiknya tidak sembarang diubah karena akan menyebabkan kekacauan pada program anda nantinya. Register DS(Data Segment) biasanya digunakan untuk menunjukkan tempat segmen dimana data-data pada program disimpan. Umumnya isi dari register ini tidak perlu diubah kecuali pada program residen. Register ES(Extra Segment), sesuai dengan namanya adalah suatu register bonus yang tidak mempunyai suatu tugas khusus. Register ES ini biasanya digunakan untuk menunjukkan suatu alamat di memory, misalkan alamat memory video. Pada prosesor 80386 terdapat tambahan register segment 16 bit, yaitu FS<Extra Segment> dan GS<Extra Segment>.
4
Modul Praktikum Bahasa Rakitan
Pointer dan Index Register. Register yang termasuk dalam kelompok ini adalah register SP,BP,SI dan DI yang masing-masing terdiri atas 16 bit. Register- register dalam kelompok 16 ini secara umum digunakan sebagai penunjuk atau pointer terhadap suatu lokasi di memory. Register SP(Stack Pointer) yang berpasangan dengan register segment SS(SS:SP) digunakan untuk mununjukkan alamat dari stack, sedangkan register BP(Base Pointer)yang berpasangan dengan register SS(SS:BP) mencatat suatu alamat di memory tempat data. Register SI(Source Index) dan register DI(Destination Index) biasanya digunakan pada operasi string dengan mengakses secara langsung pada alamat di memory yang ditunjukkan oleh kedua register ini. Pada prosesor 80386 terdapat tambahan register 32 bit, yaitu ESP,EBP,ESI dan EDI. General Purpose Register. Register yang termasuk dalam kelompok ini adalah register AX,BX,CX dan DX yang masing-masing terdiri atas 16 bit. Register- register 16 bit dari kelompok ini mempunyai suatu ciri khas, yaitu dapat dipisah menjadi 2 bagian dimana masingmasing bagian terdiri atas 8 bit, seperti pada gambar 4.1. Akhiran H menunjukkan High sedangkan akhiran L menunjukkan Low. +AX+
+BX+ +CX+ +DX+
+-+--+--+-+ +-+--+--+-+ +-+--+--+-+ +-+--+--+-+ | AH | AL | | BH | BL | | CH | CL | | DH | DL | +----+----+ +----+----+ +----+----+ +----+----+ Secara umum register-register dalam kelompok ini dapat digunakan untuk berbagai keperluan, walaupun demikian ada pula penggunaan khusus dari masing-masing register ini yaitu : ¾ Register AX, secara khusus digunakan pada operasi aritmatika terutama dalam operasi pembagian dan pengurangan.
5
Modul Praktikum Bahasa Rakitan ¾ Register BX, biasanya digunakan untuk menunjukkan suatu alamat offset dari suatu segmen. ¾ Register CX, digunakan secara khusus pada operasi looping dimana register ini menentukan berapa banyaknya looping yang akan terjadi. ¾ Register DX, digunakan untuk menampung sisa hasil pembagian 16 bit. Pada prosesor 80386 terdapat tambahan register 32 bit, yaitu EAX,EBX,ECX dan EDX. Index Pointer Register Register IP berpasangan dengan CS(CS:IP) menunjukkan alamat dimemory tempat dari intruksi(perintah) selanjutnya yang akan dieksekusi. Register IP juga merupakan register 16 bit. Pada prosesor 80386 digunakan register EIP yang merupakan register 32 bit. Flags Register. Sesuai dengan namanya Flags(Bendera) register ini menunjukkan kondisi dari suatu keadaan< ya atau tidak >. Karena setiap keadaan dapat digunakan 1 bit saja, maka sesuai dengan jumlah bitnya, Flags register ini mampu memcatat sampai 16 keadaan. Adapun flag yang terdapat pada mikroprosesor 8088 keatas adalah : -
OF
. Jika terjadi OverFlow pada operasi aritmatika, bit ini akan bernilai 1.
-
SF <Sign Flag>. Jika digunakan bilangan bertanda bit ini akan bernilai 1
-
ZF . Jika hasil operasi menghasilkan nol, bit ini akan bernilai 1.
-
CF . Jika terjadi borrow pada operasi pengurangan atau carry pada penjumlahan, bit ini akan bernilai 1.
-
PF <Parity Flag>. Digunakan untuk menunjukkan paritas bilangan. Bit ini akan bernilai 1 bila bilangan yang dihasilkan merupakan bilangan genap.
6
Modul Praktikum Bahasa Rakitan -
DF . Digunakan pada operasi string untuk menunjukkan arah proses.
-
IF . CPU akan mengabaikan interupsi yang terjadi jika bit ini 0.
-
TF . Digunakan terutama untuk Debugging, dengan operasi step by step.
-
AF . Digunakan oleh operasi BCD, seperti pada perintah AAA.
-
NT . Digunakan pada prosesor 80286 dan 80386 untuk menjaga jalannya interupsi yang terjadi secara beruntun.
-
IOPL . Flag ini terdiri atas 2 bit dan digunakan pada prosesor 80286 dan 80386 untuk mode proteksi.
-
PE . Digunakan untuk mengaktifkan mode proteksi. flag ini akan bernilai 1 pada mode proteksi dan 0 pada mode real.
-
MP <Monitor Coprosesor>. Digunakan bersama flag TS untuk menangani terjadinya intruksi WAIT.
-
EM <Emulate Coprosesor>. Flag ini digunakan untuk mensimulasikan coprosesor 80287 atau 80387.
-
TS . Flag ini tersedia pada 80286 keatas.
-
ET <Extension Type>. Flag ini digunakan untuk menentukan jenis coprosesor 80287 atau 80387.
-
RF . Register ini hanya terdapat pada prosesor 80386 keatas.
-
VF . Bila flag ini bernilai 1 pada saat mode proteksi, mikroprosesor akan memungkinkan dijalankannya aplikasi mode real pada mode proteksi. Register ini hanya terdapat pada 80386 keatas.
7
Modul Praktikum Bahasa Rakitan Perintah –Perintah Debug •
A:
Merakit intruksi simbolik (kode mesin)
•
D:
menampilkan isi suatu daerah memori
•
E:
memasukan data ke memori yang dimulai pad lokasi tertentu
•
G:
run executable program ke memori
•
N:
menamai program
•
P:
eksekusi sekumpulan intruksi yang terkait
•
Q:
quit
•
R:
menampilkan isi satu atau lebih register
•
T:
trace isi sebuah intruksi
•
U:
unassembled kode mesin ke kode simbolik
•
W:
menulis program ke disk
Instruksi Bahasa Assembly
Secara fisik, kerja dari sebuah komputer dapat dijelaskan sebagai siklus pembacaan instruksi yang tersimpan di dalam memori. komputer menentukan alamat dari memori program yang akan dibaca, dan melakukan proses baca data di memori. Data yang dibaca diinterprestasikan sebagai instruksi. Alamat instruksi disimpan oleh komputer di register, yang dikenal sebagai program counter. Instruksi ini misalnya program aritmatika yang melibatkan 2 register. Dalam bahasa Assembly mempunyai 3 tipe intruksi dasar yaitu : mnemonic, operan1 dan 2 serta kometar mnemonic
operand1 operand2
komentar
(opcode)
MOV
A, #30H
;kirim 30H ke akumulator A
8
Modul Praktikum Bahasa Rakitan 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 R0,#22H, Tasmi MOVX @DPTR, A RR A NOP
;dibutuhkan 3 buah operand ;dibutuhkan 2 buah operand ;1 buah operand ; tidak memerlukan operand
Semua instruksi tersebut dapat dibagi menjadi lima kelompok menurut fungsinya, yaitu: ¾ Instruksi Pemindahan Data ¾ Instruksi Aritmatika ¾ Instruksi Logika dan Manipulasi Bit ¾ Instruksi Percabangan ¾ Instruksi Stack, I/O, dan Kontrol.
Prosedur Percobaan 1. Klik menu start pada computer 2. Pilih All Programs dan pilih accessories 3. Pilih command prompt 4. Lalu anda ketika debug pada bagian c prompt dan tekan Enter
5. Kemudian anda ketikan Huruf A 100 dan tekan Enter
6. Lalu teketikan program dibawah ini MOV AX, 0090H 9
Modul Praktikum Bahasa Rakitan MOV DS, AX MOV SI,0120H MOV DI, 0130H MOV AX, SI MOV DI, AX INT 20H 7. Untuk melihat hasil dari program di atas ketika huruf T (Trace) lalu tekan enter dan lihat nilai dari tiap register
8. Untuk memberi nama pada program yang kita buat adalah dengan mengetikan huruf n nama program.com -n test.com Tugas 1. Analisis Program yang anda dapat 2. Buatkan program untuk menukarkan isi data pada alamat memory 0120H dan alamat memory 0130H 3. Buatkan Flowchart dari tugas no 2
10
Modul Praktikum Bahasa Rakitan MODUL II TURBO ASSEMBLY DAN MEMBUAT PROGRAM COM TUJUAN ¾ Dapat memahami pembuatan program yang berektensi COM dan EXE ¾ Dapat menjalan program dengan mengunakan Tasm DASAR TEORI MODEL PROGRAM COM Untuk membuat program .COM yang hanya menggunakan 1 segment,. Bentuk yang digunakan disini adalah bentuk program yang dianjurkan(Ideal). Dipilihnya bentuk program ideal dalam buku ini dikarenakan pertimbangan dari berbagai keunggulan bentuk program ideal ini seperti, prosesnya lebih cepat dan lebih mudah digunakan oleh berbagai bahasa tingkat tinggi yang terkenal(Turbo Pascal dan C). ----------------------------------------------------------.MODEL SMALL .CODE ORG 100H Label1 : JMP Label2 +---------------------+ | TEMPAT DATA PROGRAM | +---------------------+ Label2 : +---------------------+ | TEMPAT PROGRAM | +---------------------+ INT 20H END Label1 ----------------------------------------------------------Supaya lebih jelas bentuk dari program ideal, marilah kita telusuri lebih lanjut dari bentuk program ini.
11
Modul Praktikum Bahasa Rakitan MODEL SMALL Tanda directive ini digunakan untuk memberitahukan kepada assembler bentuk memory yang digunakan oleh program kita. Supaya lebih jelas model-model yang bisa digunakan adalah : - TINY Jika program anda hanya menggunakan 1 segment seperti program COM. Model ini disediakan khusus untuk program COM. - SMALL Jika data dan code yang digunakan oleh program kurang dari ukuran 1 segment atau 64 KB. - MEDIUM Jika data yang digunakan oleh program kurang dari 64 KB tetapi code yang digunakan bisa lebih dari 64 KB. - COMPACT Jika data yang digunakan bisa lebih besar dari 64 KB tetapi codenya kurang dari 64 KB. - LARGE Jika data dan code yang dipakai oleh program bisa lebih dari 64 KB. - HUGE Jika data, code maupun array yang digunakan bisa lebih dari 64 KB. Mungkin ada yang bertanya-tanya mengapa pada program COM yang dibuat digunakan model SMALL dan bukannya TINY ? Hal ini disebabkan karena banyak dari compiler bahasa tingkat tinggi yang tidak bisa berkomunikasi dengan model TINY, sehingga kita menggunakan model SMALL sebagai pemecahannya. .CODE Tanda directive ini digunakan untuk memberitahukan kepada assembler bahwa kita akan mulai menggunakan Code Segment-nya disini. Code segment ini digunakan untuk menyimpan program yang nantinya akan dijalankan.
12
Modul Praktikum Bahasa Rakitan . ORG 100h Pada program COM perintah ini akan selalu digunakan. Perintah ini digunakan untuk memberitahukan assembler supaya program pada saat dijalankan(diload ke memory) ditaruh mulai pada offset ke 100h(256) byte. Dapat dikatakan juga bahwa kita menyediakan 100h byte kosong pada saat program dijalankan. 100h byte kosong ini nantinya akan ditempati oleh PSP(Program Segment Prefix) dari program tersebut. PSP ini digunakan oleh DOS untuk mengontrol jalannya program tersebut. JMP Perintah JMP(JUMP) ini digunakan untuk melompat menuju tempat yang ditunjukkan oleh perintah JUMP. Adapun syntaxnya adalah: JUMP Tujuan . Dimana tujuannya dapat berupa label seperti yang digunakan pada bagan diatas. Mengenai perintah JUMP ini akan kita bahas lebih lanjut nantinya. Perintah JUMP yang digunakan pada bagan diatas dimaksudkan agar melewati tempat data program, karena jika tidak ada perintah JUMP ini maka data program akan ikut dieksekusi sehingga kemungkinan besar akan menyebabkan program anda menjadi Hang. INT 20h Perintah INT adalah suatu perintah untuk menghasilkan suatu interupsi INT NoInt Interupsi 20h berfungsi untuk mengakhiri program dan menyerahkan kendali sepenuhnya kepada Dos. Pada program COM cara ini bukanlah satu-satunya tetapi cara inilah yang paling efektif untuk digunakan. Bila anda lupa untuk mengakhiri sebuah program maka program anda tidak akan tahu kapan harus selesai, hal ini akan menyebabkan komputer menjadi hang.
13
Modul Praktikum Bahasa Rakitan PROSEDUR PERCOBAAN 1. Gunakan prog editor untuk membuat source program .MODEL SMALL .CODE ORG 100H Proses: mov ah,1h mov cx,07h int 10h mov ah,4ch int 21h END proses
;memory model ;the following lines are program instructions ;moves the value 1h to register ah ;moves the value 07h to register cx ;10h interruption ;moves the value 4 ch to register ah ;21h interruption ;finishes the
2. Simpan Program yang sudah anda ketik dengan nama file Latihan1.asm 3. Gunakan TASM untuk membuat program obyek C:\>tasm \tasm latihan1.asm 4. Gunakan TLINK untuk membangun excutable program C:\>tasm\tlink/t latihan1.obj 5. Jalan program yang sudah anda buat C:\>tasm>latihan1
14
Modul Praktikum Bahasa Rakitan MODUL III FUNGSI INTTERUPT (MENCETAK HURUF DAN KALIMAT) TUJUAN ¾ Mengerti penggunakan register dalam mencentak kalimat ¾ Dapat mengerti fungsi dari int 21h DASAR TEORI Bila dihasilkan interupsi 21h apa yang akan dikerjakan oleh komputer ?. Jawabnya, ada banyak sekali kemungkinan. Pada saat terjadi interupsi 21h maka pertama-tama yang dilakukan komputer adalah melihat isi atau nilai apa yang terdapat pada register AH. Misalkan bila nilai AH adalah 2 maka komputer akan mencetak sebuah karakter, berdasarkan kode ASCII yang terdapat pada register DL. Bila nilai pada register AH bukanlah 2, pada saat dilakukan interupsi 21h maka yang dikerjakaan oleh komputer akan lain lagi. Dengan demikian kita bisa mencetak sebuah karakter yang diinginkan dengan meletakkan angka 2 pada register AH dan meletakkan kode ASCII dari karakter yang ingin dicetak pada register DL sebelum menghasilkan interupsi 21h. ;================================; ; PROGRAM : lat1.ASM ; ; FUNGSI : MENCETAK KARATER ; ; 'A' DENGAN INT 21 ; ;===============================; .MODEL SMALL .CODE ORG 100h Proses : MOV AH,02h ; Nilai servis ntuk mencetak karakter MOV DL,'A' ; DL = Karakter ASCII yang akan dicetak INT 21h ; Cetak karakter !! INT 20h ; Selesai ! kembali ke DOS END Proses
15
Modul Praktikum Bahasa Rakitan Kita lihat disini bahwa karakter yang tercetak adalah yang sesuai dengan kode ASCII yang ada pada register DL. Sebagai latihan cobalah anda ubah register DL dengan angka 65 yang merupakan kode ASCII karakter 'A'. Hasil yang didapatkan adalah sama. . MENCETAK BEBERAPA KARAKTER Untuk mencetak beberapa karakter, bisa anda gunakan proses looping. Sebagai contoh dari penggunaan looping ini bisa dilihat pada program 7.3. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : lat2.ASM ; ; FUNGSI : MENCETAK 16 BUAH ; ; KARAKTER DENGAN ; ; INT 21h SERVIS 02 ; ;============================; .MODEL SMALL .CODE ORG 100h Proses : MOV AH,02h ; Nilai servis MOV DL,'A' ; DL=karakter 'A' atau DL=41h MOV CX,10h ; Banyaknya pengulangan yang akan Ulang : INT 21h ; Cetak karakter !! INC DL ; Tambah DL dengan 1 LOOP Ulang ; Lompat ke Ulang INT 20h END Proses PROSEDUR PERCOBAAN 1. Tahap pertama dalam membuat program diatas, dimana listing ini dapat anda tulis mengunakan program EDIT dalam MS-DOS atau NOTEPAD (ketik program diatas) 2. Simpan Program yang telah anda ketik pada folder TASM 3. Aktifkan MS-DOS lalu masuk kedalam folder TASM
16
Modul Praktikum Bahasa Rakitan 4. Lalu ketik Program TASM.EXE dan ketik nama program yang telah anda ketik C:\tasm\tasm lat1.asm Akan muncul infromasi tentang program anda (bila ada error laihat pada baris berapa yang terjasi kesalahan dan aktifkan kembali program Edit dan buka file yang telah anda bua dan cari update program tersebutt) 5. Langka selajutnya anda merubah file anda yang telah menjadi program yang berekstensi OBJ menjadi COM or EXE C:\tasm\tlink/t lat1.obj
untuk program yang berektensi COM
C:\tasm\tlink lat1.obj
Untuk program yang berektensi EXE
6. Lalu jalan program anda C:\tasm\ lat1 Tugas 1. Analisi Program I dan II dan sebutkan perbedaan dari kedua program 2. Buatkan program untuk mencetak huruf D
17
Modul Praktikum Bahasa Rakitan MODUL IV OPERASI ARITMATIKA TUJUAN ¾ Mengerti tentang tambah satu kurang satu sautu register atau lokasi memory ¾ Mengerti tentang proses penambahan, pengurangan, pembagian dan perkalian DASAR TEORI OPERASI PERNAMBAHAN 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 MOV AL,4
; AH:=15h
; 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(8 bit), AX(16 bit) dan BX(16 bit).
18
Modul Praktikum Bahasa Rakitan CONTOH (CODING): ; Menambah angka 74H pada ADD AL,74H
; isi AL. Hasil dalam AL ; Menambah jumlah BL ditambah membawa status
ADD DX,BX
; pada isi DX ; Menambah huruf dari memory pada offset [SI]
ADD DX,[SI]
; dalam DS ke isi DX ; Menambah byte dari PRICES[BX]
ADD PRICES [BX],AL; isi memory pada address efektif ; PRICES[BX] CONTOH (NUMERIK) ; Penambahan angka-angka yang tidak ditandai ; CL = 01110011 = 115 desimal ; + BL = 01001111 = 79 desimal ADD CL,BL ; Hasil dalam CL ; CL = 11000010 = 194 desimal ; Penambahan angka-angka yang ditandai ; CL = 01110011 = + 115 desimal ; + BL = 01001111 = + 79 desimal ADD CL,BL ; Hasil dalam CL ; CL = 11000010 = - 62 desimal – ; salah sebab hasil terlalu besar untuk ukuran 7 bit. HASIL HASIL FLAG UNTUK CONTOH TAMBAHAN YANG DITANDAI CF = 0 Tidak membawa bit 7 PF = 0 Hasilnya memiliki keseimbangan ganjil AF = 0 Carry dihasilkan diluar bit 3 ZF = 0 Hasil di tujuan bukan 0
19
Modul Praktikum Bahasa Rakitan SF = 0
Hasil copy bit yang paling jelas: menunjukkan hasil negatif jika Anda menambahkan angka-angka yang ditandai.
OF = 0 Disiapkan untuk menunjukkan hasil penambahan terlalu besar untuk masuk dalam 7 bit bawah dari tujuan digunakan untuk mewakili besarnya angka yang ditandai. Dengan kata lain, hasilnya lebih besar dari +127 desimal, maka hasilnya ditutupi menjadi tanda posisi bit dan menunjukkan secara tidak benar hasilnya negatif. Jika Anda menambahkan dua tanda nilai 16-bit, OF akan disiapkan jika besarnya hasil terlalu besar untuk dimuat dalam 15 bit bawah tujuan. ADC Perintah ADC digunakan dengan cara yang sama pada perintah ADD, yaitu : ADC Tujuan,Asal Perbedaannya pada perintah ADC ini Tujuan tempat menampung hasil pertambahan
Tujuan
dan
Asal
ditambah
lagi
dengan
carry
flag
(Tujuan:=Tujuan+Asal+Carry). Pertambahan yang demikian bisa memecahkan masalah seperti yang pernah kita kemukakan, seperti pertambahan pada bilangan 12345678h+9ABCDEF0h. Seperti yang telah kita ketahui bahwa satu register hanya mampu menampung 16 bit, maka untuk pertambahan seperti yang diatas bisa anda gunakan perintah ADC untuk memecahkannya, Contoh: MOV AX,1234h
; AX = 1234h CF = 0
MOV BX,9ABCh
; BX = 9ABCh CF = 0
MOV CX,5678h
; BX = 5678h CF = 0
MOV DX,0DEF0h
; DX = DEF0h CF = 0
ADD CX,DX
; CX = 3568h CF = 1
ADC AX,BX
; AX = AX+BX+CF = ACF1
Hasil penjumlahan akan ditampung pada register AX:CX yaitu ACF13568h. Adapun flag-flag yang terpengaruh oleh perintah ADD dan ADC ini adalah CF,PF,AF,ZF,SF dan OF.
20
Modul Praktikum Bahasa Rakitan INC Perintah INC(Increment) digunakan khusus untuk pertambahan dengan 1. Perintah INC hanya menggunakan 1 byte memory, sedangkan perintah ADD dan ADC menggunakan 3 byte. Oleh sebab itu bila anda ingin melakukan operasi pertambahan dengan 1 gunakanlah perintah INC. Syntax pemakainya adalah : INC Tujuan Nilai pada tujuan akan ditambah dengan 1, seperti perintah Tujuan:=Tujuan+1 dalam Turbo Pascal. Tujuan disini dapat berupa suatu register maupun memory. Contoh : perintah INC AL akan menambah nilai di register AL dengan 1. Adapun flag yang terpengaruh oleh perintah ini adalah OF,SF,ZF,AF dan PF. OPERASI PENGURANGAN CONTOH: ; ASCII 9 – ASCII 5 (9 – 5) ; AL = 00111001 = 39H = ASCII 9 ; BL = 00110101 = 35H = ASCII 5 SUB AL,BL ; Hasil: AL = 00000100 = BCD 04 ; dan CF = 0 AAS
; Hasil: AL = 00000100 = BCD 04 ; dan CF = 0; tidak diperlukan peminjaman ; ASCII 5 – ASCII 9 (5 – 9) ; Anggap AL = 00111001 = 35H = ASCII 5 ; dan BL = 00110101 = 39H = ASCII 9
SUB AL, BL ; Hasil: AL = 11111100 = - 4 ; dalam komplemen 2 dan CF = 1 AAS
; Hasil: AL = 00000100 = BCD 04 ; dan CF = 1; diperlukan peminjaman
21
Modul Praktikum Bahasa Rakitan Instruksi AAS menyisakan hasil dari hasil BCD yang benar pada angka bawah AL dan menghapus angka atas AL pada semua 0. Jika Anda ingin mengirim kembali ke sebuah terminal CRT, Anda bisa melakukan OR AL dengan 30H untuk menghasilkan kode ASCII yang benar sebagai hasilnya. Jika perkalian digit angka dicari hasil pengurangannya, CF bisa diambil menjadi account dengan menggunakan instruksi SBB ketika mengurangi digit berikutnya. Instruksi
AAS
hanya
berfungsi
untuk
register
AL.
Instruksi
ini
memperbaharui AF dan CF tetapi OF, PF, SF, dan ZF tidak diterang 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. 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
22
Modul Praktikum Bahasa Rakitan 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). DEC Perintah DEC(Decrement) digunakan khusus untuk pengurangan dengan 1. Perintah DEC hanya menggunakan 1 byte memory, sedangkan perintah SUB dan SBB menggunakan 3 byte. Oleh sebab itu bila anda ingin melakukan operasi pengurangan dengan 1 gunakanlah perintah DEC. Syntax pemakaian perintah dec ini adalah: DEC Tujuan Nilai pada tujuan akan dikurangi 1, seperti perintah Tujuan:=Tujuan-1 dalam Turbo Pascal. Tujuan disini dapat berupa suatu register maupun memory. Contoh : perintah DEC AL akan mengurangi nilai di register AL dengan 1. 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.
23
Modul Praktikum Bahasa Rakitan Sebelum Anda bisa mengalikan dua digit ASCII, Anda harus menutup 4 bit angka atas dari masing-masing digit. Hal ini menyebabkan hasil BCD (satu digit BCD per byte) pada setiap byte. Setelah dua hasil digit BCD dikalikan, instruksi AAM digunakan untuk mengatur hasil dari dua hasil digit BCD dalam AX. AAM berfungsi hanya setelah pengalian dari dua hasil byte BCD, dan AAM hanya berfungsi hanya pada suatu operand dalam AL. AAM memperbaharui PF, SF, dan ZF, tetapi AF, CF, dan OF tidak diterangkan. CONTOH: ; AL = 00000101 = hasil BCD 5 ; BH = 00001001 = hasil BCD 9 MUL BH
; AL x BH ; hasil dalam AX ; AX = 00000000 00101101 = 002DH
AAM
; AX = 00000100 00000101 = 0405H, ; yang merupakan hasil BCD untuk angka 45. ; Jika menginginkan kode ASCII untuk hasilnya, gunakan instruksi berikutnya
OR AX, 3030H ; Letakkan 3 pada angka atas di setiap byte. ; AX = 00110100 00110101 = 3435H, ; yang merupakan kode ASCII untuk angka 45 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
24
Modul Praktikum Bahasa Rakitan 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. AAD mengubah dua hasil digit BCD menjadi AH dan AL menjadi angka biner yang seimbang dalam AL. Pengaturan ini harus dibuat sebelum membagi dua hasil digit BCD dalam AX dengan byte hasil BCD. Setelah pembagian, AL akan berisi hasil bagi dari hasil BCD dan AH akan berisi sisa hasil BCD. PF, SF, dan ZF diperbaharui. AF, CF, dan OF tidak diterangkan setelah AAD. CONTOH: ; AX = 0607H hasil BCD untuk 67 desimal ; CH = 09H, sekarang atur menjadi biner AAD
; Hasil: AX = 0043 = 43H = 67 desimal
DIV CH ; Bagi AX dengan hasil BCD pada CH ; Hasil Bagi : AL = 07 hasil BCD ; Sisa : AH = 04 hasil BCD ; Flags tidak diterangkan setelah DIV PROSEDUR PERCOBAAN ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : TAMBAH.ASM ; ; FUNGSI : MELIHAT PENAMBAHAN ; ;==============================; .MODEL SMALL .CODE ORG 100h Proses : MOV AH,15h ; AH:=15h 25
Modul Praktikum Bahasa Rakitan MOV AL,4 ADD AH,AL MOV AX,1234h MOV BX,0F221h ADD AX,BX MOV AX,1234h MOV BX,9ABCh MOV CX,5678h MOV DX,0DEF0h ADD CX,DX ADC AX,BX INC AL INT 20h END Proses
; AL:=4 ; AH:=AH+AL, jadi AH=19h ; NIlai AX:=1234h dan carry=0 ; Nilai BX:=F221h dan carry=0 ; AX:=AX+BX, jadi nilai AX=0455h ; AX = 1234h CF = 0 ; BX = 9ABCh CF = 0 ; BX = 5678h CF = 0 ; DX = DEF0h CF = 0 ; CX = 3568h CF = 1 ; AX = AX+BX+CF = ACF1 ; AL:=AL+1, nilai pada AL ditambah 1
;================================; ; PROGRAM : KALI.ASM ; ; FUNGSI : MENGALIKAN BILANGAN; ;================================; .MODEL SMALL .CODE ORG 100h TData : JMP Proses ; Lompat ke Proses A DW 01EFh B DW 02FEh HslLo DW ? HslHi DW ? Proses: MOV AX,A ; AX=1EF MUL B ; Kalikan 1FH*2FE MOV HslLo,AX ; AX bernilai C922 sehingga HslLo=C922 MOV HslHi,DX ; DX bernilai 0005 sehingga HslHi=0005 INT 20h ; Kembali ke DOS END TData Prosedur Percobaan 1. ketik program diatas dengan mengunakan program EDIT dalam MS-DOS atau NOTEPAD atau program simulator(sms) 2. Simpan Prograam yang telah anda ketik pada folder TASM 26
Modul Praktikum Bahasa Rakitan 3. Aktifkan MS-DOS lalu masuk kedalam folder TASM 4. Lalu ketik Program TASM.EXE dan ketik nama program yang telah anda ketik 5. Langka selajutnya anda merubah file anda yang telah menjadi program yang berekstensi OBJ menjadi COM or EXE 6. Lalu jalan program anda Tugas Buat program untuk membagi bilangan 1- 9 dengan bilangan 2 dan disimpan dengan nama lat4.asm
27
Modul Praktikum Bahasa Rakitan MODUL V INSTRUKSI BANDING DAN LOMPAT TUJUAN ¾ Memahami intruksi percabangan ¾ Memahami teknik merancang program percabangan DASAR TEORI LOMPAT TANPA SYARAT Perintah JMP(Jump), sudah pernah kita gunakan, dimana perintah ini digunakan untuk melompati daerah data program. Perintah JMP digunakan dengan syntax: JMP Tujuan Perintah JMP ini dikategorikan sebagai Unconditional Jump, karena perintah ini tidak menyeleksi keadaan apapun untuk melakukan suatu lompatan.Setiap ditemui perintah ini maka lompatan pasti dilakukan. Selain dari perintah jump tanpa syarat, masih banyak perintah Jump yang menyeleksi suatu keadaan tertentu sebelum dilakukan lompatan. Perintah jump dengan penyeleksian kondisi terlebih dahulu biasanya diikuti dengan perintah untuk melihat kondisi, seperti membandingkan dengan perintah "CMP"(Compare). MEMBANDINGKAN DENGAN CMP Perintah CMP(Compare) digunakan untuk membandingkan 2 buah operand, dengan syntax: CMP Operand1,Operand2 CMP akan membandingkan operand1 dengan operand2 dengan cara mengurangkan operand1 dengan operand2. CMP tidak mempengaruhi nilai Operand1
28
Modul Praktikum Bahasa Rakitan dan Operand2, perintah CMP hanya akan mempengaruhi flags register sebagai hasil perbandingan. Adapun flag-flag yang terpengaruh oleh perintah CMP ini adalah: - OF akan 1, jika operand1 lebih kecil dari operand2 pada operasi bilangan bertanda. - SF akan 1, bila operand1 lebih kecil dari operand2, pada operasi bilangan bertanda. - ZF akan 1, jika operand1 nilainya sama dengan operand2. - CF akan 1, jika operand1 lebih kecil dari operand2 pada operasi bilangan tidak bertanda. Perlu anda ingat bahwa CMP tidak dapat membandingkan antar 2 lokasi memory. LOMPAT YANG MENGIKUTI CMP Perintah CMP yang hanya mempengaruhi flag register, biasanya diikuti dengan perintah lompat yang melihat keadaan pada flags register ini. Jenis perintah lompat yang biasanya mengikuti perintah CMP, terdapat 12 buah seperti -----------------------------+---------------------------------Perintah Lompat | Kondisi -----------------------------+---------------------------------JA <Jump If Above> | Lompat, jika Operand1 > Operand2 | untuk bilangan tidak bertanda JG <Jump If Greater> | Lompat, jika Operand1 > Operand2 | untuk bilangan bertanda JE <Jump If Equal> | Lompat, jika Operand1 = Operand2 JNE <Jump If Not Equal> | Lompat, jika Operand1 tidak sama | dengan Operand2 JB <Jump If Below> | Lompat, jika Operand1 < Operand2 | untuk bilangan tidak bertanda JL <Jump If Less> | Lompat, jika Operand1 < Operand2 | untuk bilangan bertanda JBE <Jump If Below or Equal> | Lompat, jika operand1 <= Operand2 | untuk bilangan tidak bertanda JLE <Jump If Less or Equal> | Lompat, jika Operand1 <= Operand2 | untuk bilangan bertanda JAE <Jump If Above or Equal> | Lompat, jika Operand1 >= Operand2 | untuk bilangan tidak bertanda JGE <Jump If Greater or | Lompat, jika Operand1 >= Operand2 Equal> | untuk bilangan bertanda -----------------------------+----------------------------------
29
Modul Praktikum Bahasa Rakitan LOMPAT BERSYARAT Instruksi ini dapat dilihat pada tabel dibawah yang menjelaskan masalah ada atau tidak adanya syarat status tertentu Mnemonic Arti
Format
Jcc
Jcc operand
Lompat bersyarat
Operasi
Flag efect
Jika syarat cc benar maka None lompat ke alamat ditentukan. Jika tidak instruksi selanjutnya dilanjutkan -----------------------------+---------------------------------Perintah Lompat | Kondisi -----------------------------+---------------------------------JA <Jump If Above> | Lompat, jika Operand1 > Operand2 | untuk bilangan tidak bertanda JG <Jump If Greater> | Lompat, jika Operand1 > Operand2 | untuk bilangan bertanda JE <Jump If Equal> | Lompat, jika Operand1 = Operand2 JNE <Jump If Not Equal> | Lompat, jika Operand1 tidak sama | dengan Operand2 JB <Jump If Below> | Lompat, jika Operand1 < Operand2 | untuk bilangan tidak bertanda JL <Jump If Less> | Lompat, jika Operand1 < Operand2 | untuk bilangan bertanda JBE <Jump If Below or Equal> | Lompat, jika operand1 <= Operand2 | untuk bilangan tidak bertanda JLE <Jump If Less or Equal> | Lompat, jika Operand1 <= Operand2 | untuk bilangan bertanda JAE <Jump If Above or Equal> | Lompat, jika Operand1 >= Operand2 | untuk bilangan tidak bertanda JGE <Jump If Greater or | Lompat, jika Operand1 >= Operand2 Equal> | untuk bilangan bertanda JC <Jump Carry> | Lompat, jika Carry flag=1 JCXZ <Jump If CX is Zero> | Lompat, jika CX=0 JNA <Jump If Not Above> | Lompat, jika Operand1 < Operand2 | dengan CF=1 atau ZF=1 JNAE <Jump If Not Above nor | Lompat, jika Operand1 < Operand2 Equal> | dengan CX=1 JNB <Jump If Not Below> | Lompat, jika Operand1 > Operand2 | dengan CF=0 JNBE <Jump If Not Below nor | Lompat, jika Operand1 > Operand2 Equal> | dengan CF=0 dan ZF=0 JNC <Jump If No Carry> | Lompat, jika CF=0 JNG <Jump If Not Greater> | Lompat, jika Operand1 <= Operand2 | dengan ZF=1 atau SF tidak sama OF JNGE <Jump If Not Greater | Lompat, jika Operand1 <= Operand2 Nor Equal> | dengan SF tidak sama OF JNL <Jump If Not Less> | Lompat, jika Operand1 >= Operand2 | dengan SF=OF
30
Modul Praktikum Bahasa Rakitan JNLE <Jump If Not Less Nor Equal> JNO <Jump If No Overflow>
| Lompat, jika Operand1 > Operand2 | dengan ZF=0 dan SF=OF | Lompat, jika tidak terjadi | tidak terjadi Overflow JNP <Jump If Not Parity> | Lompat, jika Ganjil JNS <Jump If No Sign> | Lompat, jika SF=0 JNZ <Jump If Not Zero> | Lompat, jika tidak 0 JO <Jump On Overflow> | Lompat, jika OF=1 JP <Jump On Parity> | Lompat, jika Genap JPE <Jump If Parity Even> | Lompat, jika PF=1 JPO <Jump If Parity Odd> | Lompat, jika PF=0 JS <Jump On Sign> | Lompat, jika SF=1 JZ <Jump Is zero> | Lompat, jika 0 -----------------------------+----------------------------------
PROSEDUR PERCOBAAN ;/=========================================\; ; Program : CMPJ.ASM ; ; Fungsi : Mendemokan perintah lompat ; ;\=========================================/; .MODEL SMALL .CODE ORG 100h TData: JMP Proses BilA DB 67 BilB DB 66 Kal0 DB 'Bilangan A lebih kecil dari bilangan B $' Kal1 DB 'Bilangan A sama dengan bilangan B $' Kal2 DB 'Bilangan A lebih besar dari bilangan B $' Proses: MOV AL,BilA ; Masukkan bilangan A pada AL CMP AL,BilB ; Bandingkan AL(BilA) dengan Bilangan B JB AKecil ; Jika BilA < BilB, lompat ke AKecil JE Sama ; Jika BilA = BilB, lompat ke Sama JA ABesar ; Jika BilA > BilB, lompat ke ABesar Akecil: LEA DX,Kal0 ; Ambil offset Kal0 JMP Cetak ; Lompat ke cetak Sama: LEA DX,Kal1 ; Ambil offset Kal1 JMP Cetak ; Lompat ke cetak ABesar: LEA DX,Kal2 ; Ambil offset Kal2 Cetak: MOV AH,09 ; Servis untuk mencetak kalimat INT 21h ; Cetak kalimat !! EXIT: INT 20h ; Kembali ke DOS. END TData
31
Modul Praktikum Bahasa Rakitan ;/================================================\; ; Program : JMPL.ASM ; ; Fungsi : Mencetak kalimat secara perkarakter ; ;\================================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal DB ' Lucky Luck menembak ',13,10 DB 'Lebih cepat dari bayangannya !! ',7,7,'*' Proses: XOR BX,BX ; BX=0 MOV AH,02h ; Servis Untuk Cetak Karakter Ulang: CMP Kal[BX],'*' ; Bandingkan dengan '*' JE Exit ; Jika Sama Lompat ke Exit MOV DL,Kal[BX] ; Masukkan karakter ke BX menuju DL INT 21h ; Cetak karakter INC BX ; Tambah 1 pada BX JMP Ulang ; Lompat Ke Ulang Exit: INT 20h ; Selesai ! kembali ke DOS END TData
1. Tahap pertama dalam membuat program adalah menulis listrik, dimana listing ini dapat anda tulis mengunakan program EDIT dalam MS-DOS atau NOTEPAD (ketik program diatas) 2. Simpan Prograam yang telah anda ketik pada folder TASM 3. Aktifkan MS-DOS lalu masuk kedalam folder TASM 4. Lalu ketik Program TASM.EXE dan ketik nama program yang telah anda ketik 5.
Langka selajutnya anda merubah file anda yang telah menjadi program yang berekstensi OBJ menjadi COM or EXE
6. Lalu jalan program anda
32
Modul Praktikum Bahasa Rakitan MODUL VI STACK DAN SUBROTINE DAN PROCEDURE TUJUAN ¾ Memahami arti dan pengunaan dari stack ¾ Memahami teknik merancang dan menggunakan sobroutine DASAR TOERI APA ITU STACK Bila kita terjemahkan secara bebas, stack artinya adalah 'tumpukan'. Stack adalah bagian memory yang digunakan untuk menyimpan nilai dari suatu register untuk sementara. Operasi- operasi pada assembler yang langsung menggunakan stack misalnya pada perintah PUSH, POP, PUSF dan POPF. Pada program COM yang hanya terdiri atas satu segment, dimanakah letak dari memory yang digunakan untuk stack ?. Seperti pasangan CS:IP yang menunjukkan lokasi dari perintah selanjutnya yang akan dieksekusi, pada stack digunakan pasangan SS:SP untuk menunjukkan lokasi dari stack. PUSH DAN POP Stack dapat kita bayangkan sebagai sebuah tabung yang panjang. Sedangkan nilai pada register dapat dibayangkan berbentuk koin yang dapat dimasukkan dalam tabung tersebut. Untuk memasukkan nilai suatu register pada stack, digunakan perintah push dengan syntax: PUSH Reg16Bit Sebagai contohnya pada perintah: MOV AX,12 MOV BX,33 MOV CX,99 33
Modul Praktikum Bahasa Rakitan PUSH AX ; Simpan nilai AX pada stack PUSH BX ; Simpan nilai BX pada stack PUSH CX ; Simpan nilai CX pada stack Untuk mengambil keluar koin nilai pada tabung stack, digunakan perintah pop dengan syntax: POP Reg16Bit Perintah POP akan mengambil koin nilai pada stack yang paling atas dan dimasukkan pada Reg16Bit. Dari sini dapat anda lihat bahwa data yang terakhir dimasukkan akan merupakan yang pertama dikeluarkan. Inilah sebabnya operasi stack dinamankan LIFO(Last In First Out). Sebagai contohnya, untuk mengambil nilai dari register AX, BX dan CX yang disimpan pada stack harus dilakukan pada register CX dahulu barulah BX dan AX, seperti: POP CX ; Ambil nilai pada puncak stack, masukkan ke CX POP BX ; Ambil nilai pada puncak stack, masukkan ke BX POP AX ; Ambil nilai pada puncak stack, masukkan ke AX Bila anda terbalik dalam mengambil nilai pada stack dengan POP AX kemudian POP BX dan POP CX, maka nilai yang akan anda dapatkan pada register AX, BX dan CX akan terbalik. Sehingga register AX akan bernilai 99 dan CX akan bernilai 12. Seperti yang telah kita ketahui, data tidak bisa dicopykan antar segment atau memory. Untuk mengcopykan data antar segment atau memory anda harus menggunakan register general purpose sebagai perantaranya, seperti: MOV AX,ES ; Untuk menyamakan register MOV DS,AX ; ES dan DS Dengan adanya stack, anda bisa menggunakannya sebagai perantara, sehingga akan tampak seperti: PUSH ES ; Untuk menyamakan register POP DS ; ES dan DS
34
Modul Praktikum Bahasa Rakitan
SUBROUTINE Subroutine adalah prosedur yang ditulis terpisah dari program utama. Bilamana program utama harus menjalankan fungsi yang didefenisikan oleh subroutine, maka subroutine harus dipanggil kedalam operasi. Untuk kerja ini harus dilepaskan dari program utama ke tempat subroutine. Perhatikan hal ini lah yang membedahkan antara subroutine dengan lompta, tidak hanya prosedur lompat pada alamat yang tepat dalam kode segment, tetapi itu memiliki juga mekanisme untuk menyimpan informasi masing-masing IP dan CS, itu diperlukan kembali ke program utama. Dalam pemanggilan subroutine mengizinkan dua tipe operasi yaitu call intrasegment dan ret. Call di gunakan untuk memanggil subroutine dan Ret untuk kembali ke program utama PROSEDUR PERCOBAAN ;/=========================================\; ; Program : NSTACK.ASM ; ; Fungsi : Mencetak kalimat 2 kali ; ;\=========================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal DB 'TASMI TASMI TASMI $' Ganti DB 13,10,'$' Stacks DW ? Proses: LEA DX,Kal MOV Stacks,DX MOV AH,09 INT 21h LEA DX,Ganti INT 21h MOV DX,Stacks INT 21h Exit: INT 20h END TData
35
Modul Praktikum Bahasa Rakitan
;/=========================================\; ; Program : STACK.ASM ; ; Fungsi : Mencetak kalimat 2 kali ; ;\=========================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal DB 'TASMI TASMI TASMI $' Ganti DB 13,10,'$' Stacks DW ? Proses: LEA DX,Kal PUSH DX MOV AH,09 INT 21h LEA DX,Ganti INT 21h POP DX INT 21h Exit: INT 20h END TData ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : PROC_KAR.ASM ; ; FUNGSI : MENCETAK KARATER ; ;============================; .MODEL SMALL .CODE ORG 100h Proses : CALL Cetak_Kar ; Panggil Cetak_Kar INT 20h Cetak_Kar PROC NEAR MOV AH,02h MOV DL,'S' INT 21h ; Cetak karakter RET ; Kembali kepada si pemanggil Cetak_Kar ENDP ; END Procedures END Proses
1. Tahap pertama dalam membuat program adalah menulis listrik, dimana listing ini dapat anda tulis mengunakan program EDIT dalam MS-DOS atau NOTEPAD (ketik program diatas)
36
Modul Praktikum Bahasa Rakitan 2. Simpan Prograam yang telah anda ketik pada folder TASM 3. Aktifkan MS-DOS lalu masuk kedalam folder TASM 4. Lalu ketik Program TASM.EXE dan ketik nama program yang telah anda ketik 5. Langka selajutnya anda merubah file anda yang telah menjadi program yang berekstensi OBJ menjadi COM or EXE 6. Lalu jalan program anda Tugas latihan buatkan program dengan memanggil untuk menambahkan 2 data 8 byte yang disimpan dalam memory 1A00h
37
Modul Praktikum Bahasa Rakitan MODUL VII MACRO TUJUAN ¾ Dapat mengenal proses macro ¾ Dapat menerapkanya macro untuk apliaksi sederhana DASAR TEORI Macro hampir sama dengan procedure, yang dapat membantu anda dalam membuat program yang besar. Dengan Macro anda tidak perlu menggunakan perintah "CALL" dan anda juga bisa menggunakan parameter dengan mudah. Suatu ciri dari pemrograman bahasa tingkat tinggi! Macro adalah lebih mudah dibuat daripada procedure. Untuk membuat Macro bisa anda gunakan bentuk seperti pada gambar --------------------------------------------------------------NamaM MACRO [P1,P2,,] +------------+ | Program | +------------+ ENDM --------------------------------------------------------------"P1" dan "P2" adalah parameter yang bisa anda gunakan pada macro. Parameter ini berbentuk optional, artinya bisa digunakan ataupun tidak. Supaya lebih jelas bisa anda lihat pada program MAC1 yang menggunakan macro ini untuk mencetak karakter. Cetak_Kar MACRO Kar MOV CX,3 MOV AH,02
38
Modul Praktikum Bahasa Rakitan MOV DL,Kar Ulang : INT 21h ; Cetak Karakter LOOP Ulang ENDM ; End Macro .MODEL SMALL .CODE ORG 100h Proses: Cetak_Kar 'S' ; Cetak Huruf S INT 20h END Proses Dari program MAC1 bisa anda lihat betapa mudahnya untuk menggunakan macro. Pada procedure, setiap kali kita memanggilnya dengan perintah CALL maka program akan melompat pada procedure tersebut, sehingga setiap procedure hanya terdapat satu kali saja pada program. Lain halnya dengan Macro, setiap terjadi pemanggilan terhadap macro atau dapat dikatakan secara kasar, setiap kita memanggil macro dengan menuliskan nama macronya dalam program, maka seluruh isi macro akan dipindahkan pada program yang memanggilnya. Dengan demikian bila pada program anda memanggil suatu macro sebanyak 10 kali maka macro tersebut akan disisipkan 10 kali pada program. Hal inilah yang menyebabkan program yang menggunakan macro ukuran programnya menjadi lebih besar. Tetapi hal ini juga yang menyebabkan program yang menggunakan macro lebih cepat daripada procedure, karena pada procedure komputer harus melakukan lompatan tetapi pada macro tidak perlu. Cetak_Kar MACRO Kar LOCAL Ulang ; Label 'Ulang' jadikan Local MOV CX,3 MOV AH,02 MOV DL,Kar Ulang: INT 21h ; Cetak Karakter LOOP Ulang 39
Modul Praktikum Bahasa Rakitan ENDM
; End Macro
.MODEL SMALL .CODE ORG 100h Proses: Cetak_Kar 'P' ; Cetak Huruf P Cetak_Kar 'C' ; Cetak Huruf C INT 20h END Proses 1. Tahap pertama dalam membuat program adalah menulis listrik, dimana listing ini dapat anda tulis mengunakan program EDIT dalam MS-DOS atau NOTEPAD (ketik program diatas) 2. Simpan Prograam yang telah anda ketik pada folder TASM 3. Aktifkan MS-DOS lalu masuk kedalam folder TASM 4. Lalu ketik Program TASM.EXE dan ketik nama program yang telah anda ketik 5. Langka selajutnya anda merubah file anda yang telah menjadi program yang berekstensi OBJ menjadi COM or EXE 6. Lalu jalan program anda
40
Modul Praktikum Bahasa Rakitan MODULVIII MASUKAN DARI KEYBOARD TUJUAN ¾ Dapat mengenal port input dan output ¾ Dapat menerapkanya untuk apliaksi sederhana DASAS TEORI Keyboard merupakan sarana bagi kita untuk berkomunikasi dengan program. Pada bagian ini akan kita lihat bagaimana caranya untuk menanggapi masukan dari keyboard. Tetapi sebelumnnya anda tentunya harus mengerti sedikit mengenai beberapa hal penting yang berkaitan dengan keyboard itu. KODE SCAN DAN ASCII Prosesor pada keyboard mendeteksi setiap penekanan maupun pelepasan tombol pada keyboard. Prosesor ini menterjemahkan setiap sinyal yang terjadi berdasarkan posisi tertentu menjadi apa yang dinamakan kode Scan. Dengan demikian tombol "A" dan "B" akan mempunyai kode Scan yang berbeda karena posisinya memang berbeda. Lain halnya untuk tombol "A" dan "a" yang terdapat pada posisi yang sama, akan mempunyai kode Scan yang sama. Kode Scan ini biasanya tidak berguna bagi kita. Kita biasanya hanya menggunakan kode ASCII dan Extended yang merupakan hasil terjemahan dari kode scan oleh keyboard handler. Kode ASCII adalah kode yang melambangkan suatu karakter baik berupa huruf,angka, maupun simbol-simbol grafik. Misalkan angka "1" akan dilambangkan dengan kode ASCII 49. Untuk kode ASCII ini bisa anda lihat pada lampiran. APA ITU KODE EXTENDED ? Kode ASCII telah menyediakan sebanyak 256 karakter dengan beberapa karakter kontrol, misalnya #10 untuk pindah baris dan #13 untuk Enter yang akan menggerakkan kursor kesamping kiri. Tetapi fungsi yang telah disediakan ini tidak 41
Modul Praktikum Bahasa Rakitan mampu untuk menampilkan ataupun mendeteksi tombol fungsi misalnya F1, F2, F3 dan Home. Tombol kombisasi juga tidak dapat dideteksi oleh karakter ASCII , misalnya penekan tombol shif disertai tombol F1, penekanan Ctrl disertai tombol Home, dan lain-lain. Penekanan terhadap tombol-tombol fungsi dan tombol kombinasi akan menghasilkan kode ASCII 0. Karena alasan diatas maka diciptakanlah suatu kode yang dinamakan sebagai kode EXTENDED. Kode Extended ini dapat mendeteksi penekanan terhadap tombol-tombol fungsi maupun tombol kombinasi. Untuk kode extended bisa anda PROSEDUR PERCOBAAN ;#################################################### ; Program : kunci.asm ; Fungsi : mengunci keyboard ;#################################################### code_seg segment assume cs:code_seg org 100h start: jmp mulai kata1 db'Selamat anda Bisa Menggunakan komputer ini',13,10,'$' kata2 db'Silakan masukan kata kunci sekarang!',13,10,'$' mulai:
mov ah,09h mov dx,offset kata2 int 21h
masuk: mov ah,07h int 21h cmp al,'t' je lewat1 cmp al,'T' jne masuk lewat1: mov ah,07h int 21h cmp al,'a' je lewat2 cmp al,'A' 42
Modul Praktikum Bahasa Rakitan jne masuk lewat2: mov ah,07h int 21h cmp al,'s' je lewat3 cmp al,'S' jne masuk lewat3: mov ah,07h int 21h cmp al,'m' je lewat4 cmp al,'M' jne masuk lewat4: mov ah,07h int 21h cmp al,'i' je lewat5 cmp al,'I' jne masuk lewat5: mov ah,09h mov dx,offset kata1 int 21h int 20h code_seg ends end start 1. Tahap pertama dalam membuat program adalah menulis listrik, dimana listing ini dapat anda tulis mengunakan program EDIT dalam MS-DOS atau NOTEPAD (ketik program diatas) 2. Simpan Prograam yang telah anda ketik pada folder TASM 3. Aktifkan MS-DOS lalu masuk kedalam folder TASM 4. Lalu ketik Program TASM.EXE dan ketik nama program yang telah anda ketik
43
Modul Praktikum Bahasa Rakitan 5. Langka selajutnya anda merubah file anda yang telah menjadi program yang berekstensi OBJ menjadi COM or EXE 6. Lalu jalan program anda
44
Modul Praktikum Bahasa Rakitan MODUL IX PORT SERIAL (PPI 8255) TUJUAN ¾ Mahasiswa mampu membuat program aplikasi input dan output menggunakan PPI dan port ¾ Mahasiswa mampu memahami pengalamatan pada PPI 8255 DASAR TOERI Jika paraler port mengirimkan data secara paraler,maka serial mengirimkan data secara serial. Serial port lebih sulit untuk ditangani dari pada port paraler karena peralatan yang dihubungkan ke serial harus berkomunikasi dengan menggunakan transmisi serial sedangkan data di computer diolah secara paraler. Karenanya data dari serial port harus dikonversikan ke dalam bentuk paraler agar bisa digunakan. Dari segi kecepatan transmisi data serial juga tidak mungkin bisa mengalakan kecepatan transmisi paraler. Namun demikian adal hal yang menjadi keuntungan dari serial port yaitu : •
Kabel serial bisa lebih panjang dari kabel paraler port
•
Tidak diperlukan banyak kabel untuk transmisi dengan port
•
Memungkinkan sinar infra merah
•
Banyak mikrokontroler yang menggunakan port serial
IC Programmable Peripheral Interface (PPI) 8255 IC PPI 8255 merupakan IC antarmuka yang dapat dikendalikan program sehingga dapat diakses langsung ke data bus sebagai masukan maupun keluaran. Didesain untuk sistem mikroprosesor INTEL, ZILOG, dan berbagai mikrokontroler, dll. Fungsinya dibuat sedemikian sebagai sebuah komponen masukan/keluaran serbaguna untuk menjembatani perangkat periferal ke bus sistem mikroprosesor. 45
Modul Praktikum Bahasa Rakitan Konfigurasi Pena Konfigurasi pena IC PPI 8255 terdiri dari 40 pena (pin) sebagai gambar berikut:
Gambar 8. Konfigurasi Pena IC PPI 8255 Deskripsi Fungsional IC PPI 8255 Deskripsi fungsional pena-pena (pin) IC 8255 adalah sebagai berikut: CS (chip select): jika pena masukan ini berlogika 0, maka PPI 8255 akan aktif, berlangsung komunikasi antara PPI 8255 dan CPU (sistem mikro). RD (read): jika pena masukan berlogika 0, maka PPI 8255 akan mengirim data ke CPU melalui bus data (CPU membaca data dari PPI 8255). WR (write): jika pena masukan ini berlogika 0,maka CPU akan mengirim data atau kata kendali ke PPI 8255. A0 dan A1 (pilihan port 0 dan 1):merupakan sinyal masukan, diberikan bersamaan dengan RD dan WR, berfungsi memilih salah satu dari tiga port atau kata kendali. Pena ini dihubungkan ke bit terendah dari bus alamat A0 dan A1. RST: jika pena masukan ini berlogika 1, maka akan menghapus nilai register kendali dan semua port (A,B,C) akan diset sebagai modus masukan.
46
Modul Praktikum Bahasa Rakitan Vcc (catu daya +5V): sebuah kapasitor 0,1 mikrofarat antara pena 26 dan 7 diperbolehkan sebagai dekopling. GND (ground): hubungan ke ground (pembumian). D0…D7: merupakan jalur bus data (dua arah). PA0…PA7 : port A : berfungsi sebagai keluaran 8 bit data latch/buffer dan masukan 8 bit data latch. PB0…PB7 : port B : berfungsi sebagai keluaran 8 bit data latch/buffer dan masukan 8 bit data buffer. PC0…PC7: port C : keluaran 8 bit data lacth/buffer dan masukan 8 bit data buffer. Port ini dapat dibagi atas dua port (setiap port 4 bit data lacth) yang digunakan secara bersama dengan port A dan B untuk mengendalikan sinyal keluaran dan status sinyal masukan. PROSEDUR PERCOBAAN ¾ Hubungkan control DT-51 MinSys dengan control DT-51 trainner board (sebagai sumber) menggunakan kabel tipe X ¾ Hubungkan DT 51 MinSys dengan PC dengan menngunakan kabel serial ¾ Hubungkan DT-51 MinSys dengan sumber tegangan ¾ hubungkan Port A DT-51 MinSys dengan Port Output Dt-51 Trainner Board menggunakan kabel Y, Ketik program dibawah, assemble, download ke DT51 MinSys $mod51 CSEG ORG 400H LJMP TASMI ORG 4100H TASMI: MOV SP, #30H
47
Modul Praktikum Bahasa Rakitan ;inisialisasi MOV DPTR, #2003H MOV A, #80h MOVX
@DPTR, A
;PORT A MOV DPTR, #2000H MOV A, #0CFH MOVX
@DPTR, A
SJMP $
48
Modul Praktikum Bahasa Rakitan Lampiran Code ASCII US ASCII Character Codes (000-063)
US ASCII Character Codes (064-127)
Decimal Hexadecimal Character
Decimal Hexadecimal Character
000
00
NUL
064
40
@
001
01
SOH
065
41
A
002
02
STX
066
42
B
003
03
ETX
067
43
C
004
04
EOT
068
44
D
005
05
ENQ
069
45
E
006
06
ACK
070
46
F
007
07
BEL
071
47
G
008
08
BS
072
48
H
009
09
HT
073
49
I
010
0A
LF
074
4A
J
011
0B
VT
075
4B
K
012
0C
FF
076
4C
L
013
0D
CR
077
4D
M
014
0E
SO
078
4E
N
015
0F
SI
079
4F
O
016
10
DLE
080
50
P
017
11
DC1
081
51
Q
018
12
DC2
082
52
R
019
13
DC3
083
53
S
020
14
DC4
084
54
T
021
15
NAK
085
55
U
022
16
SYN
086
56
V
023
17
ETB
087
57
W
024
18
CAN
088
58
X
025
19
EM
089
59
Y
026
1A
SUB
090
5A
Z 49
Modul Praktikum Bahasa Rakitan 027
1B
ESC
091
5B
[
028
1C
FS
092
5C
\
029
1D
GS
093
5D
]
030
1E
RS
094
5E
^
031
1F
US
095
5F
_
032
20
SP
096
60
`
033
21
!
097
61
a
034
22
"
098
62
b
035
23
#
099
63
c
036
24
$
100
64
d
037
25
%
101
65
e
038
26
&
102
66
f
039
27
'
103
67
g
040
28
(
104
68
h
041
29
)
105
69
i
042
2A
*
106
6A
j
043
2B
+
107
6B
k
044
2C
,
108
6C
l
045
2D
-
109
6D
m
046
2E
.
110
6E
n
047
2F
/
111
6F
o
048
30
0
112
70
p
049
31
1
113
71
q
050
32
2
114
72
r
051
33
3
115
73
s
052
34
4
116
74
t
053
35
5
117
75
u
054
36
6
118
76
v
055
37
7
119
77
w
056
38
8
120
78
x
057
39
9
121
79
y
50
Modul Praktikum Bahasa Rakitan 058
3A
:
122
7A
z
059
3B
;
123
7B
{
060
3C
<
124
7C
|
061
3D
=
125
7D
}
062
3E
>
126
7E
~
063
3F
?
127
7F
DEL
51
Modul Praktikum Bahasa Rakitan
MODUL PRAKTIKUM BAHASA RAKITAN
DISUSUN OLEH TASMI, S.Si
LABORATORIUM KOMPUTER PROGRAM DIPLOMA KOMPUTER UNIVERSITAS SRIWIJAYA
52
Modul Praktikum Bahasa Rakitan KATA PENGANTAR Puji Syukur kepada ALLAH SWT atas berkat yang telah diberikan-Nya dalam penyusunan Penuntun Praktikum Bahasa Rakitan edisi refisi. Terima kasih juga kepada semua pihak yang telah membantu baik secaralangsung maupun tidak. Pada Modul ini, Pembaca akan diajak untuk mengenal cara pemograman dengan assembly Modul penuntun praktikum ini merupakan edisi kedua, yang pembahasannaya di fokuskan pada aplikasi dan cara awal menggunakan program debugger, Tasm , Simulator. Modul ini disusun untuk membatu para pemakai pemulai dalam pemograman menggunakan Bahasa Tingkat Rendah (assembly) karena di modul diberikan beberapa contoh dan cara menggunakan program Assembly. Dan penulis berharap modul ini sebagai awal mahasiswa dalam memahami pemograman dengan mengunakan bahasa mesin yang nanti nya akan terus di gunakan dalam mata kuliah yang berhubungan dengan Hardware (mikrokontroler dan mikroprosesor) Besar harapan penyusun agar para Pembaca dapat memberikan kritik dan saran mengenai isi ataupun penyusunan penuntun praktikum Bahasa Rakitan. Akhir kata, penyusun mengucapkan terima kasih kepada para Pembaca. Selamat belajar! Palembang, Februari 2005 Penulis
53
Modul Praktikum Bahasa Rakitan DAFTAR ISI Hal Kata Pengantar ........................................................................................................ i Daftar isi.................................................................................................................. ii Daftar Gambar......................................................................................................... iii Daftar Tabel ............................................................................................................ iv Modul 1 ................................................................................................................... 1 Modul 2 ................................................................................................................... 11 Modul 3 ................................................................................................................... 15 Modul 4 ................................................................................................................... 18 Modul 5 ................................................................................................................... 24 Modul 6 ................................................................................................................... 29 Modul 7 ................................................................................................................... 34 Modul 8 ................................................................................................................... 37
54