Agus Haryawan - Politama Surakarta

dokumen-dokumen yang mirip
BAB 3 MODE AKSES MEMORI, PENGGUNAAN VARIABEL DAN STACK

LAPORAN PRAKTIKUM ORGANISASI KOMPUTER & BAHASA ASSEMBLY PROGRAM POINTER OPERASI ARITMATIKA

MODUL I PENGENALAN ASSEMBLY

PENGERTIAN REGISTER. Arsitektur Mikroprosesor INTEL 8086 Tinjauan Umum

MODUL PRAKTIKUM ORGANISASI SISTEM KOMPUTER

LAPORAN PRAKTIKUM ORGANISASI KOMPUTER & BAHASA ASSEMBLY PROGRAM OPERASI ARITMATIKA. Kelas : INF 2B Praktikum 1 Nama : Fernalia NIM : J3C212210

Bahasa Rakitan By Okti Yudhanti Nur K REGISTER

ORGANISASI DAN ARSITEKTUR KOMPUTER. rsp oak informatika

OPERATION SYSTEM. Jenis - Jenis Register Berdasarkan Mikroprosesor 8086/8088

MIKROPROSESOR REGISTER-REGISTER MIKROPROSESOR INTEL

REGISTER Register-register yang terdapat pada mikroprosesor, antara lain :

BAB V MEMULAI DENGAN ASSEMBLY

R E G I S T E R. = Code Segment Register = Data Segment Register = Stack Segment Register = Extra Segment Register. 3.

Mikroprosesor. Bab 3: Arsitektur Mikroprosesor. INTEL 8086 Generasi Awal Prosesor PENTIUM. Arsitektur Mikroprosesor 1

OF DF IF TF SF ZF AF PF CF

MODUL V STACK dan PENGENALAN PROCEDURE

Bahasa Rakitan PENGERTIAN REGISTER

Mata Kuliah : Bahasa Rakitan Materi ke-3

MAKALAH REGISTER. Disusun Untuk Memenuhi Tugas Pada Semester 3 Jurusan D3 Teknik Elektro Dengan Mata Kuliah Sistem Digital & Mikroprosessor

SISTEM KERJA MIKROPROSESOR

Menggunakan Bahasa Pemrograman Assembly

Kuis : Bahasa Rakitan (UAS)

IMPLEMENTASI PENGISIAN REGISITER DATA DAN OPERASI ARITMATIKA MENGGUNAKAN PROGRAM COMMAND PROMPT, BAHASA ASSEMBLER

Daftar Isi. Daftar Isi Pertemuan 6: Perintah Masukkan dari Keyboard P6.1. Teori Masukkan dari Keyboard... 3

PEMROGRAMAN BAHASA RAKITAN

PERTEMUAN : 4 EKSPLORASI DEBUG

Instruksi-Instruksi Pemindahan Data. Sistem Komputer Universitas Gunadarma

Karakteristik Instruksi Mesin

Microcontroller: Bahasa Pemrograman Assembly 8051

PETA MEMORI MIKROPROSESOR 8088

Materi 3. Komponen Mikrokomputer SYSTEM HARDWARE DAN SOFTWARE DADANG MULYANA

BAB 3 UNIT KONTROL. Universitas Gadjah Mada 1

Pertemuan ke 7 Mode Pengalamatan. Computer Organization Eko Budi Setiawan

BAHASA PEMOGRAMAN AT89S/Cxx (assembly)

Bab 1. Pemrograman dan Bahasa Rakitan. 1.1 Pendahuluan

Pada pembahasan kali ini, digunakan instruksi MOV untuk menjelaskan mode pengalamatan data. Format penulisannya adalah :

Daftar Isi. Daftar Isi Pertemuan 3: Pengenalan TASM P3.1. Teori Pengenalan Turbo Assembler Struktur Program...

BAB II LANDASAN TEORI LANDASAN TEORI

INTRUKSI-INTRUKSI BAHASA PEMROGRAMAN ASSEMBLY

PERTEMUAN SET INSTRUKSI MIKROKONTROLER AT 89C51

Mode Pengalamatan. Sistem Komputer Universitas Gunadarma

Mikroprosesor. Pertemuan 8. By: Augury

Daftar Isi. Daftar Isi Pertemuan 4: Operator Aritmatika, Logika dan Instruksi Banding dan Lompatan P4.1. Teori... 3

BAB VII KOMPUTER SEDERHANA SAP-3 (SIMPLE AS POSSIBLE-3)

KONFIGURASI PIN-PIN MIKROPROSESOR Z 80. Yoyo somantri Dosen Jurusan Pendidikan Teknik Elektro FPTK Universitas Pendidikan Indonesia

MODUL BAHASA RAKITAN PENDIDIKAN INFORMATIKA

LAPORAN PRAKTIKUM SISTEM MIKROPROSESSOR APLIKASI DASAR INSTRUKSI ARITMATIKA DAN OPERASI LOGIK

Mata Kuliah : Bahasa Rakitan

Daftar Isi. Daftar Isi Pertemuan 2: Pengenalan Debug dan Interrupt P2.1. Teori Pengenalan DEBUG... 3

Diktat Kuliah Organisasi dan Interaksi

Secara fisik, kerja dari sebuah mikrokontroler dapat dijelaskan sebagai siklus

Sistem Komputer. Komputer terdiri dari CPU, Memory dan I/O (Arsitektur Von-Neumann) Ada tiga bus dalam sistem komputer

Set Instruksi & Mode Pengalamatan. Team Dosen Telkom University 2016

Bahasa Pemrograman Assembler 8051

BAB IV IMPLEMENTASI DAN PENGUJIAN IMPLEMENTASI DAN PENGUJIAN

MODE PENGALAMATAN PROGRAM MEMORI

PERINTAH-PERINTAH DASAR (UMUM)

LAPORAN PRAKTIKUM. Praktek Mikroprosesor 1 Job Sheet 2

BAB VIII OPERASI ARITMATIKA

SATUAN ACARA PERKULIAHAN Mata Kuliah: BAHASA RAKITAN Jurusan / Jenjang / Kode / SKS : SI / D3 / KK /2

Diktat Kuliah intel 8088

Set Instruksi: Set instruksi?

MODUL III FLOW CONTROL INSTRUTIONS

BAHASA PEMROGRAMAN MIKROKOMPUTER


PROGRAM STUDI TEKNIK KOMPUTER JURUSAN TEKNIK KOMPUTER POLITEKNIK NEGERI SRIWIJAYA PALEMBANG TK Praktikum Bahasa Rakitan Hand On Lab 4

Konsep Mikroprogramming. Sistem Komputer Universitas Gunadarma

BAB III ALGORITMA DAN PERANCANGAN ALGORITMA DAN PERANCANGAN

Memori Semikonduktor

a b a AND b a OR b a XOR b a NOT a

MAKALAH MODE DAN FORMAT PENGALAMATAN SET INSTRUKSI. Nama : Annisa Christyanti Kelas : XI TJA 3 NIS :

Set Instruksi. Set Instruksi. Set Instruksi adalah kumpulan

ARSITEKTUR KOMPUTER SET INSTRUKSI

Organisasi & Arsitektur Komputer

TEORI MIKROPROSESOR 8088

Kumpulan instruksi lengkap yang dimengerti

Modul Kuliah Bahasa Rakitan. Harry Witriyono, M.Kom. I. Bahasa Rakitan, Microprocessor dan Bilangan

Assembly Basic Programming. By. Rita Wiryasaputra,ST., M. Cs Universitas Indo Global Mandiri 2012

BAB I TUGAS MATA KULIAH SISTEM MIKROPROSESOR DOSEN PEMBERI TUGAS : FATAH YASIN, ST, MT.

Pemrograman Assembler dengan Debug

DASAR PEMROGRAMAN. PENGANTAR BAHASA C ( Sejarah, Struktur Pemrograman, Tipe Data, Operator ) Djoko Soerjanto, M.Kom

Mode Pengalamatan (Addressing Mode) Keluarga Prosesor 8086

DASAR KOMPUTER. Assembly Language

7.Lokasi hasil pemrosesan

Eksplorasi Prosesor 8086 Dengan Program DEBUG

PERTEMUAN SET INSTRUKSI MIKROKONTROLER AT 89C51

Daftar Isi. Daftar Isi Pertemuan 5: Subroutine, Macro, Stack dan Pointer P5.1. Teori Subroutine (Procedure) Macro...

MODUL PRAKTIKUM SISTEM OPERASI PRAKTIKUM I MODEL PEMROGRAMAN 1

BAB XXVII TURBO DEBUGGER

OPERASI ARITMATIKA. Untuk menambah dalam bahas Assembler digunakan perintah ADD, ADC serta INC Sintaks : ADD Tujuan,Asal

Tahun Akademik 2015/2016 Semester I DIG1B3 Konfigurasi Perangkat Keras Komputer

KALKULATOR ASSEMBLY Lutfi Budi Ilmawan

J. Informatika AMIK-LB Vol.1 No.2 /Mei/2013

Mengenal bahasa assembly

ARSITEKTUR SET INSTRUKSI. Ptputraastawa.wordpress.com

BAB 3 Pemrograman Zilog Z80 Lanjutan

Diktat Kuliah Instruksi dan Segmentasi

Simple As Possible (SAP) - 2. Abdul Syukur

8/4/2011. Microprocessor & Microcontroller Programming. Bahasa Pemrograman. Bahasa Pemrograman. Bahasa Pemrograman

DIKTAT BAHASA RAKITAN

Transkripsi:

BUKU PEGANGAN KULIAH oleh: Agus Haryawan, S.T. Jurusan Teknik Komputer DIII / Semester IV (Dipakai untuk kalangan sendiri) POLITEKNIK PRATAMA MULIA SURAKARTA 2007 Jln. Haryo Panular No. 18A Solo, Telp. (0271) 712637 email: Poltek@Politama.ac.id website: http//ww w.politama.a c.id

KATA PENGANTAR Dengan memanjatkan puji syukur ke hadirat Tuhan Yang Maha Esa, atas segala karunia dan rahmat-nya, pada kesempatan ini kami selaku Direktur Politeknik Pratama Mulia Surakarta menyampaikan terima kasih atas segala usaha dari Dosen Pengampu untuk menyusun Buku Pegangan Kuliah Buku Pegangan Kuliah Bahasa Rakitan ini diterbitkan dalam upaya meningkatkan dan mengefektifkan proses belajar mengajar di Politeknik Pratama Mulia Surakarta, khususnya pada jurusan Teknik Komputer. Untuk lebih mendalami masalah Bahasa Rakitan tidak hanya berpegangan pada buku ini saja, mahasiswa diharapkan membaca buku-buku referensi yang lain. Ucapan terima kasih disampaikan kepada semua pihak yang telah berpartisipasi dalam penerbitan buku ini. Saran dan kritik yang konstruktif dari para dosen, pembaca dan mahasiswa sangat diharapkan, demi perbaikan dan penyempurnaan penerbitan di masa akan datang. Semoga buku ini bermanfaat bagi para pemakai dalam rangka peningkatan mutu pendidikan di Politeknik Pratama Mulia Surakarta Surakarta, April 2013 Drs. Sunaryo NIP. 131283272 i

DAFTAR ISI Bab 1 Mikroprosesor, Memori dan Register 1 1.1 Register 1 1.1.1 Pengertian Register 1 1.1.2 Jenis-Jenis Register 1 1.2 Pengetahuan Dasar Program Assembler 3 1.3 Konstruksi Program Assembler 3 1.3.1 Assembler Directive 4 1.3.2 Pembentukan Variabel dan Konstanta Secara Assembler 5 1.3.3 Membuat Program Dengan Bahasa Assembler (Program COM dan EXE) 5 1.3.4 Perbedaan Program COM dan EXE 7 1.3.5 Membuat program dengan Turbo Assembler dan Turbo Linker 8 1.3.6 Instruksi MOV 9 1.3.7 Instruksi INT 10 1.4 Memulai Program Assembler 10 Bab 2 Mode Akses Memori, Penggunaan Variabel Dan Stack 12 2.1 Mode Pengalamatan atau Pengaksesan 12 2.1.1 Mode Pengalamatan Register dan Segera 13 2.1.2 Mode Pengalamatan Langsung 13 2.1.3 Mode Pengalamatan Tak-langsung Register 14 2.1.4 Mode Pengalamatan Relatif Dasar 14 2.1.5 Mode Pengalamatan Langsung Terindeks 14 2.1.6 Mode Pengalamatan Dasar Terindeks 15 2.1.7 Variabel Dan Penggunaannya 15 2.2 Larik Dan Penggunaannya 15 2.3 Memperoleh Alamat Suatu Variabel 16 2.4 Konstanta 17 2.5 Stack 17 Bab 3 Instruksi 80X86 20 3.1 Instruksi Transfer Data 20 3.2 Instruksi Aritmetika 23 3.3 Instruksi Manipulasi Bit 27 3.4 Instruksi Kontrol Aliran Program 29 3.5 Instruksi String 36 3.6 Instruksi Interupsi 41 3.7 Instruksi Kontrol Prosesor 41 ii

Bab 4 Interupsi 43 4.1 Pendahuluan 43 4.2 Daftar Interupsi Pilihan 43 Bab 5 Procedure dan Makro 53 5.1 Procedure 53 5.1.1 Membuat Procedure 53 5.1.2 Menggunakan Procedure 53 5.2 Macro 55 5.2.1 Membuat Makro 55 5.2.2 Label Pada Makro 56 5.3 Macro atau Procedure 57 Bab 6 Contoh-Contoh Program Untuk Latihan 58 iii

B AB I 1 MIKROPROSESOR, MEMORI DAN REGISTER 1.1 REGISTER 1.1.1 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. 1.1.2 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 di mana 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 ES(Extra Segment) dan GS<Extra Segment>. 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 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 menunjukkan 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 1

Bab I Mikroprosesor, Memori dan Register 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 di mana masing-masing bagian terdiri atas 8 bit, seperti pada gambar 4.1. Akhiran H menunjukkan High sedangkan akhiran L menunjukkan Low. + A X + + B X + + C X + + D X + +-+--+--+-+ +-+--+--+-+ +-+--+--+-+ +-+--+--+-+ 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 aritmetika terutama dalam operasi pembagian dan pengurangan. segmen. Register BX, biasanya digunakan untuk menunjukkan suatu alamat offset dari suatu Register CX, digunakan secara khusus pada operasi looping di mana 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 di memory tempat dari instruksi (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 mencatat sampai 16 keadaan. Adapun flag yang terdapat pada mikroprosesor 8088 ke atas adalah : OF (OverFlow Flag) Jika terjadi OverFlow pada operasi aritmetika, bit ini akan bernilai 1. SF (Sign Flag) Jika digunakan bilangan bertanda bit ini akan bernilai 1. ZF (Zero Flag) Jika hasil operasi menghasilkan nol, bit ini akan bernilai 1. CF (Carry Flag) Jika terjadi borrow pada operasi pengurangan atau carry pada penjumlahan, bit ini akan bernilai 1. PF (Parity Flag) DF (Direction Flag) Digunakan untuk menunjukkan paritas bilangan. Bit ini akan bernilai 1 bila bilangan yang dihasilkan merupakan bilangan genap. Digunakan pada operasi string untuk menunjukkan arah proses. 2

Bab I Mikroprosesor, Memori dan Register IF (Interrupt Enable Flag) TF (Trap Flag) AF (Auxiliary Flag) NT (Nested Task) IOPL (I/O Protection level) CPU akan mengabaikan interupsi yang terjadi jika bit ini 0. Digunakan terutama untuk debugging, dengan operasi step by step. Digunakan oleh operasi BCD, seperti pada perintah AAA. Digunakan pada prosesor 80286 dan 80386 untuk menjaga jalannya interupsi yang terjadi secara beruntun. Flag ini terdiri atas 2 bit dan digunakan pada prosesor 80286 dan 80386 untuk mode proteksi. 1.2 PENGETAHUAN DASAR PROGRAM ASSEMBLER Bahasa Assembler adalah bahasa komputer yang kedudukannya di antara bahasa mesin dan bahasa level tinggi seperti bahasa C atau Pascal. Bahasa C atau Pascal dikatakan sebagai bahasa level tinggi karena memakai kata-kata dan pernyataan yang mudah dimengerti manusia, meskipun masih jauh berbeda dengan bahasa manusia sesungguhnya. Bahasa mesin adalah kumpulan kode biner yang merupakan instruksi'yang bisa dijalankan oleh komputer. Sedangkan bahasa Assembler memakai kode Mnemonic untuk menggantikan kode biner, agar lebih mudah diingat sehingga lebih memudahkan penulisan program. Program yang ditulis dengan bahasa Assembler terdiri dari label, kode mnemonic dan lain sebagainya, pada umumnya dinamakan sebagai program sumber (source code) yang belum bisa diterima oleh prosesor untuk dijalankan sebagai program, tapi harus diterjemahkan dulu menjadi bahasa mesin dalam bentuk kode biner. Program sumber dibuat dengan program editor biasa, misalnya NotePad pada Windows atau Edit.com pada DOS, selanjutnya program sumber diterjemahkan ke bahasa mesin dengan menggunakan program Assembler. Hasil kerja program Assembler adalah "program objek" dan juga "assembler listing. Assembler Listing merupakan naskah yang berasal dari program sumber, dalam naskah tersebut pada bagian sebelah setiap baris dari program sumber diberi tambahan hasil terjemahan program Assembler. Tambahan tersebut berupa nomor memori-program berikut dengan kode yang akan diisikan pada memori-program bersangkutan. Naskah ini sangat berguna untuk dokumentasi dan sarana untuk menelusuri program yang ditulis. 1.3 KONSTRUKSI PROGRAM ASSEMBLER Program sumber dalam bahasa Assembler menganut prinsip 1 baris untuk satu perintah, setiap baris perintah tersebut bisa terdiri atas beberapa bagian (field), yakni: - label (untuk menandai suatu baris) - mnemonic (OpCode / Kode Operasi) - operand (yang bisa lebih dari satu) - komentar (untuk keterangan atau catatan mengenai baris atau blok program) Untuk membedakan masing-masing bagian tersebut dibuat ketentuan sebagian berikut: 3

Bab I Mikroprosesor, Memori dan Register 1. Masing-masing bagian dipisahkan dengan spasi atau TAB, khusus untuk operand yang lebih dari satu masing-masing operand dipisahkan dengan koma. 2. Bagian-bagian tersebut tidak harus semuanya ada dalam sebuah baris, jika ada satu bagian yang tidak ada maka spasi atau TAB sebagai pemisah bagian tetap harus ditulis. 3. Bagian Label ditulis mulai huruf pertama dari baris, jika baris bersangkutan tidak mengandung Label maka label tersebut digantikan dengan spasi atau TAB, yakni sebagai tanda pemisah antara bagian Label dan bagian mnemonic. Label OpCode Operand Komentar TData : JMP Proses ; Lompat ke Proses Proses : MOV AX,13h ; AX=13h SUB BX,AX ; Kurangkan BX-AX MOV DX,BX ; DX=BX MOV AX,30H ; AX=30h SBB BX,AX ; Kurangkan BX-AX MOV BX,AX END INT 20h ; Kembali ke DOS TData 1.3.1 Assembler Directive Seperti sudah dibahas di atas, bagian Mnemonic dari sebuah baris perintah bisa merupakan instruksi untuk prosesor, maupun berupa Assembler Directive untuk mengatur kerja dari program Assembler. Mnemonic untuk instruksi prosesor, sangat tergantung pada prosesor yang dipakai, sedangkan mnemonic untuk Assembler Directive tergantung pada program Assembler yang dipakai. Meskipun demikian, terdapat beberapa Assembler Directive yang umum, yang ' untuk banyak macam program Assembler. ORG Assembler Directive yang bersifat umum tersebut, antara lain adalah singkatan dari ORIGIN, untuk menyatakan nomor memori yang dipakai setelah perintah itu, misalnya ORG $1000 maka memori berikutnya yang dipakai Assembler adalah $1000. ORG berlaku untuk memori program maupun memori data. Dalam hal penomoran memori, dikenal tanda $ sebagai awalan untuk menyatakan nomor memori dari baris bersangkutan. Misalnya: ORG 1000 LJMP$+1000 Operand $+$500 mempunyai arti nomor memori program bersangkutan ditambah dengan $500, karena instruksi LJMP ini terletak persis di bawah ORG $1000 maka nomor memori program baris ini adalah $1000, sehingga operand $+$500 bernilai $1500 dan instruksi ini identik dengan LJMP $1500 EQU singkatan dari EOUATE, dipakai untuk menentukan nilai sebuah Symbol. 4

Bab I Mikroprosesor, Memori dan Register Misalnya: ANGKA88 EQU, 88 memberi nilai 88 pada Symbol ANGKA88, atau CR EQU $0D mempunyai makna kode ASCII dari CR (Carriage Retum) adalah $08. DB singkatan dari DEFINE BYIE, dipakai untuk memberi nilai tertentu pada memori-program. Nilai tersebut merupakan nilai 1 byte, bisa berupa angka ataupun kode ASCII. DB merupakan Assembler Directive yang dipakai untuk membentuk teks maupun tabel. ORG $0200 STRING DB 'AtmelAT89C2051' PANJANG ELU $-STRING ORG $0200 memerintahkan program Assembler agar bekerja mulai dari memori-program nomor $0200, instruksi selanjutnya memerintahkan program Assembler agar mengisi memori-program nomor $0200 dan berikutnya dengan tulisan 'Atmel AT89C2051" (yang diisikan adalah kode ASCII dari 'A', 't' dan seterusnya), PANJANG dari STRING bisa dihitung dengan cara PANJANG EQU $-STRING, yakni selisih dari nomor memori-program baris bersangkutan dikurangi dengan nomor awal memori-program yang diisi STRING. DW singkatan dari DEFINE WORD, dipakai untuk memberi nilai 2 byte ke memori-program pada baris bersangkutan. Assembler Directive ini biasa dipakai untuk membentuk suatu tabel yang isinya adalah nomor-nomor memori-program. DS singkatan dari Define Storage, Assembler Directive ini dipakai untuk membentuk variabel. Sebagai variabel tentu saja memori yang dipakai adalah memori-data (RAM) bukan memoriprogram (ROM). Hal ini harus benar-benar dibedakan dengan Assembler Directive DB dan DW yang membentuk kode di memori-program. Dan karena DS bekerja di RAM, maka DS hanya sekedar menyediakan tempat di memori, tapi tidak mengisi nilai pada memori bersangkutan. 1.3.2 Pembentukan Variabel dan Konstanta Secara Assembler Assembler dilengkapi dengan pengatur program Assembler {assembler directive) untuk mengisi berbagai macam data ke memori-program. Ada 2 macam pengatur program Assembler (assembler directive), yakni DB (Define Byte) dan DW (Define Word). DB dipakai untuk membentuk data byte demi byte, sedangkan DW dipakai untuk membentuk data 2 byte yang merupakan alamat (nomor memori). DB singkatan dari Define Byte, memerintah Assembler agar mengisi memori-program dengan data-data yang tercantum dalam operand. Operand dari perintah DB bisa hanya satu, tapi bisa berapa pun sejauh baris untuk menulis perintah tersebut masih cukup menampung. Seperti biasa kalau terdapat banyak operand, maka operand satu dengan yang lain dipisahkan dengan tanda koma. DB sering dipakai untuk membentuk tabel dalam memori-program. Define Word (DW) merupakan pengatur program Assembler (assembler directive) untuk mengisi memori-program seperti DB, tapi yang diisikan adalah nomor memori yang panjangnya 2 byte. 1.3.3 Membuat Program Dengan Bahasa Assembler (Program 5

Bab I Mikroprosesor, Memori dan Register COM dan EXE) Program COM Untuk membuat program.com yang hanya menggunakan 1 segment, bisa anda buat dengan model program seperti gambar di bawah ini. Bentuk yang digunakan di sini 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). ----------------------------------------------------------- ORG 100H Label1 : JMP Label2 +---------------------+ TEMPAT DATA PROGRAM +---------------------+ Label2 : +---------------------+ TEMPAT PROGRAM +---------------------+ INT 20H END Label1 ----------------------------------------------------------- Model Program COM Supaya lebih jelas bentuk dari program ideal, marilah kita telusuri lebih lanjut dari bentuk program ini. MODEL SMALL Tanda directive ini digunakan untuk memberitahukan kepada assembler bentuk memory yang digunakan oleh program kita. Model inilah yang akan sering kita pakai pada buku ini, karena data dan code yang digunakan oleh program kurang dari ukuran 1 segment atau 64 KB. Model yang lain seperti TINY, MEDIUM, COMPACT, LARGE dan HUGE akan kita gunakan pada kesempatan lain. 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. 6

Bab I Mikroprosesor, Memori dan Register 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 dengan syntax: 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. 1.3.4 Perbedaan Program COM dan EXE Program dengan ektensi COM dan EXE mempunya berbagai perbedaan yang menyolok, antara lain : PROGRAM COM : - Lebih pendek dari file EXE - Lebih cepat dibanding file EXE - Hanya dapat menggunakan 1 segmen - Ukuran file maksimum 64 KB (ukuran satu segment) - Sulit untuk mengakses data atau procedure yang terletak pada segment yang lain. - 100h byte pertama merupakan PSP(Program Segment Prefix) dari program tersebut. - Bisa dibuat dengan DEBUG PROGRAM EXE : - Lebih panjang dari file COM 7

Bab I Mikroprosesor, Memori dan Register - Lebih lambat dibanding file COM - Bisa menggunakan lebih dari 1 segmen - Ukuran file tak terbatas sesuai dengan ukuran memory. - Mudah mengakses data atau procedure pada segment yang lain. - Tidak bisa dibuat dengan DEBUG 1.3.5 Membuat program dengan Turbo Assembler dan Turbo Linker Untuk membuat program COM dan EXE dengan Turbo Assembler dan Turbo Linker, prosedurnya adalah sebagai berikut: 1. Tuliskan program sumber Assembler dengan menggunakan salah satu dari berbagai program text editor, misalnya: - Notepad (dijalankan melalui Start Menu Window atau dengan meng-click file program, sumber pada Windows Explorer) Catatan: Karena Notepad menyimpan teks dengan ekstensi default.txt, maka untuk menyimpan dengan ekstensi.asm, kita tuliskan nama filenya dengan diapit tanda petik. Menyimpan dengan nama baru, nama file diapit tanda petik 8

Bab I Mikroprosesor, Memori dan Register - EDIT.COM (dijalankan melalui DOS Prompt dengan mengetikkan EDIT <ENTER> File program sumber harus berekstensi.asm 2. Compile file program sumber menggunakan TASM dengan cara mengetikkan di DOS Prompt sebagai berikut: TASM [nama_file_program_sumber] Contoh, jika program sumber kita buat adalah LATIHAN.ASM maka ketikkan di DOS Prompt: TASM LATIHAN 3. Lakukan linking file program sumber dengan cara mengetikkan di DOS Prompt sebagai berikut: - Untuk program COM: TLINK/T [nama_file_program_sumber] - Untuk program EXE: TLINK [nama_file_program_sumber] Contoh, jika program sumber LATIHAN.ASM di atas adalah program sumber COM, maka ketikkan: TLINK/T LATIHAN Jika proses compiling dan linking berhasil (tidak ada pesan ERROR) maka akan dihasilkan program COM atau EXE yang langsung dapat dijalankan di DOS Prompt. 1.3.6 Instruksi MOV Instruksi MOV merupakan instruksi yang sering dipakai pada program assembler. Instruksi ini digunakan untuk mengcopy nilai atau angka menuju ke suatu register, variabel atau memory. Adapun syntax untuk instruksi MOV ini adalah: Contoh: MOV Tujuan,Asal MOV AL,9 ; masukkan nilai 9 pada AL MOV AH,AL ; nilai AL=9 dan AH=9 9

Bab I Mikroprosesor, Memori dan Register Pada baris pertama (MOV AL,9), kita memberikan nilai 9 pada register AL. Kemudian pada baris kedua (MOV AH,AL) kita mengcopykan nilai register AL untuk AH. Jadi, setelah operasi ini, register AL akan tetap bernilai 9, dan register AH akan sama nilainya dengan AL atau 9. Yang perlu dicatat di sini bahwa semua instruksi pengcopyan data, arahnya dari kanan ke kiri atau dari operand2 ke operand1: MOV operand1,operand2 Begitu juga dengan instruksi pengcopyan data lainnya, seperti: LEA operand1,operand2 1.3.7 Instruksi INT Kita juga akan sering menggunakan instruksi ini. Syntax-nya adalah: INT NoInt Tiap-tiap nomor interrupt akan menghasilkan perintah yang berbeda. Sebagai contoh, INT 20h merupakan instruksi untuk menghentikan proses eksekusi program assembler dan kembali ke DOS. INT 21h merupakan interrupt dari DOS, di mana perintah ini masih tergantung dari nilai register AH yang kita berikan. Misalkan INT 21h service 09h adalah perintah untuk mencetak string ke layar. 1.4 MEMULAI PROGRAM ASSEMBLER Contoh 4.1 Ketikkan contoh program berikut dengan notepad dan simpan dengan nama MOD41.ASM ORG 100H TData: JMP Proses TEKS DB Hello, mari belajar bahasa Assembler$ Proses: LEA DX,TEKS MOV AH,9H INT 21H INT 20H END TData Perhatikan bahwa karakter $ (dollar) pada teks Hello, mari belajar bahasa Assembler$ harus 10

Bab I Mikroprosesor, Memori dan Register dituliskan. Instruksi: - Buatlah program COM dengan TASM dan TLINK/T, lalu jalankan! - Ketikkan program di atas pada EMU8086 dan emulasikan! 11

B A B I I 2 MODE AKSES MEMORI, PENGGUNAAN VARIABEL DAN STACK Pengaksesan memori yang dibicarakan dalam bab ini meliputi memori internal prosesor yang biasa disebut sebagai register dan memori di luar prosesor. Pada bagian pertama akan dibicarakan beberapa mode pengaksesan atau pengalamat kemudian dilanjutkan dengan penggunaan variabel dalam Bahasa Assembler serta bagian akhir penjelasan tentang Stack. 2.1 MODE PENGALAMATAN ATAU PENGAKSESAN Seperti diketahui bahwa instruksi-instruksi Assembly ada yang membutuhkan operan baik satu maupun dua. Operan-operan ini dibutuhkan oleh instruksi yang bersangkutan, misalnya MOV AX,BX, pada instruksi terlihat dibutuhkannya dua operan yaitu register AX dan BX. Prosesor saat menjalankan suatu instruksi bisa memperoleh operan dari register, dalam instruksi itu sendiri, suatu lokasi memori atau port I/O (keluaran/ masukan). Secara garis besar terdapat 7 (tujuh) macam mode pengalamatan, yaitu: 1. Pengalamatan register (register addressing); 2. Pengalamatan segera (immediate addressing); 3. Pengalamat langsung (direct addressing); 4. Pengalamatan tak-langsung register (register indirect addressing); 5. Pengalamatan relatif dasar (base relative addressing); 6. Pengalamatan langsung terindeks (direct indexed addressing); dan 7. Pengalamatan dasar terindeks (base indexed addressing). 8. Masing-masing mode tersebut masing-masing memiliki ciri khas tersendiri, perhatikan tabel 3.1. Untuk dua mode pengalamatan yang pertama, register dan segera, tidak membutuhkan segmen karena operannya berupa register atau data langsung. Lima mode terakhir (mode 3 hingga 7) merupakan mode pengalamatan memori. Mode pengalamatan Format operan Register segmen Register Register Tidak ada Segera Data Tidak ada Langsung Pergeseran DS Label DS Tak-langsung register [BX] DS [BP] SS [DI] DS [SI] DS Relatif dasar [BX] + pergeseran DS [BP] + pergeseran SS Langsung terindeks [DI] + pergeseran DS [SI] + pergeseran DS Dasar terindeks [BX][SI] + pergeseran DS 12

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack [BX][DI] + pergeseran [BP][SI] + pergeseran [BP][DI] + pergeseran DS SS SS 2.1.1 Mode Pengalamatan Register dan Segera Pada mode pengalamatan register, prosesor akan mengambil operan dari suatu register, misalnya instruksi: MOV AX,CX digunakan untuk menyalin isi register AX (16-bit atau word) ke register CX (16-bit juga), dengan kata lain menyamakan register AX dan CX. Sedangkan pada mode pengalamatan segera, prosesorakan mengambil operan langsung dari instruksi yang bersangkutan, yaitu berupa data atau konstanta byte maupun word, misalnya instruksi: ADD AX,0034h digunakan untuk menambahkan isi register AX dengan data 34h dan hasilnya disimpan di AX kembali. 2.1.2 Mode Pengalamatan Langsung Dalam mode pengalamatan memori dikenal adanya istilah alamat efektif atau effective address. Alamat efektif ini merupakan jarak dalam byte dari awal segmen hingga lokasi memori atau operan yang bersangkutan. Alamat efektif ini juga disebut sebagai offset bersama dengan segmen membentuk alamat fisik dengan persamaan: Alamat fisik = offset + (segmen x 16) segmen yang dikalikan 16 artinya digeser ke kiri 4-bit, dengan demikian jika dituliskan suatu alamat logik CS:IP = 2340:0100, maka alamat fisiknya adalah: 23400 - segmen digeser ke kiri 4 bit atau l digit heksa 0100 - offset 23500 Dengan mode pengalamatan langsung, offset atau alamat efektif ada di dalam instruksi yang bersangkutan (menjadi satu dengan instruksi tersebut, sama seperti mode pengalamatan segera). Operan pengalamatan langsung biasanya berupa label, misalnya: MOV AX,TABEL Instruksi ini digunakan untuk menyalin isi lokasi memori yang ditunjuk oleh label TABEL (sebelumnya harus didefinisikan dulu) ke register AX. Perhatikan contoh program berikut ini: ; program contoh mode pengalamatan langsung ; ORG looh JMP START ; mulai dari START TABEL DW 2345h ; definisikan TABEL start: MOV DX,TABEL INT 20H Ketik dan jalankan menggunakan emulator program ini. Perhatikan saat dijalankan per instruksi, TABEL diberikan lokasi 0102h, sebagaimana ditunjukkan pada gambar 3.1, isi memori 13

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack pada lokasi 0102h=45 dan 0103h=23, dalam hal ini cara penyimpanannya menggunakan metode Litle Endian, artinya yang bobot digitnya kecil ditaruh belakangan (di lokasi berikutnya). Setelah selesai Anda jalankan, perhatikan bahwa sekarang register DX berisi data2345h. 2.1.3 Mode Pengalamatan Tak-langsung Register Pada mode pengalamatan tak-langsung register ini, alamat offset operan disimpan dalam register dasar BX, register penunjuk dasar BP atau register indeks SI atau DI. Perhatikan contoh program berikut ini: ; program contoh mode pengalamatan tak-langsung register ORG looh start: MOV BX,010AH ; BX diisi dulu MOV DX,[BX] ; mode tak-langsung register INT 20H Perhatikan untuk contoh ini kita isi dulu register BX dengan nilai 010Ah, kita tidak tahu pada lokasi 01 OAh tersebut berisi data atau nilai berapa kecuali setelah kita jalankan emulatornya. Hasil eksekusi program ini berupa isi DX yang berubah menjadi isi memori lokasi 010Ah yaitu 168B. 2.1.4 Mode Pengalamatan Relatif Dasar Pada mode pengalamatan ini, alamat efektif dihitung dengan cara menjumlahkan nilai pergerseran dengan isi register dasar BX atau BP. Perhatikan contoh program berikut ini: ; program contoh mode pengalamatan relatif dasar ORG looh start: MOV BX,010AH ; BX diisi dulu MOV DX,[BX]+2 ; mode relatif dasar INT 20H Seperti pada contoh sebelumnya, register BX diisi dengan nilai 010Ah terlebih dahulu, kemudian lokasi memori yang ditunjuk oleh [BX]+2 yaiti 010Ah+2 atau 010Ch disalin ke register DX. Selain cara penulisan seperti pada contoh program tersebut, Anda bisa juga menuliskan dengan cara: MOV DX,2[BX] ; seperti ini, atau MOV DX, [BX+2] ; seperti ini 2.1.5 Mode Pengalamatan Langsung Terindeks Dengan mode pengalamatan langsung terindeks, alamat efektif merupakan jumlah dari pergeseran dengan register indeks SI atau DI. Perhatikan contoh program berikut ini: ; program contoh mode pengalamatan langsung terindeks ORG looh JMP START TABEL DB 45H,23H,12H ; pertama indeks-nya 0 START: MOV DI,2 ; disalin indeks ke-2 MOV AL,TABEL[DI] ; ke register AL INT 20H Seperti pada contoh program yang pertama, kita definisikan dulu sebuah data TABEL, yaitu 45h, 23h dan 12h. Data pertama berindeks 0 dan akan disalin data yang ketiga atau 14

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack berindeks 2 ke register AL (melalui register DI yang diisi 2). Melalui emulator terlihat bahwa TABEL diberikan lokasi 0102h hingga 0104h, sebagaimana ditunjukkan pada gambar 3.3. Hasil eksekusi program ini berupa isi register AL yang berubah menjadi 12h (silahkan dicek pada emulator). 2.1.6 Mode Pengalamatan Dasar Terindeks Dalam mode pengalamatan ini (dasar terindeks), alamat efektif merupakan jumlahan register dasar, register indeks dan (opsional) pergeseran. Mode pengalamatan ini sangat cocok untuk akses data larik dua dimensi. Perhatikan contoh program berikut: ORG looh OMP START TABEL DB 45H,23H,12H,56H,89H ; pertama indeks-nya 0 START: MOV DI, 2 ; disalin indeks ke-2 MOV BX,l ; salin indeks ke-1 MOV AL,TABEL[DI+BX+1] ; ke register AL INT 20H Mirip dengan program sebelumnya, sekarang TABEL kita perpanjang hingga 5 data (dari indeks 0 sampai 4). Register indeks yang digunakan adalah DI (dengan diisi 2), reister dasar yang digunakan adalah BX (dengan diisi 1) kemudian pergeseran diisi dengan 1, sehingga total indeks yang digunakan adalah 2+1+1 = 4 atau data ke-5. Setelah program dijalankan, perhatikan bahwa register AL akan berisi 89H (perhatikan pada emulator). 2.1.7 Variabel Dan Penggunaannya Sebagaimana dikenal dalam bahasa pemrograman lainnya (Pascal, BASIC, C, C++ dan lain-lain), variabel adalah nama dari suatu lokasi memori. Dari kacamata pemrogram, akan lebih mudah untuk menyimpan suatu nilai dalam sebuah variabel dengan nama, misalnya, dataoi daripada meyimpan dengan alamat langsung memori, misalnya, 5A88:1239, apalagi jika data yang akan disimpan dalam jumlah yang cukup banyak. Emu8086 mendukung dua jenis variabel, yaitu BYTE, dengan lebar data 8-bit dan WORD, dengan lebar data 16-bit. Sintaks atau cara penulisan deklarasi variabel dalam Emu8086 sebagai berikut: nama DB nilai nama DW nilai DB - kepanjangan dari Def ine Byte, dan DW - kepanjangan dari Define Word nama - dapat sembarang kombinasi huruf atau angka, diawali dengan huruf. Dimungkinkan juga mendeklarasikan variabel yang tidak bernama (variabel jenis ini memiliki alamat tapi tidak memiliki nama). nilai - dapat sembarang nilai numerik dalam berbagai macam format yang didukung (desimal, biner dan heksadesimal) atau gunakan simbol? untuk variabel-variabel yang belum akan diisi (tidak diinisialisasi). 2.2 LARIK DAN PENGGUNAANNYA Larik atau araydapat dilihat sebagai serangkaian variabel-variabel. String teks merupakan contoh larik byte, masing-masing karakter dinyatakan dalam kode ASCII (dalam 15

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack ukuran byte dari 0 hingga 255). Berikut ini contoh definisi larik: a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h b DB Hello', 0 b merupakan salinan persis dari a, saat kompiler menemui suatu string di antara tanda petik tunggal, maka secara otomatis akan dikonversikan ke kode ASCII. Pada gambar 3.5 ditunjukkan bagian memori yang menyimpan larik yang telah dideklarasikan sebelumnya. misalnya: Anda bisa mengakses sembarang nilai elemen dalam larik menggunakan kurung siku, MOV AL,a[3] Selain dengan cara menuliskan langsung indeksnya, seperti contoh sebelumnya, Anda bisa juga menggunakan register indeks BX, SI, DI atau BP, misalnya: MOV SI,3 MOV AL,a[SI] Perhatikan contoh program berikut ini: ORG looh MOV AH,A[3] MOV SI,4 MOV AL,B[SI] RET A DB 48H, 65H, 6CH, 6CH, 6FH, OOH B DB 'Hellb',0 Jika Anda ingin mendeklarasikan suatu larik yang besar, Anda bisa menggunakan operator DUP. Caranya: angka DUP(nilai) angka diisi dengan jumlah duplikasi yang ingn dibuat (sembarang angka), sedangkan nilai diisi dengan ekspresi yang akan diduplikasi, misalnya: c DB 5 DUP(9) artinya, menduplikasi angka 9 sebanyak 5 kali, sama dengan jika dituliskan: c DB 9,9,9,9,9 Contoh lain: d DB 5 DUP(l,2) sama dengan jika dituliskan: d DB l,2,l,2,l,2,l,2,l,2 Tentu saja Anda bisa menggunakan DW selain DB, tetapi DW tidak bisa digunakan untuk mendeklarasikan string! Ekspansi dengan operan DUP tidak boleh lebih dari 1020 karakter! Ekspansi yang terakhir hanya 12 karakter, dihitung setelah DB. Jika Anda ingin mendeklarasikan suatu larik yang besar, buatlah deklarasinya menjadi 2 baris, toh pada akhirnya Anda akan mendapatkan sebuah larik besar sesuai keinginan. 2.3 MEMPEROLEH ALAMAT SUATU VARIABEL Ada sebuah instruksi, yaitu LEA (Load Effective Address) dan operan alternatif OFFSET, yang dapat digunakan untuk memperoleh alamat offset dari suatu variabel. 16

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack Instruksi LEA lebih ampuh, karena membolehkan Anda mendapatkan alamat sari suatu variabel terindeks (seperti larik). Memperoleh alamat dari suatu variabel akan sangat bermanfaat dalam beberapa situasi atau kasus, misalnya, saat Anda ingin mengambil suatu parameter ke suatu prosedur. digunakan: Untuk memberitahukan kompiler tipe data yang digunakan, maka prefiks berikut harus BYTE PTR WORD PTR Misalnya: BYTE PTR [BX] WORD PTR [BX] Perhatikan contoh program berikut: ORG looh MOV AL, VARl LEA BX, VARl MOV BYTE PTR [BX],44H ; akses byte, atau ; akses word ; nilai VARl disalin ke AL ; ambil alamat VARl simpan di BX ; ganti isi dari VARl ; periksa nilai VARl (ke AL) MOV AL, VARl RET VARl DB 22H END Juga perhatikan pada contoh yang lainnya (tetapi fungsinya sama): ORG l00h MOV AL, VAR1 ; nilai VARl disalin ke AL MOV BX, OFFSET VARl ; ambil alamat VARl simpan di BX MOV BYTE PTR [BX], 44H ; ganti isi dari VARl MOV AL, VAR1 ; periksa nilai VARl (ke AL RET VARl DB 22H END Sekilas kedua program tersebut sama persis, tetapi ada perbedaan dalam cara mendapatkan offset dari variabel VAR1. 2.4 KONSTANTA Konstanta sama seperti variabel, tetapi konstanta hanya akan eksis (ada) hingga program Anda dikompilasi. Setelah suatu konstanta didefinisikan, maka nilainya tidak bisa diubah. Cara pendefinisian konstanta sebagai berikut: nama EQU <ekspresi> Misalnya: k EQU 5 MOV AX,k Akan identik dengan instruksi: MOV AX,5 2.5 STACK Stack adalah bagian memori yang digunakan untuk menyimpan data-data sementara. Lantas apa bedanya dengan bagian memori data lainnya? Sifatnya, maksudnya? Sifat 17

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack penyimpanannya adalah dengan teknik LIFO (Last In First Out) atau FILO (First In Last Ouf), artinya, data-data yang dimasukkan pertama kali pengambilannya belakangan atau data yang terakhir kali tersimpan dapat diambil paling awal, sama seperti menyimpan bola tenis pada tabungnya, bola yang dimasukkan belakangan tidak bisa Anda ambil (kecuali ujung satunya juga dibuka) kecuali harus mengambil bola-bola sebelumnya. Lantas siapa atau instruksi apa yang melakukan cara penyimpanan seperti ini? Stack digunakan oleh instruksi CALL, untuk menyimpan alamat instruksi berikutnya yang akan dikerjakan saat memanggil suatu prosedur dan instruksi RET, saat mengembalikan kembali instruksi yang telah disimpan sebelumnya dan prosesor kembali mengerjakan instruksi berikutnya setelah yang ditinggalkan sebelumnya (karena adanya pemanggilan prosedur). Hal ini juga terjadi saat suatu interupsi (dengan instruksi INT) dijalankan, yang akan menyimpan registerflag, segmen kode dan offset ke dalam stack. Untuk kembali dari menjalankan interupsi digunakan instruksi IRET (mirip dengan RET). Selain dengan cara-cara tersebut, sekaligus dapat disimpulkan bahwa stack bisa menyimpan data-data alamat instruksi, dapat digunakan dua instruksi lain yang secara eksplisit (cara sebelumnya merupakan cara yang implisit atau tidak terang-terangan) menyimpan data ke dalam stack, yaitu: PUSH - menyimpan nilai 16-bit ke dalam stack POP - mengambil data 16-bit dari stack PUSH REG PUSH SREG PUSH memori PUSH langsung REG: AX, BX, CX, DX, DI, SI, BP, SP. SREG: DS, ES, SS, CS memori: [BX], [BX+SI+7], variabel 16-bit dan lain-lain langsung: data langsung, misalnya, 5, -24,3FH dan lain-lain Sedangkan untuk penggunaan instruksi POP: POP REG POP SREG POP memori REG: AX, BX, CX, DX, DI, SI, BP, SP. SREG: DS, ES, SS memori: [BX], [BX+SI+7], variabel 16-bit dan lain-lain Catatan: - Instruksi PUSH dan POP hanya bekerja untuk nilai 16-bit saja! - PUSH langsung hanya bekerja untuk prosesor 80186 ke atas, untuk saat ini tentunya Anda tidak perlu khawatir karena prosesornya sudah canggih. Sangat penting sekali untuk menyamakan jumlah instruksi PUSH dan POP, jika tidak, maka sfac/cakan terkorupsi dan akan menjadi tidak mungkin kembali ke sistem operasi yang bersangkutan. Karena, sebagaimana diketahui, instruksi RET kita gunakan untuk kembali ke sistem operasi, dengan demikian saat program mulai dijalankan sudah terdapat alamat untuk kembali yang tersimpan di stack (biasanya 0000H). 18

Bab II Mode Akses Memori, Penggunaan Variabel Dan Stack Instruksi PUSH dan POP sangat bermanfaat karena kita tidak banyak memiliki registerregister untuk operasional program, caranya: - Simpan nilai asli register yang bersangkutan ke dalam stack (dengan PUSH) - Gunakan register yang bersangkutan untuk operasional selanjutnya; - Kembalikan lagi nilai asli register tersebut dari stack (dengan POP). ORG looh MOV AX, 1234h PUSH AX ; simpan nilai AX asli ke stack MOV AX, 5678h ; ubah isi dari AX POP AX ; kembalikan nilai AX dari stack RET END Instruksi PUSH melakukan hal sebagai berikut: - Kurangkan 2 dari register SP (turunkan nilai SP); - Tulis nilai yang diberikan PUSH ke alamat SS:SP. Sedangkan instruksi POP melakukan hal sebagai berikut: - Tulis nilai dari stack pada alamat SS:SP ke tujuan yang diberikan POP; - Tambahkan nilai 2 ke register SP (naikkan nilai SP). Manfaat lain dari stack adalah untuk menukar nilai, perhatikan contoh berikut: MOV AX, 1212h ; simpan 1212h ke AX MOV BX, 3434h ; simpan 3434h ke BX PUSH AX ; simpan nilai AX ke stack PUSH BX ; simpan nilai BX ke stack POP AX ; set AX nilai BX POP BX ; set BX nilai AX Penukaran data bisa dilakukan melalui stack, karena, sebagaimana telah dijelaskan sebelumnya, metode penyimpanan data dalam stack adalah LIFO atau FILO, dengan demikian yang tersimpan pertama adalah 1212H berikutnya 3434H, dengan adanya perintah POP, data teratas, yaitu 3434H akan terambil dan disalin ke BX. Bagian memori stack diatur oleh register SS atau Stack Segmen? dan SP atau Stack Pointer. Biasanya sistem operasi akan mengatur nilai-nilai dari register-register ini saat program dijalankan. 19

B A B III 3 INSTRUKSI 80X86 Pada bab ini akan dijelaskan secara ringkas (disertai dengan beberapa contoh program) instruksi-instruksi 80x86. Instruksi-instruksi 80x86 dapat dikelompokkan menjadi 7 (tujuh) kelompok instruksi, yaitu: 1. Instruksi Transfer Data, instruksi-instruksi yang digunakan untuk menyalin (memindahkan) data atau informasi antar register dan lokasi memori atau I/O (keluaran/masukan). 2. Instruksi Aritmetika, instruksi-instruksi yang digunakan untuk melakukan penjumlahan, pengurangan, perkalian dan pembagian pada bilangan-bilangan biner maupun BCD. 3. Instruksi Manipulasi Bit, instruksi-instruksi yang digunakan untuk melakukan penggeseran, pemutaran dan operasi logika pada lokasi memori dan register. 4. Instruksi Kontrol Aliran Program, dapat mengubah aliran program, termasuk instruksi lompat dan pindah dari dan ke prosedur. 5. Instruksi String, instruksi-instruksi yang terkait dengan string (sederetan karakter). 6. Instruksi Interupsi digunakan untuk menginterupsi prosesor dan mengerjakan layanan yang dibutuhkan. 7. Instruksi Kontrol Prosesor digunakan untuk mengatur flag-flag status dan mengubah kondisi eksekusi prosesor. 3.1 INSTRUKSI TRANSFER DATA Instruksi transfer data akan menyalin atau memindahkan data dan alamat antar register maupun lokasi-lokasi memori atau I/O. Pada tabel 4.1 ditunjukkan ringkasan kelompok instruksi yang digunakan untuk transfer data yang terbagi menjadi 4 kelompok: serbaguna, keluaran/masukan, pembacaan alamat dan transfer flag. MOV Merupakan instruksi yang paling banyak digunakan, MOV dapat mentrasfer data dalam satuan byte maupun word antara register dan lokasi memori atau antar register. Selain itu dapat digunakan untuk menyalin suatu nilai langsung ke suatu lokasi memori atau register. Ada beberapa hal yang tidak dapat dilakukan dengan instruksi MOV, yaitu: - Tidak dapat memindahkan data antar dua lokasi memori secara langsung, gunakan perantaraan register, misalnya (diandalkan SINI dan SANA merupakan dua lokasi memori yang berbeda): MOV AX,SINI MOV SANA,AX - Tidak dapat langsung mengisi register segmen dengan suatu nilai, harus melalui register lainnya (yang bukan register segmen juga), misalnya: MOV AX,DATA_SEG MOV DS,AX - Tidak bisa menyalin isi suatu register segmen ke register segmen lainnya secara langsung, harus melalui suatu register lainnya, misalnya: 20

Bab III Instruksi 80X86 MOV AX,ES MOV DS,AX - Tidak bisa menggunakan register CS sebagai tujuan dalam instruksi MOV. Ingat bahwa register CS berisi kode segmen dan harus dipertahankan nilainya selama eksekusi program. PUSH dan POP Sebagaimana telah dijelaskan pada sebelumnya tentang Stack berkaitan dengan instruksi PUSH dan POP. Ditegaskan kembali bahwa instruksi CALL secara implisit akan menyimpan alamat (offset) ke stacksedangkan instruksi RET akan mengambil kembali alamat tersebut dari stack (untuk ditempatkan lagi ke register IP). Sedangkan instruksi PUSH secara eksplisit akan menyimpan data 16-bit ke puncak dari stack, sedangkan instruksi POP akan membaca data 16-bit dari puncak stack. Penjelasan lebih lengkap bisa Anda buka kembali bab sebelumnya. PUSHA dan POPA Hampir sama dengan PUSH dan POP, hanya saja instruksi PUSHA akan menyimpan beberapa register sekaligus ke dalam stack dengan urutan: AX, CX, DX, BX, SP, BP, SI dan DI. Sedangkan instruksi POPA akan mengembalikan kembali nilai-nilai register tersebut (dengan urutan pembacaan dibalik). Untuk lebih jelasnya perhatikan potongan program berikut: MOV AX,1 MOV BX,2 MOV CX,3 MOV DX,4 PUSHA XCHG ; simpan 1 ke AX ; simpan 2 ke BX ; simpan 3 ke CX ; simpan 4 ke DX ; simpan AX,CX,DX,BX,SP,BP,SI dan DI ke stack Instruksi XCHG atau exchange digunakan untuk menukar isi antara sumber dan tujuan baik dalam satuan byte atau word. Anda bisa menukar isi dua register yang berbeda (kecuali register segmen) atau antara register dengan lokasi memori, perhatikan potongan contoh program berikut: MOV AX,1234H MOV BX,5678H XCHG AX,BX XCHG AH,BL XLATB ; simpan 1234H ke AX ; simpan 5678H ke BX ; menukar isi register AX dan BX ; menukar isi register AH dan BL Instruksi KLATB atau translate digunakan untuk melihat suatu nilai pada suatu tabel byte dan menyimpannya ke register AL, panjang tabel bisa mencapai 256 byte. Sebelum memberikan instruksi XLATB, Anda harus menyimpan alamat awal tabel ke dalam BX dan indeksnya ke dalam AX. Perhatikan potongan contoh program berikut: MOV AL,8 MOV BX,OFFSET TABELKU XLATB ; siapkan indeksnya di AL ; siapkan offsetnya di BX ; baca tabel sesuai indeks dan simpan hasilnya di A TABELKU DB 'Belajar Assembly',0 END Perhatikan contoh program ini, sesuai dengan ketentuan, diinginkan membaca indeks 21

Bab III Instruksi 80X86 ke-8 (diawali dari indeks 0) dari TABELKU (yaitu karakter 'A'), indeks ini disimpan ke dalam AL, sedangkan awal atau offset dari TABELKU disimpan ke dalam BX, setelah dijalankan instruksi XLATB, maka AL akan berisi 41H (kode ASCII untuk 'A'). Perhatikan hasil-hasil tersebut melalui emulator Emu8086. IN dan OUT Instruksi IN digunakan untuk membaca masukan dari periferal atau masukan kemudian disimpan dalam AL (untuk hasil pembacaan tipe byte) atau AX (untuk hasil pembacaan tipe word). Operan yang kedua berupa nomor port. Jika dibutuhkan untuk mengakses port lebih dari 255, gunakan register DX. Sedangkan instruksi OUT digunakan untuk mengirimkan data atau informasi yang tersimpan dalam AL (ukuran byte) atau AX (ukuran word) ke suatu nomor port (operan pertama), gunakan register DX jika nomor port yang diakses lebih dari 255. LEA Instruksi LEA atau Load Effective Address digunakan untuk membaca alamat (offset) dari suatu lokasi memori. Biasanya saat dikompilasi, jika memungkinkan, instruksi ini akan diganti dengan MOV. Perhatikan potongan contoh program berikut: LEA AX, m RET m DW 1234h END ; baca alamat variabel m dan simpan di register AX ; deklarasi variabel m tipe WORD AX akan berisi 104H, karena instruksi LEA panjangnya 3 byte, RET panjangnya 1 byte, program diawali pada 100H, sehingga alamat variabel m adalah 104H. LDS dan LES Instruksi LDS digunakan untuk membaca word ganda yang kemudian hasilnya yang pertama disimpan di suatu register word dan yang kedua di register DS, perhatikan contoh berikut: SAHF dan L AHF Instruksi SAHF digunakan untuk menyimpan isi register AH ke dalam register flag dengan cara atau ketentuan sebagai berikut: Bit AH 7 6 5 4 3 2 1 0 Flag [SF] [ZF] [0] [AF] [0] [PF] [1] [CF] Kebalikan dari instruksi SAHF adalah instruksi LAHF, untuk membaca isi flag dan disimpan ke dalam AH. Dengan demikian, jika kedua insruksi ini digunakan bersama (satu pasang) akan sangat mudah untuk menyimpan status flag kemudian mengembalikan lagi seperti semula. PUSHF dan POPF Instruksi PUSHF digunakan untuk menyimpan register flag ke dalam stack, jika Anda menggunakan LAHF, register flag disimpan ke register AH bukan stack. Demikian juga dengan 22

Bab III Instruksi 80X86 POPF yang akan membaca kembali register flag dari stack. Perhatikan potongan contoh program berikut dan bandingkan dengan contoh sebelumnya: PUSHF MOV AH,00Fh SAHF POPF END 3.2 INSTRUKSI ARITMETIKA ; simpan register flag ke dalam stack ; semua flag ; di set ke l ; kembalikan lagi flag seperti semula Prosesor 80x86 dapat melakukan operasi aritmetika baik pada bilangan biner bertanda maupun tidak dan dalam sistem bilangan desimal (baik BCD maupun bukan). Instruksi aritmetika terbagi menjadi empat kelompok: penjumlahan, pengurangan, perkalian, pembagian dan ekstensi tanda. ADD dan ADC Jelas sekali, instruksi ADD ini digunakan untuk melakukan penjumlahan antara tujuan dan sumber, hasilnya disimpan ke tujuan, misalnya: MOV AL,5 ; AL = 5 ADD AL,-3 ; AL = 5 + (-3) = 2 RET Saat prosesor menjumlah dua bilangan biner, akan dihasilkan sisa (carry) jika operan tujuan tidak bisa menampung hasil penjumlahan (lebih dari 216 untuk ukuran word atau 28 untuk ukuran byte). Sedangkan instruksi ADC sama seperti instruksi ADD, hanya saja sekarang yang dijumlahkan kedua operan dan status CF, misalnya: STC ; set CF = 1 MOV AL, 5 ; AL = 5 ADC AL, 1 ; AL=5+1+1 (dari CF) = 7 Kedua instruksi ini mempengaruhi enam macam flag: CF, PF, AF, ZF, SF dan, OF. AAA dan DAA Instruksi AAA (ASCII Adjust After Addition) digunakan untuk mengatur ASCII setelah penjumlahan, yang dilakukan adalah mengoreksi hasil di AH dan AL setelah dilakukannya penjumlahan dalam sistem BCD. Perhatikan contoh berikut: MOV AX,15 AAA ; AH = 00h dan AL = 0Fh ; AH = 01h dan AL = 05h Jika instruksi AAA bekerja pada byte, maka DAA juga melakukan yang hampir sama, tetapi untuk nibel. Instruksi DAA (Decimal Adjust After Addition) digunakan untuk mengoreksi penjumlahan dari dua nilai BCD, a'goritmanya: Misalnya: MOV AL, OFH DAA ; AL = OFH (atau 15 desimal) ; AL = 15H 23

Bab III Instruksi 80X86 INC Instruksi INC (Increment) digunakan untuk menambahkan nilai suatu operan sebesar 1 (menaikkan), misalnya: MOV AL,4 INC AL SUB dan SBB ; AL=4 ; AL=AL+1=4+1=5 Instruksi SUB (subtract) jelas digunakan untuk melakukan pengurangan dua operan, tujuan dan sumber, hasilnya disimpan di tujuan, misalnya: MOV AL,5 ; AL = 5 SUB AL,1 ; AL=AL-1=5-1=4 Instruksi SBB (subtract with borrow) juga mirip seperti SUB, hanya saja yang dikurangkan tidak hanya dua operan tapi juga dengan carry, misalnya: STC ; set CF MOV AL,5 ; AL = 5 SBB AL,3 ; AL = 5-3-1 (dari CF)=l Kedua instruksi ini mempengaruhi enam macam flag: CF, PF, AF, ZF, SF, dan OF. AAS dan DAS Instruksi AAS atau ASCII Adjust after Subtraction digunakan untuk mengoreksi hasil pada register AH dan AL setelah dilakukan pengurangan jika bekerja dengan nilai BCD, algoritmanya: jika (nibel rendah AL > 9) atau (AF = 1), maka selain itu: AL = AL - 6 AH = AH - 1 AF = 1 CF = 1 AF = 0 CF = 0 untuk semua syarat kosongkan nibel tinggi AL Perhatikan contoh berikut: MOV AX, 02FFh ; AH = 02, AL = 0FFh AAS ; AH = 01, AL = 09 Mirip dengan AAS, instruksi DAS atau Decimal Adjust after Subtraction digunakan untuk mengoreksi hasil pengurangan dua bilangan BCD. DEC Instruksi DEC atau decrement digunakan untuk mengurangkan nilai suatu operan sebesar 1 (menurunkan), misalnya: MOV AL,4 ; AL = 4 DEC AL ; AL=AL-1=4-1=3 NEG Instruksi NEG atau negatedigunakan untuk membuat negatif suatu operan (diubah ke 24

Bab III Instruksi 80X86 format 2's complement), caranya semua bit di-inversi-kan kemudian dijumlah dengan 1. Misalnya: MOV AL,5 ; AL = 05H NEG AL ; AL = 0FBH (-5) NEG AL ; AL = 05H (5) CMP Instruksi CMP (compare) digunakan untuk membandingkan dua operan, dalam hal ini dilakukan operasi pengurangan antar dua operan yang digunakan (operan1-operan2). Hasil pengurangan tersebut tidak disimpan dimanapun, hanya mempengaruhi flag sesuai tabel 4.3. MOV AL,5 MOV BL,5 CMP AL,BL ; AL = 05H ; BL = 05H ; AL = 05H, ZF = l (AL dan BL sama!) MUL Instruksi MUL (unsignedmultiply) digunakan untuk melakukan perkalian bilangan takbertanda antara suatu operan dengan register AL atau AX, tergantung tipe operannya apakah byte atau word, untuk tipe byte, hasil disimpan di AX, sedangkan untuk tipe word hasilnya disimpan di DX dan AX. Algoritmanya: AX = AL * operan, atau DX AX = AX * operan Perhatikan contoh berikut: MOV AL,200 ; AL = 0C8H MOV BL,4 MUL BL ; AX = 0320H (800 <- 4 X 200) IMUL Instruksi IMUL hampir sama dengan MUL, hanya saja IMUL digunakan untuk melakukan perkalian bilangan bertanda (signed multipltf. Apa yang dilakukan sama seperti MUL, kecuali data operan diperlakukan dalam format 2's complement. Perhatikan contoh berikut: MOV AL,-2 ; AL akan berisi FEH (artinya -2) MOV BL,-4 ; BL akan berisi FCH (artinya -4) IMUL BL ; AX akan berisi 0008H (-2 x -4 = 8) MOV AL,-2 ; kembalikan lagi MUL BL ; AC akan berisi FA08H AAM Instruksi AAM atau ASCII Adjust After Multiplication digunakan untuk mengoreksi hasil perkalian dari dua nilai BCD, algoritmanya: AH=AL/10 AL=sisa Perhatikan contoh berikut: MOV AL,15 AAM ; AL=OFH ; AH=01, AL=05 DIV Instruksi DIV digunakan untuk melakukan pembagian bilangan tak-bertanda 25

Bab III Instruksi 80X86 (unsigneddivide). Algoritmanya: Untuk operan bertipe byte: AL=AX/operan AH=sisa (modulus) Untuk operan bertipe word: AX=(DX AX)/operan DX=sisa (modulus) Perhatikan contoh berikut: MOV AX,203 MOV BL,4 DIV BL ; AX=00CBh ; AL=32h (50), AH=03h IDIV Seperti instruksi DIV, IDIV juga melakukan pembagian dua operan, tetapi operannya merupakan bilangan bertanda (signed divide), artinya dianggap format 2's complement. Perhatikan contoh berikut: MOV AX,-203 ; AX berisi FF35H (2's comp) MOV BL,4 IDIV BL ; AL=CEK (-50),AH=FDH (-3) AAD Instruksi AAD atau ASCII Adjust before Division digunakan untuk menyiapkan dua nilai BCD sebelum dilakukan pembagian. Algoritmanya: AL=(AH*10)+AL AH=0 Perhatikan contoh berikut: MOV AX,0105H ; AH=01, AL=05 AAD ; AH=00, AL=0Fh (15) CBW dan CWD Kedua instruksi ini berkaitan dengan masalah konversi bilangan, instruksi CBW (Convert Byte to Word) digunakan untuk melakukan konversi byte menjadi word pada register AL, algoritmanya: jika bit tertinggi AL = 1, maka selain itu: AH = 255 (FFh) AH = 0 Perhatikan contoh berikut: MOV AX,0 ; AH = 0 dan AL = 0 MOV AL,-5 ; AX = 00FBh (251) CBW ; AX = FFFBh (-5) Karena yang diisi angka -5 hanya AL, maka hanya AL-lah yang berisi bilangan -5 atau 251 (terjemahan heksadesimalnya), sedangkan AH masih nol. Dengan instruksi CBW sekarang lengkap AX terisi FFFBh (-5). Instruksi CWD atau Convert Word to Doubleword digunakan untuk mengkonversi word menjadi word-ganda. 26

Bab III Instruksi 80X86 3.3 INSTRUKSI MANIPULASI BIT Prosesor 80x86 dapat melakukan operasi manipulasi bit menggunakan instruksi-instruksi jenis ini yang meliputi operasi logika, penggeseran dan pemutaran bit. Pada tabel 4.4 ditunjukkan ringkasan instruksi manipulasi bit yang terbagi menjadi tiga kelompok: logika, penggeseran dan pemutaran. AND Instruksi ini digunakan untuk melakukan operasi logika AND antar bit pada dua operan, hasilnya disimpan pada operan tujuan, algoritma atau aturannya: 0 AND 0=0 0 AND 1=0 1 AND 0=0 1 AND 1=1 Perhatikan contoh berikut: MOV AL, a AND AL,11011111B OR ; AL=01100001b ; AL=01000001b (= A ) Instruksi ini digunakan untuk melakukan operasi logika OR antar bit pada dua operan, hasilnya disimpan pada operan tujuan, algoritma atau aturannya: 0 OR 0=0 0 OR 1=1 1 OR 0=1 1 OR 1=1 Perhatikan contoh berikut: MOV AL, A OR AL,00100000b XOR ; AL=01000001b ; AL=01100001b (= a ) Instruksi ini digunakan untuk melakukan operasi logika XOR antar bit pada dua operan, hasilnya disimpan pada operan tujuan, algoritma atau aturannya: 0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 Perhatikan contoh berikut: MOV AL,00000111B XOR AL,00000010B NOT ; AL=00000101b Instruksi ini digunakan untuk menginvers masing-masing bit pada suatu operan, hasilnya disimpan pada operan tujuan, algoritma atau aturannya: NOT 1=0 NOT 0=1 Perhatikan contoh berikut: MOV AL,00011011b NOT AL ; AL=11100100b 27

Bab III Instruksi 80X86 TEST Instruksi TEST digunakan untuk melakukan operasi logika AND masing-masing bit pada dua operan untuk mempengaruhi flag saja, hasilnya tidak disimpan dimana-mana. Flag yang terpengaruh adalah ZF, SF dan PF. Perhatikan contoh berikut: MOV AL,00000101b TEST AL,1 TEST AL,10B SAL dan SHL ; ZF=0 (hasil AND=00000001b) ; ZF=l (hasil AND=00000000b) Instruksi SAL atau Shift Arithmetic Le/if dan SHL atau Shift Left, digunakan untuk menggeser bit-bit suatu operan ke kiri. Jumlah penggeseran ditentukan dengan operan kedua. Algoritmanya: Geser semua bit ke kiri, bit paling kiri digeser ke CF Bit nol disisipkan dari posisi paling kanan. Perhatikan contoh berikut ini: MOV AL,0E0h ; AL=11100000B SAL AL,l ; AL=11000000B, CF=l SHL AL,l ; AL=10000000B, CF=l SAR dan SHR Instruksi SAR atau Shift Arithmetic Right dan SHR atau Shift Right, digunakan untuk menggeser bit-bit suatu operan ke kanan. Jumlah penggeseran ditentukan dengan operan kedua. Algoritme SAR: Geser semua bit ke kanan, bit terkanan digeser ke CF Tertahankan nilai bit paling kiri = nilai bit sebelumnya Algoritma SHR: Geser semua bit ke kanan, bit paling kanan digeser ke CF Bit nol disisipkan dari posisi paling kiri. Perhatikan contoh berikut: MOV AL,10000111b SAR AL,1 ;AL=11000011B, CF=1 SHR AL,1 ;AL=01100001B, CF=1 Perhatikan perbedaan hasil dari kedua instruksi SAR dan SHR, setelah dilakukan SAR, bit paling kiri dari AL tetap bernilai 1, artinya bit tanda dipertahankan, sedangkan setelah instruksi SHR, bit paling kiri dari AL tidak dipertahankan lagi dan diisi nol! ROL dan RCL Kedua instruksi ini digunakan untuk menggeser dan memutar bit pada suatu operan, perbedaannya: instruksi ROL tidak menggunakan perantara CF sedangkan RCL menggunakan perantara CF. Perhatikan contoh berikut: MOV AL,1CH ROL AL,1 STC MOV AL,1CH RCL AL,1 ; AL=00011100B ; AL=00111000B, CF=0 ; set CF (CF=1) ; AL = 00011100B ; AL = 00111001B, CF=0 28

Bab III Instruksi 80X86 ROR dan RCR Kedua instruksi ini sama operasionalnya dengan kedua instruksi sebelumnya, ROL dan RCL, hanya saja menggeser bit-nya ke kanan. 3.4 INSTRUKSI KONTROL ALIRAN PROGRAM Sebuah program dalam Bahasa Assembly dikerjakan secara sekuensial atau berurutan dari baris pertama ke baris berikutnya (dari atas ke bawah). Ada beberapa instruksi yang bisa menyebabkan aliran program tidak seperti itu, misalnya melompat ke suatu lokasi instruksi atau pemanggilan prosedur. CALL dan RET Instruksi CALL digunakan untuk memanggil suatu prosedur, alamat untuk kembali lagi, yang tersimpan di register IP, disimpan ke stack. Selain dapat diikuti dengan operan nama prosedur maupun label, operan bisa juga merupakan alamat 4-byte yang ditulis dalam format, misalnya, 1234:5678H, angka yang pertama merupakan nilai segmen dan yang kedua merupakan offset, pemanggilan ini merupakan pemanggilan jauh (far), dengan demikian yang tersimpan ke stack tidak hanya IP saja tetapi juga CS, dengan kata lain pemanggilan jauh ciricirinya adalah berbeda segmen. Sedangkan instruksi RET digunakan untuk mengakhiri suatu prosedur, yaitu melakukan pengembalian alamat ke semula (membaca kembali isi stack). Perhatikan contoh program berikut: CALL pl ADD AX, l pl PROC MOV AX, 1234h RET pl ENDP END JMP ; deklarasi prosedur ; kembali dari yg memanggil Instruksi JMP merupakan instruksi lompatan tanpa syarat. Program akan segera melompat ke nama label atau alamat 4-byte yang ditulis pada operannya. Instruksi JMP ini tidak akan menyimpan alamat register IP maupun CS, karena pada dasarnya instruksi JMP ini sama seperti instruksi GOTO pada Pascal atau C++. Dengan demikian perlu dibedakan dengan CALL. Perhatikan contoh program berikut: MOV AL,5 JMP labell PRINT 'Tidak lompat!' MOV AL, 0 labell: PRINT 'Sampai disini! RET END ; lompat! 2 baris! 29

Bab III Instruksi 80X86 Pada program ini digunakan makro PRINT yang dapat digunakan untuk mencetak suatu string ke layar, instruksi JMP labell langsung melompati dua baris di bawah-nya, kemudian instruksi RET bukan untuk mengembalikan isi register IP tetapi untuk kembali ke sistem operasi atau mengakhiri program. Jalankan program ini dengan emulator langsung RUN (bukan SINGLE RUN) dan amati yang terjadi. JA atau JNBE Kedua instruksi ini sebenarnya identik, kedua instruksi ini diawali dengan instruksi CMP, instruksi JA (Jump if Above) digunakan untuk melakukan lompatan ke suatu label, jika hasil instruksi CMP sebelumnya operan pertama lebih besar (above) dari operan kedua (untuk bilangan tak-bertanda). Sedangkan instruksi JNBE (Jump if Not Below) akan membuat program melompat ke suatu label, jika operan pertama tidak dibawah (not below = above) operan kedua. Perhatikan contoh program berikut: MOV AL,250 ; coba ganti-ganti dengan angka lain CMP AL, 5 JA labell ; bisa diganti JNBE.. PRINT 'AL tidak lebih besar 5' JMP exit labell: PRINT 'AL lebih besar 5' exit: RET END Instruksi JA bisa diganti dengan JNBE, hasilnya sama saja. JAE atau JNB Kedua instruksi ini juga memiliki arti yang sama, diawali dengan instruksi CMP untuk membandingkan dua operan, Instruksi JAE (Jump if Above or Equal) digunakan untuk melakukan lompatan program jika operan pertama lebih besar atau sama dengan operan yang kedua atau menggunakan JNB (Jump if Not Below) jika operan pertama tidak lebih kecil daripada operan kedua (untuk bilangan tak-bertanda). Perhatikan contoh program berikut ini: MOV AL,5 ; ganti2 angkanya CMP AL,5 JAE labell ; bisa diganti JNB PRINT AL lebih kecil 5 JMP exit labell: PRINT 'AL lebih besar atau sama dengan 5' exit: RET END Instruksi JAE bisa diganti dengan JNB dengan hasil yang sama. JB, JNAE atau JC Instruksi JB (Jump ifbelow) atau JNAE (Jump ifnotabove ornot Equal) atau JC (Jump if 30

Bab III Instruksi 80X86 Carry flag set to 1) semuanya digunakan untuk melakukan lompatan jika hasil perbandingan yang dilakukan operan pertama lebih kecil dari operan kedua (untuk bilangan tak-bertanda), khusus untuk instruksi JC bisa dimanfaatkan untuk memeriksa hasil dari suatu operasi apakah menghasilkan carry (sisa/pinjaman) atau tidak. Untuk instruksi JB atau JNAE, perhatikan contoh program berikut: MOV AL,1 CMP AL, 5 JB labe1 ; bisa diganti dengan JNAE PRINT 'AL lebih besar atau sama dengan 5' JMP exit labell: PRINT 'AL lebih kecil 5' exit: RET END Pada program ini, instruksi JB bisa diganti dengan JNAE. Sedangkan untuk instruksi JC, perhatikan contoh berikut: MOV AL,255 ADD AL,l JC labell PRINT tidak ada carry! JMP edit label1: PRINT ada carry! exit: RET END JBE atau JNA Kedua instruksi ini, JBE (Jump if Below or Equal) dan JNA (Jump if Not Above), digunakan untuk melakukan lompatan jika instruksi CMP sebelumnya mendeteksi bahwa operan 1 lebih kecil atau sama dengan operan 2 (JBE) atau operan 1 tidak lebih besar dari operan 2 (JNA), untuk bilangan tak-bertanda. Perhatikan contoh program berikut: MOV AL,5 CMP AL,5 JBE label1 ; bisa diganti JNA PRINT AL lebih besar dari 5 JMP edit labell: PRINT *AL lebih kecil atau sama dengan 5' exit: RET END Anda bisa mengganti instruksi JBE dengan JNA dan hasil yang diperoleh tetap sama. 31

Bab III Instruksi 80X86 JCXZ Instruksi JCXZ (atau Jump if CX is Zero) digunakan untuk melakukan lompatan jika register CX berisi nol, perhatikan contoh berikut: MOV CX,0 JCXZ labell PRINT CX tidak nol. JMP exit labell: PRINT CX nya nol. exit: RET END Pada contoh program di atas, memang disengaja register CX diisi dengan nol, tetapi setiap kali register CX berisi nol (dengan instruksi apapun saja, misalnya hasil penjumlahan dan lain sebagainya), maka instruksi JCXZ akan menyebabkan program melompat ke label yang disebutkan. JE atau JZ Instruksi JE (Jump if Equal) atau JZ (Jump ifzero) digunakan untuk melakukan lompatan jika hasil perbandingan (dengan CMP) menghasilkan operan 1 sama dengan operan 2 (JE) atau operan 1 dikurangi operan 2 hasilnya nol (JZ). Instruksi JE dipengaruhi oleh hasil dari instruksi CMP dan berlaku untuk tipe bilangan bertanda maupun bukan, sedangkan instruksi JZ dipengaruhi oleh instruksi CMP, SUB, ADD, TEST, AND, OR dan XOR. Bisa untuk bilangan bertanda maupun tak-bertanda. Perhatikan contoh program berikut: MOV AL,5 CMP AL,5 JE labell ; bisa diganti dengan JZ PRINT AL tidak sama dengan 5. JMP exit labell: PRINT XAL sama dengan 5.' exit: RET END JG atau JNLE Instruksi JG (Jump if Greatet) dan JNLE (Jump if Not Less or Equaf) digunakan untuk melakukan lompatan jika operan pertama nilainya lebih besar (atau tidak lebih kecil atau tidak sama dengan) dibandingkan operan kedua hasil dari instiuksi CMP sebelumnya (untuk bilangan bertanda). MOV AL,5 CMP AL,-5 JG labell ; bisa diganti dengan JNLE PRINT AL tidak lebih besar dari -5. JMP exit 32

Bab III Instruksi 80X86 labell: PRINT 'AL lebih besar dari -5.' exit: RET END JGE atau JNL Instruksi JGE (Jump if Greater or Equa!) dan JNL (Jump if Not Less) digunakan untuk melakukan lompatan jika hasil instruksi CMP sebelumnya menghasilkan operan pertama lebih besar atau sama dengan operan kedua (JGE), atau operan pertama tidak lebih kecil dari operan kedua (JNL), untuk bilangan bertanda. Perhatikan contoh berikut: MOV AL,2 CMP AL, -5 JGE labell PRINT AL<-5 JMP exit labell: PRINT AL >= -5 exit: RET END JL atau JNGE ; bisa diganti JNL Instruksi JL (Jump ifless) atau JNGE (Jump if Not Greateror Equal) digunakan untuk melakukan lompatan jika hasil instruksi CMP menghasilkan operan 1 lebih kecil dari operan 2 (JL), atau operan 1 tidak lebih besar atau sama dengan operan 2 (JNGE), untuk bilangan bertanda. Perhatikan contoh program berikut: MOV AL,-2 CMP AL,5 JNGE labell PRINT AL >= 5. JMP exit labell: PRINT AL < 5. exit: RET END JLE atau JNG ; bisa diganti JNGE Instruksi JLE (Jump ifless or Equal) atau JNG (Jump if Not Greatet) digunakan untuk melakukan lompatan jika operan pertama lebih kecil atau sama dengan operan kedua (JLE) atau operan pertama tidak lebih besar dari operan kedua (JNG) hasil dari instruksi CMP sebelumnya untuk bilangan bertanda. Perhatikan contoh program berikut ini: 33

Bab III Instruksi 80X86 MOV AL,2 CMP AL,3 JNG labell PRINT AL > 3. JMP exit labell: PRINT AL <= 3 exit: RET END ;bisa diganti JLE JNC Kebalikan dari JC, instruksi JNC atau Jump if Carry, digunakan untuk melakukan lompatan jika hasil dari suatu instruksi yang dikerjakan sebelumnya (apa saja) tidak membuat status Carry=1 atau Carry tetap nol (tidak ada Carry). Perhatikan contoh program berikut: MOV AL,2 ; coba diganti dengan 253... ADD AL,3 JNC labell PRINT ada carry. JMP exit labell: PRINT tak ada carry. exit RET END JNE atau JNZ Instruksi JNE (Jump ifnot Equal) atau JNZ (Jump if Not Zero) digunakan untuk melakukan lompatan ke suatu label jika operan pertama tidak sama dengan operan kedua (JNE), atau hasil instruksi sebelumnya menghasilkan yang bukan nol (JNZ). Instruksi JNE dipengaruhi oleh hasil dari instruksi CMP dan berlaku untuk tipe bilangan bertanda maupun bukan, sedangkan instruksi JNZ dipengaruhi oleh instruksi CMP, SUB, ADD, TEST, AND, OR dan XOR. Bisa untuk bilangan bertanda maupun tak-bertanda. Perhatikan contoh program berikut ini: MOV AL,00000111b ; AL = 7 OR AL,0 ; bisa diganti CMP AL, 0 JNZ labell ; bisa diganti JNE labell PRINT nol. ; bisa diganti PRINT AL =0 JMP exit Label1: PRINT bukan nol. ; bisa diganti PRINT *AL <> 0' exit: RET END JNO Instruksi JNO atau Jump if Not Overflow digunakan untuk melakukan lompatan jika hasil dari suatu instruksi yang dikerjakan sebelumnya tidak menghasilkan limpahan atau overflow. 34

Bab III Instruksi 80X86 JNS Instruksi JNS (Jump if Not Signed (if positive)) digunakan untuk melakukan lompatan ke suatu label jika hasil dari instruksi CMP, SUB, ADD, TEST, AND, OR dan XOR menghasilkan bilangan positif (tak bertanda). JO Instruksi JO (Jump if Overflow) digunakan untuk melakukan lompatan ke suatu label jika hasil dari instruksi yang dikerjakan sebelumnya mengakibatkan terjadinya limpahan atau overflow, kebalikan dari instruksi JNO. JS Instruksi JS (Jump if Signed (if negative)) digunakan untuk melakukan lompatan ke suatu label jika hasil instruksi CMP, SUB, ADD, TEST, AND, OR dan XOR yang dikerjakan sebelumnya menghasilkan bilangan negatif (bit MSB=1). Perhatikan contoh program berikut: MOV AL,lOOOOOOOb ; AL = -128 OR AL,0 ; hanya set flag JS labell PRINT tak bertanda (positif). JMP exit labell: PRINT bertanda (negatif). exit: RET END LOOP Instruksi LOOP akan mengurangi nilai isi register CX kemudian akan melompat ke suatu label tertentu jika isi CX bukan nol, dengan kata lain, instruksi LOOP digunakan untuk melakukan pengulangan dari suatu label tertentu hingga nilai CX menjadi 0. Perhatikan contoh program berikut: MOV CX, 5 label1: PRINTN loopl LOOP label1 RET END Program ini akan melakukan pencetakan kata 'loop' sebanyak 5 (lima) kali, sesuai dengan isi CX yang pada awalnya diisi dengan 5. LOOPE atau LOOPZ Instruksi LOOPE atau LOOPZ digunakan untuk menurunkan nilai register CX dan melompat ke suatu label tertentu jika CX tidak nol dan sama (ZF=1), artinya pengulangan akan dilanjutkan hingga CX mencapai nol atau ZF=0 atau dua-duanya. Perhatikan contoh program berikut: MOV AX,0 35

Bab III Instruksi 80X86 MOV CX,5 label1: PUTC * ADD AX,100 CMP AH,0 LOOPZ label1 RET END Pertama register AX dan CX masing-masing diisi dengan 0 dan 5 (lima kali pengulangan). Kemudian karakter '*' ditampilkan ke layar, AX ditambah dengan 100, sehingga sekarang AX=100, dilanjutkan dengan pengujian AH apakah sama dengan 0? Instruksi LOOPZ (atau LOOPE) akan memeriksa hasil CMP, jika sama maka pengulangan dihentikan, jika tidak pengulangan diteruskan hingga nilai CX=0 atau AH=0 (tergantung mana yang lebih dulu tercapai). Catatan: Dengan melakukan operasral = AL +100, hasil tidak akan pernah bernilai 0, nilainya 0 (sekali saja), 100,200 dan 300 (isi AX = 012Ch) serta tidak pernah 400 karena proses berhenti dikarenakan CX sudah mencapai nol duluan, dengan demikian akan tercetak 5 bintang! LOOPNE atau LOOPNZ Kedua instruksi ini berkebalikan dengan LOOPE maupun LOOPZ. Instruksi LOOPNE atau LOOPNZ digunakan untuk melakukan lompatan ke suatu label tertentu jika nilai CX belum mencapai nol dan tidak sama (ZF=0), artinya pengulangan akan dilakukan hingga CX mencapai nol atau ZF=1 atau dua-duanya. Perhatikan contoh program berikut: MOV SI,0 MOV CX,5 labell: PUTC * MOV AL, v1[si] INC SI CMP AL, 7 LOOPNE labell RET vl DB 9, 8, 7, 6, 5 END ; byte berikut (SI=SI+1). Program ini akan melakukan pengulangan hingga dijumpai bilangan 7, pada posisi 3, dengan kata lain hasilnya berupa 3 bintang yang ditampilkan. 3.5 INSTRUKSI STRING Instruksi string membolehkan Anda bekerja dengan sekelompok (blok) byte atau word yang berturutan di dalam memori. Blok-blok atau string-string ini, panjangnya bisa mencapai 64K byte dan bisa mengandung nilai-nilai numerik (baik biner maupun BCD) atau alfanumerik (seperti karakter teks). Sebagaimana ditunjukkan pada tabel 4.6, instruksi string terbagi menjadi 5 (lima) macam 36

Bab III Instruksi 80X86 operasi dasar atau primitif, yaitu: pemindahan, pembandingan, scan atau pencarian, pembacaan dan penyimpanan CLD Instruksi CLD (Clear Direction flag (DF=0)) digunakan untuk mengatur agar DF=0, kemudian register SI dan DI akan dinaikkan oleh instruksi berantai seperti: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB dan STOSW. Instruksi berantai maksudnya satu instruksi tetapi bekerja untuk serangkaian data sekaligus berturutan. STD Instruksi STD (Set Direction flag (DF=1)) merupakan kebalikan dari CLD, digunakan untuk mengatur agar DF=1, kemudian register SI dan DI diturunkan oleh instruksi berantai seperti: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB dan STOSW. REP Melakukan pengulangan instruksi MOVSB, MOVSW, LODSB, LODSW, STOSB atau STOSW sebanyak nilai yang tersimpan di register CX. Algoritmanya: Cek_CX: Jika CX <> 0 maka Lakukan instruksi berantai CX <- CX - l Kembali ke Cek_CX Selain itu Keluar dari siklus REP Perhatikan potongan program berikut: MOV CX,500 REP MOVSB Potongan program ini akan mengerjakan instruksi MOVSB selama CX belum sama dengan nol, dengan kata lain diulang sebanyak 500 kali. REPE atau REPZ Hampir sama dengan instruksi REP, instruksi REPE (Repeat While Equat), yang memiliki instruksi alternatif REPZ (Repeat While Zero), digunakan untuk mengulang instruksi berantai selama ZF=1 (belum sama) dan CX belum mencapai nol. Perhatikan potongan program berikut: MOV CX,100 REPE CMPSB ; bisa diganti REPZ Potongan program ini akan membandingkan string di DS:[SI] dengan ES:[DI] hingga 100 kali atau hingga ditemukan elemen yang tidak sama, mana yang tercapai duluan. REPNE atau REPNZ Kebalikan dari instruksi REPE atau REPZ, instruksi REPNE (Repeat While NotEqual), yang memiliki instruksi alternatif REPNZ (Repeat While Not Zero), digunakan untuk mengulang instruksi berantai selama ZF=0 (belum tidak sama) dan CX belum mencapai nol. Perhatikan potongan program berikut: 37

Bab III Instruksi 80X86 MOV CX,100 REPNE CMPSB ; bisa diganti REPNZ Potongan program ini akan membandingkan string di DS:[SI] dengan ES:[DI] hingga 100 kali atau hingga ditemukan elemen yang sama, mana yang tercapai duluan. MOVSB dan MOVSW Kedua instruksi digunakan untuk menyalin string dari DS:[SI] ke ES:[DI], MOVSB untuk satuan byte dan MOVSW dalam satuan word (2 byte) kemudian isi SI dan DI diperbaharui. Algoritmanya MOVSB: ES[DI] = DS:[SI] Jika DF=0 maka SI = SI + 1 DI = DI + 1 Selain itu SI = SI - 1 DI = DI 1 Algoritmanya MOVSW: ES [DI] = DS: [SI] Jika DF=0 maka SI = SI + 2 DI = DI + 2 Selain itu SI = SI - 2 DI = DI - 2 Contoh program untuk MOVSB: LEA SI,a1 LEA DI,a2 MOV CX,5 REP MOVSB A1 DB 1,2,3,4,5 a2 DB 5 DUP(0) END Pada program ini di atas disiapkan data-data yang akan disalin di al yang jika Anda jalankan di Emu8086 akan mendapatkan alamat 01OCH, sedangkan tempat untuk penyalinan ada di 32, alamat 0111 H. Instruksi REP secara otomatis akan diganti dengan REPE (perhatikan hasilnya pada Emu8086). Instruksi MOVSB dijalankan sebanyak 5 kali (menyalin bilangan 1 sampai 5 dari al ke a2). CMPSB dan CMPSW Kedua instruksi ini digunakan untuk menbandingkan data di DS:[SI] dengan ES:[DI], CMPSB untuk satuan byte sedangkan CMPSW untuk satuan word. Algoritma untuk CMPSB: DS:[SI] - ES:[DI] Atur flag sesuai dengan hasil: OF, SF, ZF, AF, PF dan CF Jika DF=0 maka SI = SI + 1 DI = DI + 1 Selain itu: 38

Bab III Instruksi 80X86 SI = SI - 1 DI = DI - 1 Contoh program untuk CMPSB: ORH 100h ; atur arah maju... CLD ;siapkan sumber di DS:SI, ;siapkan target di ES:DI: MOV AX,CS MOV DS,AX MOV ES,AX LEA si,strl LEA di,str2 ; set pencacah sesuai dengan panjang string: MOV CX, 11 ; bandingkan hingga sama: REPE CMPSB JNZ not_equal ; "Ya" sama! MOV AL, 'Y' MOV AH, OEh INT loh JMP edit_here not_equal: ; Tidak - gak sama! MOV AL, T MOV AH, 0Eh INT 10h exit_here: RET ; data yang dibandingkan: strl db Test string str2 db Test string END Program ini digunakan untuk membandingkan string strl dan str2, jika ada satu karakter saja yang tidak sama (beda huruf maupun besar dan kecilnya), akan diberikan jawaban T, artinya kedua string tersebut tidak sama. Dalam hal ini digunakan instruksi REPE CMPSB, artinya pembandingan karakter akan dilakukan terus hingga ditemui perbedaan karakter atau menyebabkan 7f tetap 1 selama karakter tetap sama, sehingga instruksi JNZ not_equal tidak akan dikerjakan (tidak melompat ke not_equal). SCASB dan SCASW Kedua instruksi ini digunakan untuk membandingkan byte (SCASB) atau word (SCASW) pada AL atau AX dengan ES:[DI]. Algoritma untuk SCASB sebagai berikut: ES:[DI] - AL Atur flag sesuai dengan hasil: OF, SF, ZF, AF, PF dan CF Jika DF=0 maka DI = DI + 1 Selain itu: DI = DI - 1 Sedangkan algoritma untuk SCASW sebagai berikut: 39

Bab III Instruksi 80X86 ES:[DI] - AX Atur flag sesuai dengan hasil: OF, SF, dan CF Jika DF=0 maka DI = DI + 2 Selain itu: DI = DI 2 LODSB dan LODSW Kedua instruksi ini digunakan untuk menyimpan data yang ada dis DS:[SI] ke register AL (dengan instruksi LODSB) atau register AX (dengan instruksi LODSW), kemudian register SI diperbaharui. Algoritme untuk LODSB sebagai berikut: AL = DS: [SI] Jika DF=0 maka: SI = SI + 1 Selain itu: SI = SI - 1 Perhatikan contoh program berikut untuk instruksi LODSB: LEA SI, al ; simpan posisi data di SI MOV CX, 4 ; ada 4 data MOV AH, 0Eh ; fungsi cetak karakter m: LODSB ; simpan data ke AL INT 10h ; tampilkan ke layar LOOP m ; ulangi sebanyak 4 kali RET al DB H, a,!, o END Pada program di atas, disiapkan data-data karakter yang akan ditampilkan di layar pada tabel al, untuk menampilkan karakter ke layar bisa digunakan interupsi 10h fungsi Eh dengan syarat karakter yang akan ditampilkan disimpan di register AL, sehingga dalam hal ini bisa digunakan fungsi LODSB untuk menyalin karakter dari DS:[SI] ke register AL. Proses menampilkan karakter diulang-ulang hingga semua karakter ditampilkan (ada 4 karakter). STOSB dan STOSW Kedua instruksi ini digunakan untuk menyimpan data dari AL (dengan instruksi STOSB) atau AX (dengan instruksi STOSW) ke dalam ES:[DI], kemudian DI diperbaharui. Algoritma untuk STOSB sebagai berikut: ES:[DI] = AL Jika DF=0 maka DI = DI + 1 Selain itu DI = DI - 1 Sedangkan algoritma untuk STOSW sebagai berikut ES:[DI] = AX Jika DF=0 maka DI = DI + 2 Selain itu DI = DI - 2 Berikut ini ditunjukkan contoh program menggunakan instruksi STOSB: 40

Bab III Instruksi 80X86 ORG 100H LEA DI,al MOV AL,12h MOV CX,5 REP STOSB RET al DB 5 dup(o) ; alokasi data menyesuaikan DB END Register DI diisi dengan lokasi dari tabel al (menggunakan instruksi LEA), agar nantinya data-data-nya disimpan pada lokasi tersebut, menggunakan instruksi REP STOSB. Data yang hendak disimpan adalah bilangan 12h (yang sebelumnya disiapkan di register AL dengan MOV AL, 12h), sebanyak 5 kali (dengan bantuan register CX, MOV CX, 5). Setelah Program dijalankan dapat diperiksa (dengan emulator Emu8086) isi dari al. Jika panjang datanya word digunakan STOSW. 3.6 INSTRUKSI INTERUPSI Sama seperti pemanggilan suatu prosedur, instruksi interupsi digunakan untuk memanggil suatu prosedur khusus, yang diberi nama vektor interupsi, dikarenakan prosesor menerima permintaan layanan interupsi. Lihat bab mengenai Interupsi. 3.7 INSTRUKSI KONTROL PROSESOR Instruksi kontrol prosesor merupakan instruksi-instruksi yang digunakan untuk mengatur status flag, sinkronisasi eksternal dan termasuk perintah tidak melakukan apapun pada prosesor yang bersangkutan. Pada Tabel 4.8 ditunjukkan ringkasan instruksi kontrol prosesor. Tabel 4.8. Ringkasan Instruksi Kontrol Prosesor CLC dan STC Kedua instruksi ini berkaitan dengan CF (CarryFlag). Instruksi CLC (Clear Carry Flag) digunakan untuk mereset (membuat 0) CF sedangkan STC (Set CarryFlag) digunakan untuk sebaliknya, menset (membuat 1) CF. CMC Instruksi CMC (Complement Carry Flag) digunakan untuk melakukan negasi (menginversi) CF, jika CF sebelumnya 1, maka akan menjadi 0 demikian juga sebaliknya. CLD dan STD Kedua instruksi ini berhubungan dengan DF (Direction Flag). Instruksi CLD (ClearDirection Flag) digunakan untuk mereset DF, kemudian register SI dan DI dinaikkan oleh instruksi berantai seperti: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB dan STOSW. Sedangkan instruksi STD (Set Direction Flag) digunakan untuk menset DF, kemudian register SI dan DI diturunkan oleh instruksi berantai seperti' CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB dan STOSW. 41

Bab III Instruksi 80X86 CLI dan STI Kedua instruksi ini berkaitan dengan IF (Interrupt Flag). Instruksi CLI atau Clear Interrupt Flag digunakan untuk mematikan fungsi interupsi perangkat keras, sedangkan STI atau Set Interrupt Flag digunakan untuk mengaktifkan interupsi perangkat keras. HLT Instruksi digunakan untuk menghentikan sistem (haltsystem). NOP Instruksi NOP atau No Operation merupakan instruksi yang menurut penulis agak aneh, tetapi sering dimanfaatkan untuk melakukan penundaan, karena dengan adanya instruksi NOP, prosesor hanya diam saja tidak melakukan apa-apa selama NOP dilaksanakan, dengan demikian jika NOP dijalankan selama 1 //detik dan kita butuh penundaan suatu proses selama 5 //detik, tuliskan saja instruksi NOP lima kali. 42

B A B IV 4 INTERUPSI 4.1 PENDAHULUAN Interupsi dapat dipandang sebagai sejumlah fungsi-fungsi yang membuat program (tepatnya pemrograman) menjadi lebih mudah, misalnya, untuk mencetak atau menampilkan suatu karakter Anda bisa melakukannya dengan menuliskan program khusus atau menggunakan pemanggilan suatu instruksi dan menyerahkan urusan tersebut pada fungsi interupsi yang bersangkutan (tentunya, menurut keyakinan saya, Anda pasti akan memilih cara yang terakhir). Selain fungsi untuk menampilkan suatu karakter ke layar, tentu saja ada fungsi-fungsi interupsi lain yang berhubungan dengan operasi diskdrive serta perangkat keras lainnya. Interupsi dapat dipicu dengan perangkat keras yang berbeda-beda maupun dari perangkat lunak. Interupsi yang dibangkitkan karena adanya permintaan layanan pada perangkat keras disebut sebagai interupsi perangkat keras (hardware interrupts), sedangkan yang dibangkitkan melalui perangkat lunak disebut sebagai interupsi perangkat lunak (software interrupts). Yang akan dibahas pada bab ini, berkaitan dengan fokus pada pemrograman Bahasa Assembler, adalah interupsi perangkat lunak. Sebagaimana telah dijelaskan secara singkat pada bab sebelumnya, interupsi perangkat lunak bisa dilakukan melalui instruksi INT dengan sintaks: INT nilai Dengan operan nilai dapat berisi angka 0 hingga 255 (atau 0 hingga OFFh), selanjutnya akan digunakan format heksadesimal. Jika kemudian Anda berpikir bahwa hanya ada 256 interupsi, maka disayangkan sekali pendapat Anda itu salah. Masing-masing interupsi tersebut ada yang memiliki sub-fungsi, untuk menentukan sub-fungsi ini biasanya digunakan register AH, yang harus diisi dengan nilai tertentu sebelum instruksi interupsi yang bersangkutan dijalankan, selain itu bisa juga digunakan register lain untuk meneruskan parameter dan data. Jika diandalkan masing-masing memiliki 256 sub-fungsi, maka akan diperoleh 256 x 256 = 65536 fungsi! 4.2 DAFTAR INTERUPSI PILIHAN INTERRUPT 05h Print Screen Fungsi : Mencetak seluruh isi layar ke printer. Register Input : Tidak Ada. Register Output : Tidak Ada. INTERRUPT 09h Keyboard Fungsi : Interupsi 09 merupakan HardWare interupsi dari keyboard. Setiap penekanan tombol keyboard akan membangkitkan interupsi 09. Handler dari interupsi 09 kemudian akan mengambil data dari tombol apa yang 43

Bab IV Interupsi ditekan dari Port 60h yang berisi kode scan tombol. Dari kode scan ini kemudian akan diterjemahkan dalam kode ASCII atau Extended dan disimpan pada keyboard buffer untuk kemudian digunakan oleh interupsi lain. INTERRUPT 10h - Service 00h Set Video Mode Fungsi : Mengubah Mode Video. Register Input AH = 00h AL = nomor mode Register Output : Tidak Ada. Penjelasan : Setiap dilakukan pergantian mode akan menimbulkan efek CLS, kecuali nomor mode dijumlahkan dengan 128 atau bit ke-7 pada AL diset 1. INTERRUPT 10h - Service 02h Set Cursor Position Fungsi : Meletakkan kursor pada posisi tertentu. Register Input : AH = 02h BH = nomor halaman tampilan DH = nomor baris (dimulai 00) DL = nomor kolom (dimulai 00) Register Output : Tidak Ada. INTERRUPT 10h - Service 03h Cursor Information Fungsi : Memperoleh Informasi posisi kursor dan ukurannya. Register Input : AH = 03h BH = nomor halaman tampilan Register Output : CH = awal garis bentuk kurso CL = akhir garis bentuk kursor DH = nomor baris DL = nomor kolom Penjelasan : Setiap halaman tampilan memiliki kursornya sendiri- sendiri. INTERRUPT 10h - Service 05h Select Active Page Fungsi : Merubah halaman tampilan aktif. Register Input : AH = 05h AL = nomor halaman tampilan Register Output : Tidak Ada. INTERRUPT 10h - Service 06h Scroll Up Window Fungsi : Menggulung jendela ke atas. Register Input : AH = 06h AL = jumlah baris untuk digulung BH = atribut untuk baris kosong CH,CL = koordinat kiri atas jendela DH,DL = koordinat kanan bawah jendela Register Output : Tidak Ada. 44

Bab IV Interupsi Penjelasan : AL diisi 00 akan mengosongkan keseluruhan jendela. INTERRUPT 10h - Service 07h Scroll Down Window Fungsi : Menggulung jendela ke bawah. Register Input : AH = 07h AL = jumlah baris untuk digulung BH = atribut untuk baris kosong CH,CL = koordinat kiri atas jendela DH,DL = koordinat kanan bawah jendela Register Output: Tidak Ada. Penjelasan : AL diisi 00 akan mengosongkan keseluruhan jendela. INTERRUPT 10h - Service 09h Write Character And Attribute At Cursor Position Fungsi : Mencetak karakter dan atribut pada posisi kursor. Register Input : AH = 09h AL = kode ASCII karakter BH = nomor halaman BL = atribut karakter CX = jumlah pengulangan pencetakan Register Output : Tidak Ada. Penjelasan : Karakter kontrol akan dicetak sebagai karakter biasa. INTERRUPT 10h - Service 0Ah Write Character At Cursor Position Fungsi : Mencetak karakter pada posisi kursor. Register Input : AH = 0Ah AL = kode ASCII karakter BH = nomor halaman CX = jumlah pengulangan pencetakan Register Output : Tidak Ada. Penjelasan : Karakter kontrol akan dicetak sebagai karakter biasa, atribut yang digunakan akan sama dengan atribut yang lama. INTERRUPT 10h - Service 0Eh Teletype Output Fungsi : Output karakter sederhana. Register Input : AH = 0Eh AL = kode ASCII karakter BH = nomor halaman Register Output : Tidak Ada. Penjelasan : Karakter kontrol berpengaruh sesuai fungsinya. Pada ROM BIOS dengan tanggal antara 24/4/81 ke atas umumnya register BH tidak berfungsi karena setiap output akan dicetak ke halaman aktif. INTERRUPT 10h - Service 0Fh Get Current Video Mode Fungsi : Mendapatkan mode video aktif. Register Input : 45

Bab IV Interupsi AH = 0Fh Register Output : AL = mode video AH = jumlah karakter per kolom BH = nomor halaman tampilan Penjelasan : Jika mode video diset dengan bit 7 on, maka AL yang didapat juga akan berisi bit 7 on. Konflik : Driver tampilan VUIMAGE INTERRUPT 10h - Service 11h,Subservice 00h Load User Specific Character Fungsi : Membuat karakter ASCII baru. Terdapat pada : Sistem dilengkapi tampilan EGA, VGA, dan MCGA. Register Input : AH = 11h AL = 00h CX = jumlah karakter akan diubah DX = nomor karakter mulai diubah BL = nomor blok untuk diubah BH = jumlah byte per karakter ES:BP = buffer bentuk karakter Register Output : Tidak Ada INTERRUPT 10h - Service 13h Write String Fungsi : Mencetak string ke Layar Terdapat pada : Mesin 80286 ke atas dengan tampilan EGA ke atas. Register Input : AH = 13h AL = 00h BH = nomor halaman BL = atribut untuk string CX = jumlah karakter pada string DH,DL = koordinat untuk memulai pencetakan ES:BP = alamat string yang akan dicetak Register Output : Tidak Ada. Penjelasan : Memperlakukan karakter kontrol sesuai fungsinya. INTERRUPT 16h - Service 00h Get Keystroke Fungsi : Menunggu masukan keyboard. Terdapat pada : Semua mesin. Register Input : AH = 00h Register Output : Jika AL=0 maka AH = kode Extended Jika AL<>0 maka AL = Kode ASCII AH = Kode Scan INTERRUPT 16h - Service 01h Check Keystroke Fungsi : Mengecek isi keyboard buffer. Terdapat pada : Semua mesin. Register Input : AH = 01h Register Output : ZF=0 bila buffer tidak kosong Jika AL=0 maka AH = kode Extended 46

Bab IV Interupsi Jika AL<>0 maka AL = Kode ASCII AH = Kode Scan ZF=1 bila buffer kosong INTERRUPT 16h - Service 10h Get Enhanced Keystroke Fungsi : Menunggu masukan keyboard. Terdapat pada : Mesin AT dengan keyboard Enhanced. Register Input : AH = 10h Register Output : AH = kode scan AL = kode ASCII INTERRUPT 16h - Service 11h Check Enhanced Keystroke Fungsi : Mengecek isi keyboard buffer. Terdapat pada : Mesin AT dengan keyboard Enhanced. Register Input : AH = 11h Register Output : ZF=0 bila buffer tidak kosong Jika AL=0 maka AH = kode Extended Jika AL<>0 maka AL = Kode ASCII AH = Kode Scan ZF=1 bila buffer kosong INTERRUPT 19h Bootstrap Loader Fungsi : Melakukan Warm Boot. Register Input : Tidak Ada. Register Output : Tidak Ada. INTERRUPT 1Bh Control Break Handler Fungsi : Interupsi ini terjadi setiap kali terjadi penekanan tombol Ctrl+Break. Register Input : Tidak Ada. Register Output : Tidak Ada. INTERRUPT 1Ch Timer Tick Fungsi : Interupsi ini disediakan untuk digunakan oleh pemakai. Interupsi 1Ch akan terjadi kurang lebih 18,2 kali setiap detik. Anda bisa membuat program residen dengan memanfaatkan timer tick ini. Register Input : Tidak Ada. Register Output : Tidak Ada. INTERRUPT 21h - Service 01h Read Character With Echo Fungsi : Untuk membaca masukan 1 karakter dari keyboard dan menampilkannya ke layar. Fungsi ini dapat dihentikan oleh penekanan tombol Ctrl+Break. Register Input : AH = 10h Register Output : 47

Bab IV Interupsi AL = Kode ASCII Catatan : Berbeda dengan fungsi dari BIOS, untuk membaca karakter khusus yang mempunyai kode Extended, anda harus membacanya dua kali dengan fungsi dari DOS ini. INTERRUPT 21h - Service 02h Write Character To Standard Output Fungsi : Untuk mencetak satu buah karakter pada layar. Register Input : AH = 02h DL = Kode ASCII Register Output : Tidak ada INTERRUPT 21h - Service 07h Direct Character Input Without Echo Fungsi : Untuk membaca masukan 1 karakter dari keyboard. Fungsi ini tidak akan menampilkan karakter yang ditekan pada layar, selain itu penekanan tombol Ctrl+Break juga akan diabaikan. Register Input : AH = 07h Register Output : AL = Kode ASCII INTERRUPT 21h - Service 08h Character Input Without Echo Fungsi : Untuk membaca masukan 1 karakter dari keyboard. Fungsi ini tidak akan menampilkan karakter yang ditekan pada layar. Penekanan tombol Ctrl+Break akan menghentikan fungsi ini. Register Input : AH = 08h Register Output : AL = Kode ASCII INTERRUPT 21h - Service 09h Write String To Standard Output Fungsi : Untuk mencetak string ke layar. Register Input : AH = 09h DS:DX = String yang diakhiri dengan tanda "$". Register Output : Tidak ada INTERRUPT 21h - Service 0Ah Input String Fungsi : Untuk mendapatkan masukan string dari keyboard. Register Input : AH = 0Ah DS:DX = Buffer Spesifikasi buffer: - Offset 00 mencatat maksimum karakter yang dapat dimasukkan. - Offset 01 banyaknya masukan dari keyboard yang telah diketikkan. Tombol CR tidak akan dihitung. - Offset 02 keatas, tempat dari string yang diketikkan disimpan. Register Output : Buffer terisi INTERRUPT 21h - Service 0Bh Get Status 48

Bab IV Interupsi Fungsi : Mengecek isi keyboard buffer. Register Input : AH = 0Bh Register Output : AL = 00 jika tidak ada karakter AL = FFh jika ada karakter INTERRUPT 21h - Service 14h Sequential Read From FCB File Fungsi : Untuk membaca file secara sekuensial. Register Input : AH = 14h DS:DX = FCB Register Output : AL = status INTERRUPT 21h - Service 25h Set Interrupt Vektor Fungsi : Untuk merubah vektor interupsi ke suatu lokasi dengan merubah alamat awal vektor interupsi. Register Input : AH = 25h AL = Nomor Interupsi DS:DX = Lokasi baru Register Output : Konflik : Phar Lap 386 INTERRUPT 21h - Service 2Fh Get DT A Address Fungsi : Untuk mengetahui alamat dari DTA yang digunakan. Register Input : AH = 2Fh Register Output : ES:BX = Lokasi DTA INTERRUPT 21h - Service 31h Terminate And Stay Residen Fungsi : Untuk meresidenkan suatu program. Register Input : AH = 31h AL = Kode return DX = Besar memory dalam paragraph Register Output : INTERRUPT 21h - Service 33h Extended Break Checking Fungsi : Untuk menghidup dan matikan pengecekan tombol Ctrl+Break oleh fungsi DOS. Register Input : AH = 33h AL = 0 untuk mengambil keterangan Ctrl+Break = 1 untuk merubah status Ctrl+Break DL = 0 Ctrl+Break dijadikan Off DL = 1 Ctrl+Break dijadikan On Register Output : Jika input AL=0 DL=0 Off DL=1 On 49

Bab IV Interupsi INTERRUPT 21h - Service 35h Get Interrupt Vektor Fungsi : Untuk mendapatkan alamat vektor interupsi dari suatu nomor interupsi. Register Input : AH = 35h AL = Nomor Interupsi Register Output : ES:BX = Alamat vektor interupsi INTERRUPT 21h - Service 3Ch Create File Handle Fungsi : Untuk menciptakan sebuah file baru dengan metode File Handle. Register Input : AH = 3Ch AL = Mode, dengan bit: 0 file Read only 1 file Hidden 2 file System 3 Volume label 4 Cadangan 5 file Archive DS:DX = Nama file ASCIIZ Register Output : Jika CF=0 maka AX=Nomor file handle Jika CF=1 maka AX=Kode kesalahan INTERRUPT 21h - Service 3Dh Open Existing File Fungsi : Untuk membuka file yang telah ada dengan metode file handle. Register Input : AH = 3Dh AL = Mode, dengan bit: 0 untuk Read only 1 untuk Write only 2 untuk Read/Write DS:DX = Nama file ASCIIZ Register Output : Jika CF=0 maka AX=Nomor file handle Jika CF=1 maka AX=Kode kesalahan INTERRUPT 21h - Service 3Eh Close File Handle Fungsi : Untuk menutup file handle Register Input : AH = 3Eh BX = Nomor file handle Register Output : CF=0 jika sukses CF=1 jika gagal, maka AX=Kode kesalahan INTERRUPT 21h - Service 3Fh Read From File Or Device Using File Handle Fungsi : Untuk membaca data dari suatu file atau device. Register Input : AH = 3Fh BX = Nomor file handle CX = Banyaknya byte yang akan dibaca 50

Bab IV Interupsi DS:DX = Alamat buffer Register Output : CF=0 jika sukses AX=byte yang berhasil dibaca CF=1 jika gagal AX=Kode kesalahan INTERRUPT 21h - Service 40h Write To File Or Device Using File Handle Fungsi : Untuk menulisi file atau device. Register Input : AH = 40h BX = Nomor file handle CX = Banyaknya byte yang DS:DX = Alamat data Register Output : CF=0 jika sukses AX=byte yang berhasil ditulisi CF=1 jika gagal akan ditulisi AX=Kode kesalahan INTERRUPT 21h - Service 41h Delete File Using File Handle Fungsi : Untuk menghapus file AH = 41h CL = Nama file ASCIIZ Register Input : Register Output : CF=0 jika sukses CF=1 jika gagal, maka AX=kode kesalahan INTERRUPT 21h - Service 42h Set Current File Position Fungsi : Untuk memindahkan pointer dari suatu file. Register Input : AH = 42h AL = Mode perpindahan: 00 dari awal file 01 dari posisi aktif 02 dari akhir file BX = Nomor file handle CX:DX = Banyaknya perpindahan Register Output : CF=0 jika sukses CF=1 jika gagal AX= kode kesalahan INTERRUPT 21h - Service 43h Set And Get File Atribut Fungsi : Untuk mengetahui dan merubah atribut dari suatu file. Register Input : AH = 43h AL = 0 untuk mendapatkan atribut file 1 untuk merubah atribut file CX = atribut baru dengan bit: 0 = Read Only 1 = Hidden 2 = System 5 = Archive 51

Bab IV Interupsi DS:DX = Nama file ASCIIZ Register Output : Jika input AL=0, maka: jika CF=0 CX = atribut jika CF=1 AX = Kode kesalahan INTERRUPT 21h - Service 4Ch Terminate With Return Code Fungsi : Untuk menghentikan program dan mengembalikan kendali kepada DOS. Fungsi ini lebih efektif untuk digunakan dibandingkan dengan interupsi 20h. Register Input : AH = 4Ch AL = Kode return Register Output : Tidak ada INTERRUPT 21h - Service 56h Rename File Fungsi : Untuk mengganti nama file. Fungsi ini juga bisa memindahkan file ke directory lain. Register Input : AH = 56h DS:DX = Nama file ASCIIZ lama ES:BX = Nama file ASCIIZ baru Register Output : CF=0 jika sukses CF=1 jika gagal AX=Kode kesalahan INTERRUPT 27h Terminate And Stay Residen Fungsi : Untuk meresidenkan program. Register Input : DS:DX = Batas alamat residen Register Output : 52

B A B V 5 PROCEDURE DAN MAKRO 5.1 PROCEDURE Procedure merupakan suatu alat bantu yang sangat berguna. Dengan procedure suatu program yang besar bisa diselesaikan dengan lebih mudah. Proses pencarian kesalahan pun akan lebih mudah bila digunakan procedure. 5.1.1 Membuat Procedure Untuk membuat procedure bisa anda gunakan bentuk seperti pada gambar 16.1. ------------------------------------------------------------- NamaP PROC NEAR/FAR +---------+ Program +---------+ RET NamaP ENDP ------------------------------------------------------------- "NamaP" adalah nama dari procedure yang kita definisikan sendiri. Untuk memudahkan nama untuk procedure bisa anda definisikan sesuai dengan fungsi dari procedure tersebut, seperti CLS untuk procedure yang tugasnya menghapus layar. Di belakang kata "PROC" anda harus memilih bentuk dari procedure tersebut, yaitu "NEAR" atau "FAR". Bentuk "NEAR" digunakan jika procedure tersebut nantinya dipanggil oleh program yang letaknya masih satu segment dari procedure tersebut. Pada program COM yang terdiri atas satu segment, kita akan selalu menggunakan bentuk "NEAR". Sebaliknya bentuk "FAR" ini digunakan bila procedure dapat dipanggil dari segment lain. Bentuk ini akan kita gunakan pada program EXE. Perintah "RET(Return)" digunakan untuk mengembalikan Kontrol program pada si pemanggil procedure. Pada bentuk NEAR perintah RET ini akan mempop atau mengambil register IP dari stack sebagai alamat loncatan menuju program pemanggil procedure. Sedangkan pada bentuk "FAR" perintah RET akan mengambil register IP dan CS dari stack sebagai alamat loncatan menuju program pemanggil procedure. Alamat kembali untuk procedure disimpan pada stack pada saat procedure tersebut dipanggil dengan perintah "CALL", dengan syntax: CALL NamaP Perintah Call ini akan menyimpan register IP saja bila procedure yang dipanggil berbentuk "NEAR". Bila procedure yang dipanggil berbentuk "FAR", maka perintah "CALL" akan menyimpan register CS dan IP. 5.1.2 Menggunakan Procedure Sebagai contoh dari pemakaian procedure akan kita lihat pada program 16.1 yang mencetak karakter dengan procedure. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : PROC_KAR.ASM ; 53

Bab V Procedure dan Makro ; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ; ;================================================; Proses : CALL Cetak_Kar ; Panggil Cetak_Kar INT 20h Cetak_Kar PROC NEAR MOV AH,02h MOV DL,'S' INT 21h RET Cetak_Kar ENDP ; Cetak karakter ; Kembali kepada si pemanggil ; END Procedures END Proses Bila program di atas dijalankan, maka pada layar akan ditampilkan huruf "S". Untuk membuat sebuah procedure ingatlah untuk menyimpan semua register yang digunakan oleh procedure tersebut dan mengembalikan semua isi register pada akhir procedure. Hal ini dilakukan untuk menjaga supaya program utama yang menggunakan procedure tersebut tidak menjadi kacau nantinya. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : PROC_KA1.ASM ; ; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ; ; ; ;================================================; TData : JMP Proses Kar DB? Klm DB 'BATMAN SI MANUSIA KELELAWAR ' ; 28 Karakter Proses : MOV CX,28 ; Banyaknya pengulangan XOR BX,BX ; Addressing Mode Ulang : MOV DL,Klm[BX] MOV Kar,DL CALL Cetak_Kar ; Panggil Cetak_Kar INC BX LOOP Ulang INT 20h Cetak_Kar PROC NEAR PUSH AX PUSH DX ; Simpan semua register ; Yang digunakan 54

Bab V Procedure dan Makro MOV AH,02h MOV DL,Kar INT 21h ; Cetak karakter POP DX ; Kembalikan semua register POP AX ; Yang disimpan RET ; Kembali kepada si pemanggil Cetak_Kar ENDP ; END Procedures END TData Bila program di atas dijalankan, maka pada layar akan ditampilkan: BATMAN SI MANUSIA KELELAWAR Pada procedure kita tidak bisa menggunakan parameter, inilah salah satu kelemahan dari procedure yang sangat berarti. Untuk menggunakan parameter anda harus menggunakan MACROS. 5.2 MACRO 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! 5.2.1 Membuat Makro Macro adalah lebih mudah dibuat daripada procedure. Untuk membuat Macro bisa anda gunakan bentuk seperti berikut: --------------------------------------------------------------- NamaM MACRO [P1,P2,,] +------------+ Program +------------+ ENDM --------------------------------------------------------------- "P1" dan "P2" adalah parameter yang bisa anda gunakan pada macro. Parameter ini berbentuk opsional, 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 MOV DL,Kar Ulang : INT 21h ; Cetak Karakter LOOP Ulang ENDM ; End Macro 55

Bab V Procedure dan Makro ;----------------------------------------------------------------; ; Program : MAC1.ASM ; ; Fungsi : Menggunakan Macro untuk mencetak huruf 'SSS' ; ;----------------------------------------------------------------; Proses: Cetak_Kar 'S' ; Cetak Huruf S INT END 20h 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. 5.2.2 Label Pada Makro Pada macro anda bisa menggunakan label seperti biasa. Tetapi anda harus ingat, karena setiap pemanggilan Macro akan menyebabkan seluruh isi macro tersebut disisipkan pada program, maka pada macro yang di dalamnya menggunakan label hanya dapat dipanggil sebanyak satu kali. Bila anda menggunakannya lebih dari satu kali maka akan terjadi "**Error** Symbol already defined elsewhere: ULANG" karena dianggap kita menggunakan label yang sama. Untuk menghindari hal itu, gunakanlah direktif LOCAL. Dengan direktif LOCAL assembler akan membedakan label tersebut setiap kali terjadi pemanggilan terhadapnya. 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 ENDM ; End Macro ;--------------------------------------------------------------------; ; Program : MAC2.ASM ; ; Fungsi : Menggunakan Macro untuk mencetak huruf 'PPPCCC' ; 56

Bab V Procedure dan Makro ;--------------------------------------------------------------------; Proses: Cetak_Kar 'P' Cetak_Kar 'C' ; Cetak Huruf P ; Cetak Huruf C INT END 20h Proses 5.3 MACRO ATAU PROCEDURE Banyak pro dan kontra mengenai macro dan procedure ini. Sebagian orang menganggap macro akan merugikan program, tetapi banyak juga yang menganggap macro adalah pemecahan yang tepat dalam pemrograman assembler yang terkenal sulit untuk digunakan. Kini apa yang akan anda pakai? Macro ataukah procedure? Untuk itu marilah kita lihat dahulu perbedaan antara procedure dan macro ini. - Procedure tidak memperpanjang program, karena hanya muncul sekali saja pada program. - Macro akan muncul pada program setiap terjadi pemanggilan terhadap macro, sehingga macro akan memperpanjang program. - Untuk menggunakan procedure anda harus memanggilnya dengan perintah CALL dan dalam procedure diakhiri dengan RET. - Macro bisa anda gunakan dengan memanggil langsung namanya dan pada macro tidak perlu diakhiri dengan RET. - Procedure akan memperlambat program, karena setiap pemanggilan terhadap procedure, komputer harus melakukan lompatan. - Macro tidak memperlambat program karena komputer tidak perlu melakukan lompatan. - Pada procedure anda tidak bisa menggunakan parameter secara langsung. Bila anda ingin menggunakan parameter bisa dengan melalui stack atau register. - Macro dengan mudah bisa menggunakan parameter, suatu ciri bahasa tingkat tinggi. - Macro lebih mudah dibuat dan digunakan daripada procedure. Setelah melihat perbedaan-perbedaan tersebut, kapankah kita menggunakan procedure dan kapankah menggunakan macro? - Jika fungsi tersebut jarang dipanggil, gunakanlah MACRO karena macro tidak memperlambat proses. - Jika fungsi tersebut sering dipanggil, gunakanlah PROCEDURE karena procedure tidak memperbesar program. - Jika fungsi tersebut kecil, gunakanlah MACRO. Karena pengaruh terhadap besarnya program hanya sedikit dan program akan lebih cepat. - Jika fungsi tersebut besar, gunakanlah PROCEDURE. Karena procedure tidak memperbesar program. 57

6 CONTOH-CONTOH PROGRAM UNTUK LATIHAN Program 1 ;===============================================; ; FUNGSI : MENCETAK KARATER 'A' DENGAN INT 21 ; ;===============================================; Proses : MOV AH,02h ; Nilai servis ntuk mencetak karakter MOV DL,'A' ; DL = Karakter ASCII yang akan dicetak INT 21h ; Cetak karakter!! INT 20h END Proses ; Selesai! kembali ke DOS Program 2 ;=================================================================; ; PROGRAM: A1.ASM ; ; FUNGSI : MENCETAK KARATER 'A' BESERTA ATRIBUTNYA DENGAN INT 10h ; ;=================================================================; Proses : MOV AH,09h ; Nilai servis untuk mencetak karakter MOV AL,'A' ; AL = Karakter yang akan dicetak MOV BH,00h ; Nomor Halaman layar MOV BL,93h ; Warna atau atribut dari karakter MOV CX,03h ; Banyaknya karakter yang ingin dicetak INT 10h ; Laksanakan!!! INT 20h END Proses ; Selesai! kembali ke DOS Program 3 ;==============================================================; ; PROGRAM : ABC0.ASM ; ; FUNGSI : MENCETAK 16 BUAH KARAKTER DENGAN INT 21h SERVIS 02 ; ;==============================================================; Proses : MOV AH,02h MOV DL,'A' ; Nilai servis ; DL=karakter 'A' atau DL=41h ; Banyaknya pengulangan yang akan MOV CX,10h Ulang : INT 21h ; Cetak karakter!! INC DL ; Tambah DL dengan 1 LOOP Ulang ; Lompat ke Ulang 58

Contoh-Contoh Program Untuk Latihan INT 20h END Proses Program 4 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : TAMBAH.ASM ; ; FUNGSI : MELIHAT PENAMBAHAN YANG DILAKUKAN OLEH BERBAGAI PERINTAH ; ;====================================================================; Proses : MOV AH,15h MOV AL,4 ADD AH,AL MOV AX,1234h MOV BX,0F221h ADD AX,BX ; AH:=15h ; 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 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 INC AL ; AL:=AL+1, nilai pada AL ditambah 1 INT 20h END Proses Program 5 ;===============================================; ; PROGRAM : KURANG.ASM ; ; FUNGSI : MENGURANGKAN ANGKA 122EFFF-0FEFFFF ; ;===============================================; TData : JMP Proses ALo EQU 0EFFFh AHi EQU 122h BLo EQU 0FFFFh Bhi EQU 0FEh HslLo DW? HslHi DW? Proses : MOV AX,ALo SUB AX,Blo MOV HslLO,AX MOV AX,AHi SBB AX,BHi ; Lompat ke Proses ; AX=EFFFh ; Kurangkan EFFF-FFFF, jadi AX=F000 ; HslLo bernilai F000 ; AX=122h ; Kurangkan 122-FE-Carry, AX=0023 59

Contoh-Contoh Program Untuk Latihan MOV HslHi,AX ; HslHi bernilai 0023 INT 20h END TData ; Kembali ke DOS Program 6 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : CBA0.ASM ; ; FUNGSI : MENCETAK KARAKTER "Z".."A" DENGAN INT 21h SERVIS 02 ; ;=================================================================; Proses : MOV AH,02h MOV DL,'Z' MOV CX,26 ; Nilai servis ; DL=5Ah ; Banyaknya pengulangan yang akan ; dilakukan Ulang: INT 21h ; Cetak karakter!! DEC DL ; Kurang DL dengan 1 LOOP Ulang ; Lompat ke Ulang INT 20h END Proses Program 7 ;========================================================; ; PROGRAM : KALI.ASM ; ; FUNGSI : MENGALIKAN BILANGAN 16 BIT, HASIL PADA DX:AX ; ;========================================================; TData : JMP Proses A DW 01EFh B DW 02FEh HslLo DW? HslHi DW? Proses: MOV AX,A MUL B MOV HslLo,AX MOV HslHi,DX INT 20h END TData ; Lompat ke Proses ; AX=1EF ; Kalikan 1FH*2FE ; AX bernilai C922 sehingga HslLo=C922 ; DX bernilai 0005 sehingga HslHi=0005 ; Kembali ke DOS Program 8 ;====================================================; ; PROGRAM : BAGI.ASM ; ; FUNGSI : MEMBAGI BILANGAN 16 BIT, HASIL PADA DX:AX ; ;====================================================; 60

Contoh-Contoh Program Untuk Latihan TData : JMP Proses A DW 01EFh B DW 2 Hsl DW? Sisa DW? Proses: SUB DX,DX MOV AX,A DIV B MOV Hsl,AX MOV Sisa,DX INT 20h END Tdata ; Lompat ke Proses ; Jadikan DX=0 ; AX=1EF ; Bagi 1EF:2 ; AX bernilai 00F7 sehingga Hsl=00F7 ; DX berisi 0001 sehingga Sisa=0001 ; Kembali ke DOS Program 9 ;==================================================; ; PROGRAM : BHSMESIN.ASM ; ; FUNGSI : MEMBUNYIKAN SPEAKER DENGAN DATA PROGRAM ; ;==================================================; Tdata:DB 0E4h,61h,24h,0FEh,0E6h,61h,0B9h,0D0h,7h,0BBh,9Ah DB 2h,8Bh,0D1h,51h,34h,2h,0E6h,61h,0D1h,0C3h,73h,6h DB 83h,0C1h,0h,0EBh,0Bh,90h,52h,2Bh,0D1h,87h,0D1h,5Ah DB 81h,0C1h,34h,8h,0E2h,0FEh,59h,0E2h,0E2h,0CDh,20h END Tdata Program 10 ;============================================; ; FUNGSI : DEMO PENYIMPANAN TIPE DATA ; ;============================================; TData : JMP Proses A DB 12h,34h B DW 0ABCDh C DD 56789018h D DB 40 DUP(1) END Tdata Program 11 ;=============================================================; ; PROGRAM : PTR.ASM ; 61

Contoh-Contoh Program Untuk Latihan ; FUNGSI : MEMINDAHKAN DATA ANTAR TIPE DATA YANG BERBEDA!!! ; ;=============================================================; TData : JMP Proses A DW 01EFh B DW 02FEh D DD? Proses: MOV AL,BYTE PTR A MOV AH,BYTE PTR A+1 MOV BX,B MOV WORD PTR D,AX MOV WORD PTR D+2,BX INT 20h END TData ; Lompat ke Proses ; 2 Byte ; 2 Byte ; 4 Byte ; AL=EF, AX=?EF ; AH=01, AX=01EF ; BX=02FE ; D=??01EF ; D=02FE01EF ; Kembali ke DOS Program 12 ;=======================================================; ; PROGRAM : KALIPTR.ASM ; ; FUNGSI : MENGALIKAN BILANGAN 16 BIT, HASIL PADA DX:AX ; ;=======================================================; TData : JMP Proses A DW 01EFh B DW 02FEh Hsl DD? Proses: MOV AX,A MUL B MOV WORD PTR Hsl,AX MOV WORD PTR Hsl+2,DX INT 20h END TData ; Lompat ke Proses ; 2 Byte ; 2 Byte ; 4 Byte ; AX=1EF ; Kalikan 1FH*2FE ; AX bernilai C922, Hsl=??C922 ; DX bernilai 0005, Hsl=0005C922 ; Kembali ke DOS Program 13 ;/================================\; ; PROGRAM : ADDR1.ASM ; ; FUNGSI : PERKALIAN DENGAN 80386 ; ;\================================/;.386 ; Untuk prosesor 80386 Proses : 62

Contoh-Contoh Program Untuk Latihan MOV EAX,12345678h MOV EDX,33112244h MOV EBX,EDX MUL EBX ; Immediate Addressing ; Immediate Addressing ; Register Addressing ; Register Addressing END Proses Program 14 ;/================================================\; ; PROGRAM : RID.ASM ; ; FUNGSI : MENGAKSES DATA MELALUI ALAMAT EFEKTIVE ; ;\================================================/; TData : JMP Proses Kal DB 'ABCDEF' Proses: LEA BX,Kal ; Ambil Offset Kal MOV CX,2 Ulang: MOV DL,[BX] ; kode ASCII yang ingin dicetak MOV AH,02h ; Nilai servis ntuk mencetak karakter INT 21h ; Laksanakan!! ADD BX,2 ; BX:=BX+2 LOOP Ulang ; Lompat ke Ulang INT 20h END TData Program 15 ;/========================================================\; ; PROGRAM : BRA0.ASM ; ; FUNGSI : MENGAKSES DATA DENGAN BASE RELATIVE ADDRESSING ; ;\========================================================/; TData : JMP Proses Tabel DW 11h,50h,0Ah,14h,5Ah Proses: LEA BX,Tabel MOV AX,Tabel ADD AX,[BX]+2 ADD AX,[BX]+4 ADD AX,[BX+6] ADD AX,[BX+8] INT 20h END TData 63

Contoh-Contoh Program Untuk Latihan Program 16 ;/==========================================================\; ; PROGRAM : BRA1.ASM ; ; FUNGSI : MENCETAK KALIMAT DENGAN BASE RELATIVE ADDRESSING ; ;\==========================================================/; TData : JMP Proses Kalimat DB 'NYAMUK GORENG' ; 13 karakter Proses: XOR BX,BX ; BX=0 Untuk penunjuk Offset MOV CX,13 ; Counter LOOP Ulang : MOV DL,Kalimat[BX] ; Ambil karakter yang ke BX MOV AH,02 ; Servis untuk cetak karakter INT 21h ; Cetak Karakter INC BX ; BX:=BX+1 LOOP Ulang ; Lompat ke Ulang sampai CX=0 INT 20h ; Selesai, kembali ke DOS!! END TData Program 17 ;/=====================================\; ; PROGRAM : VRBIOS.ASM ; ; FUNGSI : MELIHAT VERSI BIOS KOMPUTER ; ;\=====================================/; Proses : MOV AX,0F000h ; Masukkan nilai F000 pada AX MOV ES,AX ; Copykan nilai AX ke ES MOV BX,0FFF5h ; Penunjuk Offset XOR SI,SI ; Jadikan SI=0 MOV CX,8 ; Counter untuk LOOP Ulang: MOV DL,ES:[BX][SI] ; Ambil isi alamat ES:BX+SI MOV AH,02h ; Nilai servis mencetak karakter INT 21h ; Cetak!! INC SI ; SI:=SI+1 LOOP Ulang ; Lompat ke Ulang sampai CX=0 INT 20h END Proses ; Selesai! kembali ke DOS Program 18 ;/=======================================================\; ; PROGRAM : BIA.ASM ; ; FUNGSI : MENGAKSES ARRAY DENGAN BASE INDEXED ADDRESSING ; ;\=======================================================/; 64

Contoh-Contoh Program Untuk Latihan TData : JMP Proses Mahasiswa STRUC Nim DW 0 Tinggi DB 0 Nilai DB 0,0,0,0 Mahasiswa ENDS Absen Mahasiswa 10 DUP (<>) ; 2 byte ; 1 byte ; 4 byte Proses: LEA BX,Absen ; BX Menunjuk Offset Absen ADD BX,21 ; BX Menunjuk pada Record ke 4 XOR SI,SI ; SI=0 MOV [BX][SI].Nim,0099h ; NIM, record ke 4 MOV [BX][SI].Tinggi,10h ; Tinggi, record ke 4 MOV [BX][SI+1].Nilai,78h ; Nilai pertama MOV [BX][SI+2].Nilai,99h ; Nilai kedua MOV [BX][SI+3].Nilai,50h ; Nilai keempat MOV [BX][SI+4].Nilai,83h ; Nilai kelima INT 20h ; Selesai!! END TData Program 19 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Program: kal0.asm ; ; Fungsi : Mencetak String dengan Int 21 servis 9 ; ;=================================================; Tdata : JMP Proses Kal0 DB 'PROSES PENCETAKAN STRING ',13,10,'$' Kal1 DB 'DIBELAKANG TANDA $ TIDAK BISA DICETAK ' Proses: MOV AH,09h ; Servis ke 9 MOV DX,OFFSET Kal0 ; Ambil Alamat Offset Kal0 INT 21h ; Cetak perkarakter sampai tanda $ LEA DX,Kal0 ; Ambil Alamat Offset Kal0 INT 21h ; Cetak perkarakter sampai tanda $ LEA DX,Kal0+7 ; Ambil Alamat Offset KAl0+7 INT 21h ; Cetak perkarakter sampai tanda $ LEA DX,KAL1 ; Ambil Offset kal1 INT 21h ; Cetak perkarakter sampai ketemu $ INT 20h END Tdata ; Selesai, kembali ke DOS 65

Contoh-Contoh Program Untuk Latihan Program 20 ;/=============================================\; ; Program : ATTR-KLM.ASM ; ; Fungsi : Mencetak kalimat disertai atributnya ; ;-----------------------------------------------; ; INT 10h ; ;-----------------------------------------------; ; Input : ; ; AX = 1300h ; ; BL = Atribut ; ; BH = Halaman tampilan ; ; DL = Posisi X ; ; DH = Posisi Y ; ; CX = Panjang kalimat<dalam karakter> ; ; ES:BP = Alamat awal string ; ;\=============================================/; TData : JMP Proses Kal0 DB ' Menulis kalimat dengan Atributnya ' Proses: MOV AX,1300h ; Servis 13h subfungsi 00 MOV BL,10010101b ; Atribut tulisan MOV BH,00 ; Halaman tampilan 0 MOV DL,20 ; Posisi X MOV DH,12 ; Posisi Y MOV CX,35 ; Banyaknya karakter dalam string LEA BP,Kal0 ; ES:BP alamat string INT 10h ; Cetak kalimat! INT 20h END TData ; Selesai, kembali ke DOS Program 21 ;/===============================================================\; ; Program : CMPJ.ASM ; ; Fungsi : Mendemokan perintah lompat yang mengikuti perintah CMP ; ;\===============================================================/; 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 66

Contoh-Contoh Program Untuk Latihan 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 END TData ; Kembali ke DOS. Program 22 ;/======================================================================\; ; Program : JMPL.ASM ; ; Fungsi : Mencetak kalimat secara perkarakter sampai ditemui karakter '*' ;\======================================================================/; 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 END TData ; Selesai! kembali ke DOS Program 23 ;/======================================================================\; ; Program : NSTACK.ASM ; ; Fungsi : Mencetak kalimat 2 kali dengan operasi yang mirip dengan stack; ;\======================================================================/; TData : JMP Proses Kal DB 'LANG LING LUNG $' Ganti DB 13,10,'$' 67

Contoh-Contoh Program Untuk Latihan 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 Program 24 ;/=====================================================================\; ; Program : STACK.ASM ; ; Fungsi : Mencetak kalimat 2 kali dengan operasi stack yang sebenarnya ; ;\=====================================================================/; TData : JMP Proses Kal DB 'LANG LING LUNG $' 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 25 ;/===========================================\; ; Program : READKEY.ASM ; ; Fungsi : Input satu karakter dari keyboard. ; ;=============================================; ; INTERUPSI 16h ; ;=============================================; ; Input: OutPut: ; ; AH = 0 Jika tombol biasa, maka: ; ; AL = ASCII ; ; AH = SCAN ; ; ; 68

Contoh-Contoh Program Untuk Latihan ; Jika Tombol khusus, maka ; ; AL = 00 ; ; AH = Extended ; ;\===========================================/; TData : JMP Proses T_ASCII DB 13,10,'Ini adalah tombol ASCII : $' T_Extended DB 13,10,'Ini adalah tombol Extended $' Proses : MOV AH,0 ; Servis Input satu karakter INT 16h ; Laksanakan PUSH AX ; Simpan hasil pembacaan pada stack CMP AL,00 ; Apakah ini karakter extended? JE Extended ; Ya!, Lompat ke Extended ASCII: LEA DX,T_ASCII ; Ambil alamat efektif T_ASCII MOV AH,09 ; Servis cetak kalimat INT 21h ; Cetak kalimat! POP AX ; Ambil kembali nilai AX pada stack MOV DL,AL ; Ambil kode ASCII yang ditekan MOV AH,2 ; Servis cetak karakter INT 21h ; Cetak karakter! CMP AL,'Q' ; Apakah yang ditekan huruf 'Q'? JE exit ; Ya!, lompat ke Exit CMP AL,'q' ; Apakah yang ditekan huruf 'q'? JE exit ; Ya!, lompat ke Exit JMP Proses ; Lompat ke Proses Extended: LEA DX,T_Extended ; Ambil alamat efektif T_Extended MOV AH,09 ; Servis cetak kalimat INT 21h ; Cetak kalimat! JMP Proses ; Lompat ke Proses exit: INT 20h ; Kembali ke DOS! END TData Program 26 ;/================================================\; ; Program : KEYPRESS.ASM ; ; Fungsi : Mengecek apakah ada tombol yang ditekan ; ;==================================================; ; INTERUPSI 16h ; ;==================================================; ; Input: OutPut: ; ; AH = 1 Jika Ada tombol yang ditekan ; ; ZF = 0 dan ; ; AL = kode ASCII ; ; AH = Scan Code ; ; ; ; Jika Tidak ada penekanan Tombol ; ; ZF = 1 ; 69

Contoh-Contoh Program Untuk Latihan ;\===============================================/; TData : JMP Proses Kal0 DB 'Tekan sembarang tombol untuk berhenti! ' DB 13,10,'$' Proses : MOV AH,1 ; Servis untuk mengecek buffer keyboard INT 16h ; Laksanakan! JNZ EXIT ; Jika ada tombol yang ditekan, lompat ; Ke EXIT MOV AH,09 ; Servis untuk cetak kalimat LEA DX,Kal0 ; Ambil alamat efektif Kal0 INT 21h ; Cetak kalimat! JMP Proses ; Lompat ke Proses exit : INT 20h ; Kembali ke DOS! END TData Program 27 ;===========================================================; ; Program Masukan String Dari Keyboard ; ; Input: ; ; AH = 0Ah ; ; DS:DX = Penampung dengan spesifikasi: ; ; Byte 1 = Maksimum karakter yang dapat dimasukkan ; ; Byte 2 = Akan dijadikan Indikator banyaknya ; ; karakter yang dimasukkan ; ; Byte 3 keatas = Tempat hasil masukan ditampung ; ;\=========================================================/; TData : JMP Proses T_Enter EQU 0Dh Kal0 DB 'Ketikkan satu Kalimat : $' Kal1 DB 13,10,'Kalimat pada buffer : $' Buffer DB 23,?,23 DUP(?) Proses : MOV AH,09 LEA DX,Kal0 INT 21h ; Cetak kalimat Kal0 MOV AH,0Ah ; Servis Input kalimat LEA DX,Buffer ; DX menunjuk pada offset Buffer INT 21h ; Input kalimat! MOV AH,09 LEA DX,Kal1 INT 21h ; Cetak kalimat Kal1 LEA BX,Buffer+2 Ulang: CMP BYTE PTR [BX],T_Enter ; BX menunjuk byte ke 3 Buffer ; Apakah karakter Enter? 70

Contoh-Contoh Program Untuk Latihan JE EXIT MOV DL,[BX] MOV AH,02 INT 21h INC BX JMP Ulang ; Ya! Lompat ke Exit ; Masukkan karakter pada DL ; Servis cetak karakter ; Cetak karakter ; BX := BX+1 ; Lompat ke Ulang EXIT: INT 20h ; Kembali ke DOS! END TData Program 28 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : PROC_KAR.ASM ; ; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ; ;=============================================; Proses : CALL Cetak_Kar INT 20h Cetak_Kar PROC NEAR MOV AH,02h MOV DL,'S' INT 21h RET Cetak_Kar ENDP ; Panggil Cetak_Kar ; Cetak karakter ; Kembali kepada si pemanggil ; END Procedures END Proses Program 29 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : PROC_KA1.ASM ; ; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ; ;============================================; TData : JMP Proses Kar DB? Klm DB 'BATMAN SI MANUSIA KELELAWAR ' ; 28 Karakter Proses : MOV CX,28 XOR BX,BX Ulang : MOV DL,Klm[BX] MOV Kar,DL CALL Cetak_Kar INC BX LOOP Ulang ; Banyaknya pengulangan ; Addressing Mode ; Panggil Cetak_Kar 71

Contoh-Contoh Program Untuk Latihan INT 20h Cetak_Kar PROC NEAR PUSH AX PUSH DX MOV AH,02h MOV DL,Kar INT 21h POP DX POP AX RET Cetak_Kar ENDP ; Simpan semua register ; Yang digunakan ; Cetak karakter ; Kembalikan semua register ; Yang disimpan ; Kembali kepada si pemanggil ; END Procedures END TData Program 30 Cetak_Kar MACRO Kar MOV CX,3 MOV AH,02 MOV DL,Kar Ulang : INT 21h LOOP Ulang ENDM ; Cetak Karakter ; End Macro ;-------------------------------------------------------; ; Program : MAC1.ASM ; ; Fungsi : Menggunakan Macro untuk mencetak huruf 'SSS' ; ;-------------------------------------------------------; Proses: Cetak_Kar 'S' ; Cetak Huruf S INT 20h END Proses Program 31 Cetak_Kar MACRO Kar LOCAL Ulang MOV CX,3 MOV AH,02 MOV DL,Kar Ulang: INT 21h LOOP Ulang ENDM ; Label 'Ulang' jadikan Local ; Cetak Karakter ; End Macro ;----------------------------------------------------------; ; Program : MAC2.ASM ; ; Fungsi : Menggunakan Macro Untuk mencetak huruf 'PPPCCC' ; ;----------------------------------------------------------; 72

Contoh-Contoh Program Untuk Latihan Proses: Cetak_Kar 'P' Cetak_Kar 'C' ; Cetak Huruf P ; Cetak Huruf C INT 20h END Proses Program 32 Tulis_Kar MACRO X,Y,Kar,Attr MOV AX,0B800h MOV ES,AX MOV AH,Y MOV AL,160 MUL AH MOV BX,AX MOV AH,X MOV AL,2 MUL AH ADD BX,AX MOV AL,Kar MOV AH,Attr MOV ES:[BX],AL MOV ES:[BX+1],AH ENDM ; ES Menunjuk pada segment layar ; Hitung offset baris ; Simpan hasilnya pada BX ; Hitung offset kolom ; Tambahkan hasilnya pada BX ; AL=karakter yang akan ditampilkan ; AH=Atribut yang akan ditampilkan ; Tampilkan Karakter dan atributnya ; pada posisi kolom X dan baris Y ;/========================================================\; ; Program : LAYAR1.ASM ; ; Fungsi : Menampilkan karakter dan atributnya ; ; dengan menuliskannya langsung pada memory layar ; ;\========================================================/; Proses : Tulis_Kar 40 12 'S' 95 ; Tulis karakter 'S' dengan ; no atribut 95 pada posisi INT 20h ; kolom 40 dan baris 12 END Proses Program 33 Delay MACRO PUSH CX XOR CX,CX Loop1: LOOP Loop1 POP CX ENDM ; Macro ini digunakan untuk ; menunda program, dan ; hanya melakukan looping Geser MACRO PosY PUSH AX 73

Contoh-Contoh Program Untuk Latihan PUSH BX PUSH CX ; Simpan semua register yang digunakan XOR CX,CX MOV AL,26 SUB AL,PosY MOV CL,AL ; CX=banyaknya pergeseran kebawah Loop2: MOV AL,BYTE PTR ES:[BX] ; AL=Karakter pada layar MOV BYTE PTR ES:[BX+160],AL ; Geser ke bawah Hilang: MOV BYTE PTR ES:[BX],' ' ; Hapus karakter ; sebelumnya Delay ; delay, supaya bisa ; terlihat ADD BX,160 ; Menuju baris selanjutnya LOOP Loop2 ; Ulangi ke Loop2 ENDM POP CX POP BX POP AX ; Kembalikan semua register yang digunakan ;/===================================================\; ; Program : RONTOK.ASM ; ; Fungsi : Membersihkan layar dengan cara ; ; merontokkan hurufnya satu persatu ; ;\====================================================/ TData : JMP Proses PosY DB? Proses: MOV AX,0B800h MOV ES,AX ; ES mencatat segment layar MOV BX,3998 ; Posisi karakter 80,25 MOV CX,25 ; Banyaknya pengulangan baris UlangY : MOV PosY,CL ; PosY mencatat posisi baris PUSH CX ; CX mencatat posisi Y MOV CX,80 ; Banyaknya pengulangan Kolom UlangX : CMP BYTE PTR ES:[BX],33 ; Apakah ada karakter ; pada layar? JB Tdk ; Lompat ke Tdk, jika tidak ada Geser PosY ; Geser karakter tersebut ke bawah Tdk : SUB BX,2 ; BX menunjuk karakter selanjutnya LOOP UlangX ; Proses 80 kali untuk kolom POP CX ; Ambil posisi Y LOOP UlangY ; Ulangi dan ganti baris ke atas EXIT: INT 20h 74

Contoh-Contoh Program Untuk Latihan END TData Program 34 DELAY MACRO LOCAL Ulang PUSH CX XOR CX,CX Ulang: LOOP Ulang POP CX ENDM Scrool MACRO X1,Y1,X2,Y2,Arah PUSH CX MOV AH,Arah MOV AL,1 MOV CL,X1 MOV CH,Y1 MOV DL,X2 MOV DH,Y2 MOV BH,01000111b INT 10h POP CX ENDM ; Macro untuk menunda program ; Servis Gulung keatas atau kebawah ; Jumlah Baris ; Kolom kiri atas ; Baris kiri Atas ; Kolom kanan bawah ; Baris kanan bawah ; Atribut hasil penggulungan ;/===============================================\; ; Program : SCROOL.ASM ; ; Fungsi : Menggulung layar ; ;\===============================================/; TData : JMP Proses G_Atas EQU 6 G_Bawah EQU 7 Proses: MOV CX,7 Ulang: Scrool 20 7 60 14 G_Bawah delay LOOP Ulang INT 20h END TData Program 35 Cls MACRO MOV AX,0600h XOR CX,CX MOV DX,184Fh MOV BH,10 INT 10h ENDM GotoXY MACRO X,Y MOV AH,02 XOR BX,BX ; Servis untuk menggulung ke atas ; Servis untuk menggulung ke bawah ; Macro untuk menghapus layar ; Atribut Hijau diatas hitam ; Macro untuk memindahkan kursor 75

Contoh-Contoh Program Untuk Latihan MOV DH,Y MOV DL,X INT 10h ENDM SimpanL MACRO LOCAL Ulang MOV AX,0B800h MOV ES,AX MOV CX,4000 XOR BX,BX Ulang: MOV AL,ES:[BX] MOV Layar[BX],AL INC BX LOOP Ulang ENDM BalikL MACRO LOCAL Ulang MOV CX,4000 XOR BX,BX Ulang: MOV AL,Layar[BX] MOV ES:[BX],AL INC BX LOOP Ulang ENDM Sorot MACRO X,Y LOCAL Ulang ; Macro untuk menyimpan seluruh ; isi layar monitor ; Macro untuk mengembalikan semua ; isi layar yang telah disimpan ; Macro untuk membuat sorotan ; pada menu MOV BL,Y MOV AL,160 MUL BL MOV BX,AX MOV AL,X MOV AH,2 MUL AH ADD BX,AX INC BX MOV CX,25 Ulang: MOV BYTE PTR ES:[BX],4Fh ADD BX,2 LOOP Ulang ENDM Readkey MACRO MOV AH,00 INT 16h ENDM MenuL MACRO String MOV AH,09 ; Alamat warna pada posisi X,Y ; Panjangnya sorotan ; Atribut sorotan ; putih diatas merah ; Macro untuk membaca masukan dari ; keyboard. ; hasilnya AH=Extended, AL=ASCII ; Macro untuk mencetak menu 76

Contoh-Contoh Program Untuk Latihan LEA DX,String INT 21h ENDM ;/===================================================\; ; Program : SOROT.ASM ; ; Fungsi : Membuat menu sorot untuk digunakan program ; ;\===================================================/; TData: JMP Proses Layar DB 4000 DUP (?) Menu DB 9,9,'+=============================+',13,10 DB 9,9,' MENU SOROT «««',13,10 DB 9,9,'+=============================+',13,10 DB 9,9,' ',13,10 DB 9,9,' 1. Pilihan pertama ',13,10 DB 9,9,' 2. Pilihan Kedua ',13,10 DB 9,9,' 3. Pilihan Ketiga ',13,10 DB 9,9,' 4. Pilihan Keempat ',13,10 DB 9,9,' ',13,10 DB 9,9,'+=============================+$' PosX DB 22 ; Posisi kolom mula-mula PosY DB 12 ; Posisi baris mula-mula Panah_Atas EQU 72 ; Kode tombol panah atas Panah_Bawah EQU 80 ; Kode tombolpanah bawah TEnter EQU 0Dh ; Kode tombol Enter Proses : Cls ; Hapus layar GotoXY 0 8 ; kursor = 0,8 MenuL Menu ; Gambar menu SimpanL ; Simpan isi layar Ulang : BalikL ; Tampilkan isi layar yang ; disimpan Sorot PosX,PosY ; Sorot posisi X,Y Masukan: Readkey ; Baca masukan dari keyboard CMP AH,Panah_Bawah ; Panah bawah yang ditekan? JE Bawah ; Ya! lompat bawah CMP AH,Panah_Atas ; Panah atas yang ditekan? JE CekY ; Ya, lompat CekY CMP AL,TEnter ; Tombol enter yang ditekan? JNE Masukan ; Bukan, lompat ke ulangi JMP Selesai ; Ya, lompat ke selesai CekY : CMP PosY,12 ; Apakah sorotan paling atas? JE MaxY ; Ya! lompat ke MaxY DEC PosY ; Sorotkan ke atas JMP Ulang ; Lompat ke ulang MaxY : MOV PosY,15 ; PosY=Sorotan paling bawah 77

Contoh-Contoh Program Untuk Latihan JMP Ulang ; lompat ke ulang Bawah : CMP PosY,15 ; apakah sorotan paling bawah? JE NolY ; Ya! lompat ke NolY INC PosY ; Sorotkan ke bawah JMP Ulang ; Lompat ke ulang NolY : MOV PosY,12 ; Sorotan paling atas JMP Ulang ; Lompat ke ulang Selesai: INT 20h END TData Program 36 Delay MACRO Rep LOCAL Ulang PUSH CX MOV DX,Rep SUB CX,CX Ulang: LOOP Ulang DEC DX CMP DX,0 JNZ Ulang POP CX ENDM Ak_Page MACRO No MOV AH,5 MOV AL,No INT 10h ENDM ; Macro ini untuk menunda program ; Macro ini digunakan untuk ; mengaktifkan halaman layar ;/==================================================\; ; Program : PAGE.ASM ; ; Fungsi : Untuk mengaktifkan halaman layar tertentu ; ;\==================================================/; TData : JMP Proses Kal0 DB 'INI ADALAH HALAMAN TAMPILAN KE 2 ',13,10 DB ' DENGAN ALAMAT AWAL B800:1000h!!! $' Proses: Ak_Page 2 ; Aktifkan halaman layar yang ke 2 MOV AH,09 ; LEA DX,Kal0 ; Tulis kalimat pada halaman ke 2 INT 21h ; MOV CX,3 ; Banyaknya pengulangan Ulang: Ak_Page 2 ; Aktifkan halaman ke 2 Delay 100 Ak_Page 0 ; Aktifkan halaman ke 0 Delay 100 LOOP Ulang 78

Contoh-Contoh Program Untuk Latihan INT 20h END Tdata Program 37 ;/=====================================================================\; ; Program : MAP.ASM ; ; Fungsi : Untuk merubah bentuk karakter yang biasa digunakan. ; ; Huruf 'A', akan diubah bentuknya menjadi berbentuk pedang! ; ;\=====================================================================/; TData : JMP Proses Tabel DB 00011000b DB 00011000b DB 10011001b DB 11111111b DB 10011001b DB 00011000b DB 00011000b DB 00011000b DB 00011000b DB 00011000b DB 00011000b DB 00011000b DB 00011000b DB 00011000b DB 00011000b DB 00001000b Proses : MOV AX,1100h MOV DX,'A' MOV CX,1 MOV BL,0 MOV BH,16 LEA BP,Tabel INT 10h ; ; ; _ ; ; _ ; ; ; ; ; ; ; ; ; ; ; _ ; Servis ; Karakter ASCII awal yang akan diganti ; Banyaknya karakter yang akan diganti ; Nomor blok pemuatan karakter ; Jumlah byte perkarakter ; Lokasi tabel INT 20h END TData Program 38 ORG 100H START: JMP MULAI JUDUL DB,13,10, $ JUDUL1 DB PROGRAM SUARA,13,10, $ JUDUL2 DB TEKAN S UNTUK KELUAR,13,10, $ JUDUL3 DB,13,10, $ 79

Contoh-Contoh Program Untuk Latihan MULAI: MOV AH,0 MOV AL,3 INT 10H ; MOV AH,09H MOV BH,0 MOV BL,09H MOV CX,25 LEA DX,JUDUL INT 21H ;INT 10h service 0, mode screen ;80 huruf x 25 baris (text), berwarna MOV AH,09H MOV BH,0 MOV BL,0AH MOV CX,25 LEA DX,JUDUL1 INT 21H MOV AH,09H MOV BH,0 MOV BL,0CH MOV CX,25 LEA DX,JUDUL2 INT 21H MOV AH,09H MOV BH,0 MOV BL,0EH MOV CX,25 LEA DX,JUDUL3 INT 21H IN AL,61H OR AL,3 OUT 61H,AL MOV AL,10110110B OUT 43H,AL SUARA: MOV AX,1000000/200 OUT 42H,AL MOV AL,AH OUT 42H,AL MOV AH,06 MOV DL,0FFH INT 21H CMP AL,'S' JE KELUAR CMP AL,'s' JNE SUARA KELUAR: IN AL,61H AND AL,11111100B OUT 61H,AL INT 20H END START 80

Contoh-Contoh Program Untuk Latihan Program 39 ;========================================; ; Program menampilkan huruf alfabet ; ;========================================;.model small.code org 100h start: jmp mulai abjad db 'Tampilan Huruf Alfabet',13,10,'$' mulai: mov ah,09h mov dx,offset abjad int 21h mov cx,9 mov bl,1 mov ah,02h a: mov dl,bl add dl,30h int 21h mov dl,2eh int 21h mov dl,20h int 21h mov dh,41h mov bh,26 b: mov dl,dh int 21h mov dl,20h int 21h inc dh dec bh cmp bh,0 jnz b mov dl,0ah int 21h mov dl,0dh int 21h inc bl loop a int 20h end start Program 40.model small.code org 100h start: jmp mulai kata1 db 'Masukkan kunci anda di sini :$' kata2 db 13,10,'Bagus... Kunci anda benar!!$' mulai: mov ah,09h mov dx, offset kata1 int 21h masuk: 81

Contoh-Contoh Program Untuk Latihan mov ah,07h int 21h cmp al,'a' je lewat1 cmp al,'a' jne masuk lewat1: mov ah,07h int 21h cmp al,'k' je lewat2 cmp al,'k' jne masuk lewat2: mov ah,07h int 21h cmp al,'u' je lewat3 cmp al,'u' jne masuk lewat3: mov ah,09h mov dx,offset kata2 int 21h int 20h end start Program 41.model small.code org 100h start: jmp mulai tanya db ' Siapa Nama anda?' db 13,10,'Jawab Di sini :$' tampung db 21,?,21 dup (?) jawab db 13,10,'Bagus Nama anda adalah : $' mulai: mov ah,09h mov dx,offset tanya int 21h mov ah,0ah mov dx,offset tampung push dx int 21h mov bx,offset tampung inc bx mov dl,[bx] xor dh,dh inc bx add bx,dx mov dl,'$' mov [bx],dl mov dx,offset jawab 82

Contoh-Contoh Program Untuk Latihan mov ah,09h int 21h pop dx inc dx inc dx mov ah,09h int 21h int 20h end start Program 42.model small.code org 100h start: jmp mulai gam db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' ' db ' Tekan Sembarang Tombol Untuk Ke DOS ' db ' ' db ' ' mulai: mov ax,0b800h mov es,ax mov bx,offset gam xor di,di ulang: mov ah,1fh mov al,[bx] stosw inc bx mov al,[bx] cmp al,0 jne ulang ulang1: mov ah,12 mov al,[bx] stosw inc bx mov al,[bx] cmp al,1 jne ulang1 ulang2: mov ah,13 mov al,[bx] stosw inc bx 83

Contoh-Contoh Program Untuk Latihan sel: code mov al,[bx] cmp al,2 jne ulang2 mov ah,01h int 16h jz sel int 20h ends end start 84

KODE ASCII 7 KODE ASCII 7.1 HEXADESIMAL 7.2 DESIMAL 85