BUKU PEGANGAN KULIAH
oleh:
Agus Haryawan, S.T. Jurusan Teknik Kompu ter DIII / Semeste r IV (Dipak ai unt uk kalangan sen diri )
POLITEKNIK PRATAMA MULIA SURAKARTA 2007 Jln. Haryo Panular No. 18A Solo, Telp. (0271) 712637 email: Poltek@Poli tama.ac.id website: http//ww w.politama.a c.id
Agus Haryawan - Politama Surakarta
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
Agus Haryawan - Politama Surakarta
i
DAFTAR ISI
Bab 1 Mikroprosesor, Memori dan Register 1.1 Register
1 1
1.1.1 Pengertian Register 1.1.2 Jenis-Jenis Register 1.2 Pengetahuan Dasar Program Assembler 1.3 Konstruksi Program Assembler 1.3.1 Assembler Directive
1 1 3 3 4
1.3.2 Pembentukan Variabel dan Konstanta Secara Assembler 1.3.3 Membuat Program Dengan Bahasa Assembler (Program COM dan EXE) 1.3.4 Perbedaan Program COM dan EXE 1.3.5 Membuat program dengan Turbo Assembler dan Turbo Linker 1.3.6 Instruksi MOV 1.3.7 Instruksi INT 1.4 Memulai Program Assembler Bab 2 Mode Akses Memori, Penggunaan Variabel Dan Stack 2.1 Mode Pengalamatan atau Pengaksesan 2.1.1 Mode Pengalamatan Register dan Segera 2.1.2 Mode Pengalamatan Langsung 2.1.3 Mode Pengalamatan Tak-langsung Register 2.1.4 Mode Pengalamatan Relatif Dasar 2.1.5 Mode Pengalamatan Langsung Terindeks 2.1.6 Mode Pengalamatan Dasar Terindeks 2.1.7 Variabel Dan Penggunaannya 2.2 Larik Dan Penggunaannya 2.3 Memperoleh Alamat Suatu Variabel 2.4 Konstanta 2.5 Stack Bab 3 Instruksi 80X86
5 5 7 8 9 10 10 12 12 13 13 14 14 14 15 15 15 16 17 17 20
3.1 Instruksi Transfer Data 3.2 Instruksi Aritmetika 3.3 Instruksi Manipulasi Bit
20 23 27
3.4 Instruksi Kontrol Aliran Program 3.5 Instruksi String 3.6 Instruksi Interupsi 3.7 Instruksi Kontrol Prosesor
29 36 41 41
Agus Haryawan - Politama Surakarta
ii
Bab 4 Interupsi 4.1 Pendahuluan 4.2 Daftar Interupsi Pilihan
43 43 43
Bab 5 Procedure dan Makro 5.1 Procedure 5.1.1 Membuat Procedure 5.1.2 Menggunakan Procedure 5.2 Macro 5.2.1 Membuat Makro 5.2.2 Label Pada Makro 5.3 Macro atau Procedure
53 53 53 53 55 55 56 57
Bab 6 Contoh-Contoh Program Untuk Latihan
58
Agus Haryawan - Politama Surakarta
iii
BAB 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
Agus Haryawan - Politama Surakarta
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 + +-+--+--+-+ | AH | AL | +----+----+
+ B X + +-+--+--+-+ | BH | BL | +----+----+
+ C X + +-+--+--+-+ | CH | CL | +----+----+
+ D X + +-+--+--+-+ | 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. Register BX, biasanya digunakan untuk menunjukkan suatu alamat offset dari suatu segmen. 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) SF (Sign Flag) ZF (Zero Flag)
Jika terjadi OverFlow pada operasi aritmetika, bit ini akan bernilai 1. Jika digunakan bilangan bertanda bit ini akan bernilai 1. 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)
Digunakan untuk menunjukkan paritas bilangan. Bit ini akan bernilai 1 bila bilangan yang dihasilkan merupakan bilangan genap.
DF (Direction Flag)
Digunakan pada operasi string untuk menunjukkan arah proses.
Agus Haryawan - Politama Surakarta
2
Bab I Mikroprosesor, Memori dan Register
IF (Interrupt Enable Flag) TF (Trap Flag)
CPU akan mengabaikan interupsi yang terjadi jika bit ini 0. Digunakan terutama untuk debugging, dengan operasi step by step.
AF (Auxiliary Flag)
Digunakan oleh operasi BCD, seperti pada perintah AAA.
NT (Nested Task)
Digunakan pada prosesor 80286 dan 80386 untuk menjaga jalannya interupsi yang terjadi secara beruntun.
IOPL (I/O Protection level)
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:
Agus Haryawan - Politama Surakarta
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
TData
OpCode
Komentar
.MODEL .CODE ORG
SMALL
JMP
Proses
; Lompat ke Proses
MOV SUB MOV MOV SBB MOV
AX,13h BX,AX DX,BX AX,30H BX,AX BX,AX
; ; ; ; ;
INT TData
20h
; Kembali ke DOS
:
Proses :
END
Operand
100h
AX=13h Kurangkan BX-AX DX=BX AX=30h Kurangkan BX-AX
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. Assembler Directive yang bersifat umum tersebut, antara lain adalah
ORG 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.
Agus Haryawan - Politama Surakarta
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
Agus Haryawan - Politama Surakarta
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). ----------------------------------------------------------.MODEL SMALL .CODE 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 S M ALL
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.
Agus Haryawan - Politama Surakarta
6
Bab I Mikroprosesor, Memori dan Register
ORG 100h
Pada program COM perintah ini akan selalu digunakan. Perintah ini digunakan untuk memberitahukan assembler supaya program pada saat dijalankan(diload ke memory) ditaruh mulai pada offset ke 100h(256) byte. Dapat dikatakan juga bahwa kita menyediakan 100h byte kosong pada saat program dijalankan. 100h byte kosong ini nantinya akan ditempati oleh PSP(Program Segment Prefix) dari program tersebut. PSP ini digunakan oleh DOS untuk mengontrol jalannya program tersebut.
JMP Perintah JMP(JUMP) ini digunakan untuk melompat menuju tempat yang ditunjukkan oleh perintah JUMP. Adapun syntaxnya adalah: JUMP Tujuan
Dimana tujuannya dapat berupa label seperti yang digunakan pada bagan diatas. Mengenai perintah JUMP ini akan kita bahas lebih lanjut nantinya. Perintah JUMP yang digunakan pada bagan diatas dimaksudkan agar melewati tempat data program, karena jika tidak ada perintah JUMP ini maka data program akan ikut dieksekusi sehingga kemungkinan besar akan menyebabkan program anda menjadi Hang.
INT 20h Perintah INT adalah suatu perintah untuk menghasilkan suatu interupsi 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 :
PROGR AM CO M : -
-
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
PROGR AM EXE : Lebih panjang dari file COM
Agus Haryawan - Politama Surakarta
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
Agus Haryawan - Politama Surakarta
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:
MOV Tujuan,Asal Contoh: MOV AL,9 ; masukkan nilai 9 pada AL MOV AH,AL ; nilai AL=9 dan AH=9
Agus Haryawan - Politama Surakarta
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 .MODEL SMALL .CODE 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
Agus Haryawan - Politama Surakarta
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!
Agus Haryawan - Politama Surakarta
11
BAB II 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. 2. 3. 4. 5. 6. 7. 8.
Pengalamatan register (register addressing); Pengalamatan segera (immediate addressing); Pengalamat langsung (direct addressing); Pengalamatan tak-langsung register (register indirect addressing); Pengalamatan relatif dasar (base relative addressing); Pengalamatan langsung terindeks (direct indexed addressing); dan Pengalamatan dasar terindeks (base indexed addressing). 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 Register Segera Langsung Tak-langsung register
Relatif dasar Langsung terindeks Dasar terindeks
Format operan Register Data Pergeseran Label [BX] [BP] [DI] [SI] [BX] + pergeseran [BP] + pergeseran [DI] + pergeseran [SI] + pergeseran [BX][SI] + pergeseran
Register segmen Tidak ada Tidak ada DS DS DS SS DS DS DS SS DS DS DS
Agus Haryawan - Politama Surakarta
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 0100 -
segmen digeser ke kiri 4 bit atau l digit heksa 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
Agus Haryawan - Politama Surakarta
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] MOV DX, [BX+2]
; seperti ini, atau ; 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
Agus Haryawan - Politama Surakarta
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 Penggunaanny a 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
Agus Haryawan - Politama Surakarta
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. Anda bisa mengakses sembarang nilai elemen dalam larik menggunakan kurung siku, misalnya: 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 SU ATU VARIABEL Ada sebuah instruksi, yaitu LEA (Load Effective Address) dan operan alternatif OFFSET, yang dapat digunakan untuk memperoleh alamat offset dari suatu variabel.
Agus Haryawan - Politama Surakarta
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. Untuk memberitahukan kompiler tipe data yang digunakan, maka prefiks berikut harus digunakan: BYTE PTR WORD PTR Misalnya: BYTE PTR [BX] WORD PTR [BX]
; akses byte, atau ; akses word
Perhatikan contoh program berikut: ORG lOOh MOV AL, VARl ; nilai VARl disalin ke AL LEA BX, VARl ; ambil alamat VARl simpan di BX MOV BYTE PTR [BX],44H ; ganti isi dari VARl MOV AL, VARl ; periksa nilai VARl (ke AL) RET VARl DB 22H END Juga perhatikan pada contoh yang lainnya (tetapi fungsinya sama): ORG l00h MOV AL, VAR1 MOV BX, OFFSET VARl MOV BYTE PTR [BX], 44H MOV AL, VAR1 RET VARl DB 22H END Sekilas kedua program tersebut mendapatkan offset dari variabel VAR1.
; ; ; ;
nilai VARl disalin ke AL ambil alamat VARl simpan di BX ganti isi dari VARl periksa nilai VARl (ke AL
sama persis, tetapi ada perbedaan dalam cara
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
Agus Haryawan - Politama Surakarta
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).
Agus Haryawan - Politama Surakarta
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.
Agus Haryawan - Politama Surakarta
19
BAB 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 D ATA 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:
Agus Haryawan - Politama Surakarta
20
Bab III Instruksi 80X86
MOV MOV -
AX,ES 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.
PUS H 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.
PUS HA dan POP A 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
; ; ; ; ;
simpan simpan simpan simpan simpan stack
1 ke AX 2 ke BX 3 ke CX 4 ke DX AX,CX,DX,BX,SP,BP,SI dan DI ke
XCHG 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
; ; ; ;
simpan 1234H ke AX simpan 5678H ke BX menukar isi register AX dan BX menukar isi register AH dan BL
XL AT B
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
Agus Haryawan - Politama Surakarta
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 O UT 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.
LE A
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
; baca alamat variabel m dan simpan di register AX
RET m DW 1234h END
; 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:
S AHF dan L AHF
Instruksi SAHF digunakan untuk menyimpan isi register AH ke dalam register flag dengan cara atau ketentuan sebagai berikut: Bit AH 7 Flag [SF]
6 [ZF]
5 [0]
4 [AF]
3 [0]
2 [PF]
1 [1]
0 [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.
PUS HF 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
Agus Haryawan - Politama Surakarta
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
; ; ; ;
simpan register flag ke dalam stack semua flag di set ke l kembalikan lagi flag seperti semula
3.2 INSTRUKSI ARITMETIKA 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.
AD D dan ADC Jelas sekali, instruksi ADD ini digunakan untuk melakukan penjumlahan antara tujuan dan sumber, hasilnya disimpan ke tujuan, misalnya: MOV AL,5 ADD AL,-3 RET
; AL = 5 ; AL = 5 + (-3) = 2
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 MOV AL, 5 ADC AL, 1
; set CF = 1 ; AL = 5 ; AL=5+1+1 (dari CF) = 7
Kedua instruksi ini mempengaruhi enam macam flag: CF, PF, AF, ZF, SF dan, OF.
AAA dan D AA
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
Agus Haryawan - Politama Surakarta
23
Bab III Instruksi 80X86
INC Instruksi INC (Increment) digunakan untuk menambahkan nilai suatu operan sebesar 1 (menaikkan), misalnya: MOV AL,4 INC AL
; AL=4 ; AL=AL+1=4+1=5
SUB dan SBB Instruksi SUB (subtract) jelas digunakan untuk melakukan pengurangan dua operan, tujuan dan sumber, hasilnya disimpan di tujuan, misalnya: MOV AL,5 SUB AL,1
; AL = 5 ; 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 MOV AL,5 SBB AL,3
; set CF ; AL = 5 ; AL = 5-3-1
(dari
CF)=l
Kedua instruksi ini mempengaruhi enam macam flag: CF, PF, AF, ZF, SF, dan OF.
AAS dan D AS 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 AL = AL - 6 AH = AH - 1 AF = 1 CF = 1 selain itu: AF = 0 CF = 0 untuk semua syarat kosongkan nibel tinggi AL Perhatikan contoh berikut: MOV AX, 02FFh AAS
; AH = 02, AL = 0FFh ; 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 DEC AL
; AL = 4 ; AL=AL-1=4-1=3
NEG Instruksi NEG atau negatedigunakan untuk membuat negatif suatu operan (diubah ke
Agus Haryawan - Politama Surakarta
24
Bab III Instruksi 80X86
format 2's complement), caranya semua bit di-inversi-kan kemudian dijumlah dengan 1. Misalnya: MOV AL,5 NEG AL NEG AL
; AL = 05H ; AL = 0FBH (-5) ; AL = 05H (5)
C MP 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 MOV IMUL MOV MUL
AL,-2 BL,-4 BL AL,-2 BL
; ; ; ; ;
AL akan berisi FEH (artinya -2) BL akan berisi FCH (artinya -4) AX akan berisi 0008H (-2 x -4 = 8) kembalikan lagi 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
DIV Instruksi
DIV
digunakan
; AL=OFH ; AH=01, AL=05
untuk
melakukan
pembagian
bilangan
Agus Haryawan - Politama Surakarta
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
ID IV 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 MOV BL,4 IDIV BL
; AX berisi FF35H (2's comp) ; 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 AAD
; AH=01, AL=05 ; 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 AH = 255 (FFh) selain itu: AH = 0 Perhatikan contoh berikut: MOV AX,0 MOV AL,-5 CBW
; AH = 0 dan AL = 0 ; AX = 00FBh (251) ; 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.
Agus Haryawan - Politama Surakarta
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 0 1 1
AND AND AND AND
0=0 1=0 0=0 1=1
Perhatikan contoh berikut: MOV AL,‘a’ AND AL,11011111B
; AL=01100001b ; AL=01000001b (=’A’)
OR Instruksi ini digunakan untuk melakukan operasi logika OR antar bit pada dua operan,
hasilnya disimpan pada operan tujuan, algoritma atau aturannya: 0 0 1 1
OR 0=0 OR 1=1 OR 0=1 OR 1=1 Perhatikan contoh berikut: MOV AL,’A’ OR AL,00100000b
; AL=01000001b ; AL=01100001b (=’a’)
XOR Instruksi ini digunakan untuk melakukan operasi logika XOR antar bit pada dua operan, hasilnya disimpan pada operan tujuan, algoritma atau aturannya: 0 0 1 1
XOR XOR XOR XOR
0 1 0 1
= = = =
0 1 1 0
Perhatikan contoh berikut: MOV AL,00000111B XOR AL,00000010B
; AL=00000101b
NOT
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
Agus Haryawan - Politama Surakarta
27
Bab III Instruksi 80X86
T EST 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
; ZF=0 (hasil AND=00000001b) ; ZF=l (hasil AND=00000000b)
S AL dan S HL
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
S AR dan S HR
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
Agus Haryawan - Politama Surakarta
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 AL IRAN 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.
C ALL 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: ORG 100h CALL pl ADD AX, l pl PROC MOV AX, 1234h RET pl ENDP END
; deklarasi prosedur ; kembali dari yg memanggil
JMP 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: ORG 100h MOV AL,5 JMP labell PRINT 'Tidak lompat!' MOV AL, 0 labell: PRINT 'Sampai disini! RET END
; lompat! 2 baris!
Agus Haryawan - Politama Surakarta
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.
J A atau J NBE 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: ORG 100h 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.
J AE 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: ORG 100h 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
Agus Haryawan - Politama Surakarta
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: ORG 100h 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: ORG 100h 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: ORG 100h 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.
Agus Haryawan - Politama Surakarta
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: ORG 100h 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: ORG 100h 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). ORG 100h MOV AL,5 CMP AL,-5 JG labell ; bisa diganti dengan JNLE PRINT ‘AL tidak lebih besar dari -5.’ JMP exit
Agus Haryawan - Politama Surakarta
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: ORG 100h MOV AL,2 CMP AL, -5 JGE labell PRINT ‘AL<-5’ JMP exit labell: PRINT ‘AL >= -5’ exit: RET END
; bisa diganti JNL
JL atau JNGE 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: ORG 100h MOV AL,-2 CMP AL,5 JNGE labell PRINT ‘AL >= 5.’ JMP exit labell: PRINT ‘AL < 5.’ exit: RET END
; bisa diganti JNGE
JLE atau JNG 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: ORG 100h
Agus Haryawan - Politama Surakarta
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: ORG 100h MOV AL,2 ADD AL,3 JNC labell PRINT ‘ada carry.’ JMP exit labell: PRINT ‘tak ada carry.’ exit RET END
; coba diganti dengan 253.. .
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: ORG 100h MOV AL,00000111b OR AL,0 JNZ labell PRINT ‘nol.’ JMP exit Label1: PRINT ‘bukan nol.’ exit: RET END
; ; ; ;
AL = bisa bisa bisa
7 diganti CMP AL, 0 diganti JNE labell diganti PRINT ‘AL =0’
; bisa diganti PRINT *AL <> 0'
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.
Agus Haryawan - Politama Surakarta
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: ORG 100h 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: ORG 100h 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: ORG 100h MOV AX,0
Agus Haryawan - Politama Surakarta
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: ORG 100h 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
Agus Haryawan - Politama Surakarta
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.
ST D
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:
Agus Haryawan - Politama Surakarta
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).
C MPSB dan C MPSW
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:
Agus Haryawan - Politama Surakarta
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).
SC ASB dan SC ASW
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:
Agus Haryawan - Politama Surakarta
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: ORG 100h 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).
ST OSB dan ST OSW
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:
Agus Haryawan - Politama Surakarta
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 PR OSESOR 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 ST C 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.
C MC
Instruksi CMC (Complement Carry Flag) digunakan untuk melakukan negasi (menginversi) CF, jika CF sebelumnya 1, maka akan menjadi 0 demikian juga sebaliknya.
CLD dan ST D
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.
Agus Haryawan - Politama Surakarta
41
Bab III Instruksi 80X86
CLI dan ST I
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.
Agus Haryawan - Politama Surakarta
42
BAB 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 PIL IHAN
INT ERR UPT 05h
Prin t Screen Fungsi : Mencetak seluruh isi layar ke printer. Register Input : Tidak Ada. Register Output : Tidak Ada.
INT ERR UPT 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
Agus Haryawan - Politama Surakarta
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.
INT ERR UPT 10h - Service 00h
Set Vid eo Mod e 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.
INT ERR UPT 10h - Service 02h
Set Cu rsor P osition 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.
INT ERR UPT 10h - Service 03h
Cu rso r In fo rmati on 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.
INT ERR UPT 10h - Service 05h
Sel ect Acti ve Pag e Fungsi : Merubah halaman tampilan aktif. Register Input : AH = 05h AL = nomor halaman tampilan Register Output : Tidak Ada.
INT ERR UPT 10h - Service 06h
Scroll Up Wi ndow 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.
Agus Haryawan - Politama Surakarta
44
Bab IV Interupsi Penjelasan : AL diisi 00 akan mengosongkan keseluruhan jendela.
INT ERR UPT 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.
INT ERR UPT 10h - Service 09h
Wri te Ch aracter And Attribu te At Cu rso r Posi tio n 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.
INT ERR UPT 10h - Service 0Ah
Wri te Ch aracter At Cu rso r Po si tion 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.
INT ERR UPT 10h - Service 0Eh
T el etyp e O utput 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.
INT ERR UPT 10h - Service 0Fh
G et Cu rren t Vid eo Mod e Fungsi : Mendapatkan mode video aktif. Register Input :
Agus Haryawan - Politama Surakarta
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
INT ERR UPT 10h - Service 11h,Subservice 00h
Lo ad User Specifi c Ch aracter 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
INT ERR UPT 10h - Service 13h
Wri te 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.
INT ERR UPT 16h - Service 00h
G et Keystro ke 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
INT ERR UPT 16h - Service 01h
Ch eck Keystro ke 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
Agus Haryawan - Politama Surakarta
46
Bab IV Interupsi Jika AL<>0 maka AL = Kode ASCII AH = Kode Scan ZF=1 bila buffer kosong
INT ERR UPT 16h - Service 10h
G et Enh an ced Keystro ke Fungsi : Menunggu masukan keyboard. Terdapat pada : Mesin AT dengan keyboard Enhanced. Register Input : AH = 10h Register Output : AH = kode scan AL = kode ASCII
INT ERR UPT 16h - Service 11h
Ch eck Enh an ced Keystro ke 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
INT ERR UPT 19h
Boo tstrap Lo ad er Fungsi : Melakukan Warm Boot. Register Input : Tidak Ada. Register Output : Tidak Ada.
INT ERR UPT 1Bh
Con trol Break Han dl er Fungsi : Interupsi ini terjadi setiap kali terjadi penekanan tombol Ctrl+Break. Register Input : Tidak Ada. Register Output : Tidak Ada.
INT ERR UPT 1Ch
T imer T ick 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.
INT ERR UPT 21h - Service 01h
Read Ch aracter Wi th 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 :
Agus Haryawan - Politama Surakarta
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.
INT ERR UPT 21h - Service 02h
Wri te Ch aracter T o Stand ard Output Fungsi : Untuk mencetak satu buah karakter pada layar. Register Input : AH = 02h DL = Kode ASCII Register Output : Tidak ada
INT ERR UPT 21h - Service 07h
Di rect Ch aracter Inpu t Withou t 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
INT ERR UPT 21h - Service 08h
Ch aracter Inpu t Withou t 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
INT ERR UPT 21h - Service 09h
Wri te String T o Stan dard Ou tpu t Fungsi : Untuk mencetak string ke layar. Register Input : AH = 09h DS:DX = String yang diakhiri dengan tanda "$". Register Output : Tidak ada
INT ERR UPT 21h - Service 0Ah In put Str ing
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
INT ERR UPT 21h - Service 0Bh
G et Statu s
Agus Haryawan - Politama Surakarta
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
INT ERR UPT 21h - Service 14h
Sequ en ti al Read F ro m F CB Fil e Fungsi : Untuk membaca file secara sekuensial. Register Input : AH = 14h DS:DX = FCB Register Output : AL = status
INT ERR UPT 21h - Service 25h
Set In terrupt Vekto r 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
INT ERR UPT 21h - Service 2Fh
G et DT A Add ress Fungsi : Untuk mengetahui alamat dari DTA yang digunakan. Register Input : AH = 2Fh Register Output : ES:BX = Lokasi DTA
INT ERR UPT 21h - Service 31h
T ermin ate And Stay Resid en Fungsi : Untuk meresidenkan suatu program. Register Input : AH = 31h AL = Kode return DX = Besar memory dalam paragraph Register Output :
INT ERR UPT 21h - Service 33h
Extend ed Break Ch ecking 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
Agus Haryawan - Politama Surakarta
49
Bab IV Interupsi
INT ERR UPT 21h - Service 35h
G et I nterrup t 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
INT ERR UPT 21h - Service 3Ch
Create Fil e Handl e 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
INT ERR UPT 21h - Service 3Dh
Op en Existi ng F il e 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
INT ERR UPT 21h - Service 3Eh
Clo se Fil e Handl e 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
INT ERR UPT 21h - Service 3Fh
Read F rom Fi le O r Devi ce Usi ng F il e Hand le Fungsi : Untuk membaca data dari suatu file atau device. Register Input : AH = 3Fh BX = Nomor file handle CX = Banyaknya byte yang akan dibaca
Agus Haryawan - Politama Surakarta
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
INT ERR UPT 21h - Service 40h
Wri te T o Fi l e O r Devi ce Using Fil e Han dl e 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
INT ERR UPT 21h - Service 41h
Del ete Fi l e Using Fi l e Handl e 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
INT ERR UPT 21h - Service 42h
Set Cu rren t Fil e Po si ti on 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
INT ERR UPT 21h - Service 43h
Set An d G et Fi l e Atribu t 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
Agus Haryawan - Politama Surakarta
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
INT ERR UPT 21h - Service 4Ch
T ermin ate With Retu rn Cod e 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
INT ERR UPT 21h - Service 56h
Ren ame Fi l e 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
INT ERR UPT 27h
T ermin ate And Stay Resid en Fungsi : Untuk meresidenkan program. Register Input : DS:DX = Batas alamat residen Register Output :
Agus Haryawan - Politama Surakarta
52
BAB 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 ;
Agus Haryawan - Politama Surakarta
53
Bab V Procedure dan Makro
; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ; ;================================================; .MODEL SMALL .CODE ORG 100h Proses :
CALL Cetak_Kar INT 20h
Cetak_Kar PROC NEAR MOV AH,02h MOV DL,'S' INT 21h RET Cetak_Kar ENDP END
; Panggil Cetak_Kar
; Cetak karakter ; Kembali kepada si pemanggil ; END Procedures
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 ; ; ; ;================================================; .MODEL SMALL .CODE ORG 100h TData
:
JMP Kar Klm
Proses DB ? DB 'BATMAN SI MANUSIA KELELAWAR ' ; 28 Karakter
Proses :
MOV XOR
CX,28 BX,BX
; Banyaknya pengulangan ; Addressing Mode
MOV MOV CALL INC LOOP
DL,Klm[BX] Kar,DL Cetak_Kar BX Ulang
; Panggil Cetak_Kar
INT
20h
Ulang
:
Cetak_Kar PROC PUSH PUSH
NEAR AX DX
; Simpan semua register ; Yang digunakan
Agus Haryawan - Politama Surakarta
54
Bab V Procedure dan Makro
MOV MOV INT POP POP RET Cetak_Kar ENDP END
AH,02h DL,Kar 21h DX AX
; Cetak karakter ; ; ; ;
Kembalikan semua register Yang disimpan Kembali kepada si pemanggil END Procedures
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 LOOP Ulang
ENDM
; Cetak Karakter ; End Macro
Agus Haryawan - Politama Surakarta
55
Bab V Procedure dan Makro
;----------------------------------------------------------------; ; Program : MAC1.ASM ; ; Fungsi : Menggunakan Macro untuk mencetak huruf 'SSS' ; ;----------------------------------------------------------------; .MODEL SMALL .CODE ORG 100h Proses: Cetak_Kar 'S' INT END
; Cetak Huruf S
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 LOCAL MOV MOV MOV Ulang: INT LOOP
ENDM
Kar Ulang CX,3 AH,02 DL,Kar 21h Ulang
; Label 'Ulang' jadikan Local
; Cetak Karakter ; End Macro
;--------------------------------------------------------------------; ; Program : MAC2.ASM ; ; Fungsi : Menggunakan Macro untuk mencetak huruf 'PPPCCC' ;
Agus Haryawan - Politama Surakarta
56
Bab V Procedure dan Makro
;--------------------------------------------------------------------; .MODEL SMALL .CODE ORG 100h Proses: Cetak_Kar 'P' Cetak_Kar 'C' INT END
; Cetak Huruf P ; Cetak Huruf C
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.
Agus Haryawan - Politama Surakarta
57
6
CONTOH-CONTOH PROGRAM UNTUK LATIHAN
Program 1
;===============================================; ; FUNGSI : MENCETAK KARATER 'A' DENGAN INT 21 ; ;===============================================; .MODEL SMALL .CODE ORG 100h Proses : MOV AH,02h MOV DL,'A' INT 21h INT 20h END Proses
; Nilai servis ntuk mencetak karakter ; DL = Karakter ASCII yang akan dicetak ; Cetak karakter !! ; Selesai ! kembali ke DOS
Program 2
;=================================================================; ; PROGRAM: A1.ASM ; ; FUNGSI : MENCETAK KARATER 'A' BESERTA ATRIBUTNYA DENGAN INT 10h ; ;=================================================================; .MODEL SMALL .CODE ORG 100h Proses : MOV AH,09h MOV AL,'A' MOV BH,00h MOV BL,93h MOV CX,03h INT 10h INT 20h END Proses
; ; ; ; ; ;
Nilai servis untuk mencetak karakter AL = Karakter yang akan dicetak Nomor Halaman layar Warna atau atribut dari karakter Banyaknya karakter yang ingin dicetak Laksanakan !!!
; Selesai ! kembali ke DOS
Program 3
;==============================================================; ; PROGRAM : ABC0.ASM ; ; FUNGSI : MENCETAK 16 BUAH KARAKTER DENGAN INT 21h SERVIS 02 ; ;==============================================================; .MODEL SMALL .CODE ORG 100h Proses : MOV AH,02h MOV DL,'A' MOV CX,10h Ulang : INT 21h INC DL LOOP Ulang
; Nilai servis ; DL=karakter 'A' atau DL=41h ; Banyaknya pengulangan yang akan ; Cetak karakter !! ; Tambah DL dengan 1 ; Lompat ke Ulang
Agus Haryawan - Politama Surakarta
58
Contoh-Contoh Program Untuk Latihan
INT 20h END Proses
Program 4
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : TAMBAH.ASM ; ; FUNGSI : MELIHAT PENAMBAHAN YANG DILAKUKAN OLEH BERBAGAI PERINTAH ; ;====================================================================; .MODEL SMALL .CODE ORG 100h Proses : MOV AH,15h MOV AL,4 ADD AH,AL
; AH:=15h ; AL:=4 ; AH:=AH+AL, jadi AH=19h
MOV AX,1234h MOV BX,0F221h ADD AX,BX
; NIlai AX:=1234h dan carry=0 ; Nilai BX:=F221h dan carry=0 ; AX:=AX+BX, jadi nilai AX=0455h
MOV MOV MOV MOV ADD ADC
; ; ; ; ; ;
AX,1234h BX,9ABCh CX,5678h DX,0DEF0h CX,DX AX,BX
INC AL
AX BX BX DX CX AX
= = = = = =
1234h CF 9ABCh CF 5678h CF DEF0h CF 3568h CF AX+BX+CF
= = = = = =
0 0 0 0 1 ACF1
; AL:=AL+1, nilai pada AL ditambah 1
INT 20h END Proses
Program 5
;===============================================; ; PROGRAM : KURANG.ASM ; ; FUNGSI : MENGURANGKAN ANGKA 122EFFF-0FEFFFF ; ;===============================================; .MODEL SMALL .CODE ORG 100h 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
Agus Haryawan - Politama Surakarta
59
Contoh-Contoh Program Untuk Latihan
MOV HslHi,AX INT 20h END TData
; HslHi bernilai 0023 ; Kembali ke DOS
Program 6
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : CBA0.ASM ; ; FUNGSI : MENCETAK KARAKTER "Z".."A" DENGAN INT 21h SERVIS 02 ; ;=================================================================; .MODEL SMALL .CODE ORG 100h Proses : MOV AH,02h MOV DL,'Z' MOV CX,26 Ulang: INT 21h DEC DL LOOP Ulang
; ; ; ;
Nilai servis DL=5Ah Banyaknya pengulangan yang akan dilakukan
; Cetak karakter !! ; Kurang DL dengan 1 ; Lompat ke Ulang
INT 20h END Proses
Program 7
;========================================================; ; PROGRAM : KALI.ASM ; ; FUNGSI : MENGALIKAN BILANGAN 16 BIT, HASIL PADA DX:AX ; ;========================================================; .MODEL SMALL .CODE ORG 100h 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 ; ;====================================================;
Agus Haryawan - Politama Surakarta
60
Contoh-Contoh Program Untuk Latihan
.MODEL SMALL .CODE ORG 100h 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 ; ;==================================================; .MODEL SMALL .CODE ORG 100h 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 ; ;============================================; .MODEL SMALL .CODE ORG 100h 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 ;
Agus Haryawan - Politama Surakarta
61
Contoh-Contoh Program Untuk Latihan
; FUNGSI : MEMINDAHKAN DATA ANTAR TIPE DATA YANG BERBEDA !!! ; ;=============================================================; .MODEL SMALL .CODE ORG 100h 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 ; ;=======================================================; .MODEL SMALL .CODE ORG 100h 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 ; ;\================================/; .MODEL SMALL .386 .CODE ORG 100h Proses :
; Untuk prosesor 80386
Agus Haryawan - Politama Surakarta
62
Contoh-Contoh Program Untuk Latihan
MOV MOV MOV MUL
EAX,12345678h EDX,33112244h EBX,EDX EBX
; ; ; ;
Immediate Addressing Immediate Addressing Register Addressing Register Addressing
END Proses
Program 14
;/================================================\; ; PROGRAM : RID.ASM ; ; FUNGSI : MENGAKSES DATA MELALUI ALAMAT EFEKTIVE ; ;\================================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal DB 'ABCDEF' Proses: LEA BX,Kal MOV CX,2 Ulang: MOV DL,[BX] MOV AH,02h INT 21h ADD BX,2 LOOP Ulang
; Ambil Offset Kal ; ; ; ; ;
kode ASCII yang ingin dicetak Nilai servis ntuk mencetak karakter Laksanakan !! BX:=BX+2 Lompat ke Ulang
INT 20h END TData
Program 15
;/========================================================\; ; PROGRAM : BRA0.ASM ; ; FUNGSI : MENGAKSES DATA DENGAN BASE RELATIVE ADDRESSING ; ;\========================================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Tabel DW 11h,50h,0Ah,14h,5Ah Proses: LEA BX,Tabel MOV AX,Tabel ADD ADD ADD ADD
AX,[BX]+2 AX,[BX]+4 AX,[BX+6] AX,[BX+8]
INT 20h END TData
Agus Haryawan - Politama Surakarta
63
Contoh-Contoh Program Untuk Latihan
Program 16
;/==========================================================\; ; PROGRAM : BRA1.ASM ; ; FUNGSI : MENCETAK KALIMAT DENGAN BASE RELATIVE ADDRESSING ; ;\==========================================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kalimat DB 'NYAMUK GORENG' Proses: XOR BX,BX MOV CX,13 Ulang : MOV DL,Kalimat[BX] MOV AH,02 INT 21h INC BX LOOP Ulang INT 20h END TData
; 13 karakter ; BX=0 Untuk penunjuk Offset ; Counter LOOP ; ; ; ; ;
Ambil karakter yang ke BX Servis untuk cetak karakter Cetak Karakter BX:=BX+1 Lompat ke Ulang sampai CX=0
; Selesai, kembali ke DOS !!
Program 17
;/=====================================\; ; PROGRAM : VRBIOS.ASM ; ; FUNGSI : MELIHAT VERSI BIOS KOMPUTER ; ;\=====================================/; .MODEL SMALL .CODE ORG 100h Proses : MOV AX,0F000h MOV ES,AX MOV BX,0FFF5h XOR SI,SI MOV CX,8 Ulang: MOV DL,ES:[BX][SI] MOV AH,02h INT 21h INC SI LOOP Ulang INT 20h END Proses
; ; ; ; ;
Masukkan nilai F000 pada AX Copykan nilai AX ke ES Penunjuk Offset Jadikan SI=0 Counter untuk LOOP
; ; ; ; ;
Ambil isi alamat ES:BX+SI Nilai servis mencetak karakter Cetak !! SI:=SI+1 Lompat ke Ulang sampai CX=0
; Selesai ! kembali ke DOS
Program 18
;/=======================================================\; ; PROGRAM : BIA.ASM ; ; FUNGSI : MENGAKSES ARRAY DENGAN BASE INDEXED ADDRESSING ; ;\=======================================================/;
Agus Haryawan - Politama Surakarta
64
Contoh-Contoh Program Untuk Latihan
.MODEL SMALL .CODE ORG 100h TData : JMP Proses Mahasiswa STRUC Nim DW 0 ; 2 byte Tinggi DB 0 ; 1 byte Nilai DB 0,0,0,0 ; 4 byte Mahasiswa ENDS Absen Mahasiswa 10 DUP (<>) Proses: LEA BX,Absen ADD BX,21 XOR SI,SI MOV MOV MOV MOV MOV MOV
[BX][SI].Nim ,0099h [BX][SI].Tinggi ,10h [BX][SI+1].Nilai,78h [BX][SI+2].Nilai,99h [BX][SI+3].Nilai,50h [BX][SI+4].Nilai,83h
INT 20h END TData
; BX Menunjuk Offset Absen ; BX Menunjuk pada Record ke 4 ; SI=0 ; ; ; ; ; ;
NIM, record ke 4 Tinggi, record ke 4 Nilai pertama Nilai kedua Nilai keempat Nilai kelima
; Selesai !!
Program 19
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Program: kal0.asm ; ; Fungsi : Mencetak String dengan Int 21 servis 9 ; ;=================================================; .MODEL SMALL .CODE ORG 100h 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 INT 21h
; Ambil Alamat Offset Kal0 ; Cetak perkarakter sampai tanda $
LEA DX,Kal0+7 INT 21h
; Ambil Alamat Offset KAl0+7 ; Cetak perkarakter sampai tanda $
LEA DX,KAL1 INT 21h
; Ambil Offset kal1 ; Cetak perkarakter sampai ketemu $
INT 20h END Tdata
; Selesai, kembali ke DOS
Agus Haryawan - Politama Surakarta
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
; ; ES:BP = Alamat awal string ; ;\=============================================/; .MODEL SMALL .CODE ORG 100h 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 ; ;\===============================================================/; .MODEL SMALL .CODE ORG 100h TData: JMP Proses BilA DB 67 BilB DB 66 Kal0 DB 'Bilangan A lebih kecil dari bilangan B $' Kal1 DB 'Bilangan A sama dengan bilangan B $' Kal2 DB 'Bilangan A lebih besar dari bilangan B $' Proses: MOV AL,BilA ; Masukkan bilangan A pada AL CMP AL,BilB ; Bandingkan AL(BilA) dengan Bilangan B JB AKecil ; Jika BilA < BilB, lompat ke AKecil JE Sama ; Jika BilA = BilB, lompat ke Sama
Agus Haryawan - Politama Surakarta
66
Contoh-Contoh Program Untuk Latihan
JA ABesar Akecil: LEA DX,Kal0 JMP Cetak Sama: LEA DX,Kal1 JMP Cetak ABesar: LEA DX,Kal2 Cetak: MOV AH,09 INT 21h
; Jika BilA > BilB, lompat ke ABesar
EXIT: INT 20h END TData
; Kembali ke DOS.
; Ambil offset Kal0 ; Lompat ke cetak ; Ambil offset Kal1 ; Lompat ke cetak ; Ambil offset Kal2 ; Servis untuk mencetak kalimat ; Cetak kalimat !!
Program 22
;/======================================================================\; ; Program : JMPL.ASM ; ; Fungsi : Mencetak kalimat secara perkarakter sampai ditemui karakter '*' ;\======================================================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal DB ' Lucky Luck menembak ',13,10 DB 'Lebih cepat dari bayangannya !! ',7,7,'*' Proses: XOR BX,BX ; BX=0 MOV AH,02h ; Servis Untuk Cetak Karakter Ulang: CMP Kal[BX],'*' ; Bandingkan dengan '*' JE Exit ; Jika Sama Lompat ke Exit MOV DL,Kal[BX] ; Masukkan karakter ke BX menuju DL INT 21h ; Cetak karakter INC BX ; Tambah 1 pada BX JMP Ulang ; Lompat Ke Ulang Exit : INT 20h END TData
; Selesai ! kembali ke DOS
Program 23
;/======================================================================\; ; Program : NSTACK.ASM ; ; Fungsi : Mencetak kalimat 2 kali dengan operasi yang mirip dengan stack; ;\======================================================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal DB 'LANG LING LUNG $' Ganti DB 13,10,'$'
Agus Haryawan - Politama Surakarta
67
Contoh-Contoh Program Untuk Latihan
Stacks DW ? Proses: LEA DX,Kal MOV Stacks,DX MOV INT LEA INT
AH,09 21h DX,Ganti 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 ; ;\=====================================================================/; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal DB 'LANG LING LUNG $' Ganti DB 13,10,'$' Stacks DW ? Proses: LEA DX,Kal PUSH DX MOV INT LEA INT
AH,09 21h DX,Ganti 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 ; ; ;
Agus Haryawan - Politama Surakarta
68
Contoh-Contoh Program Untuk Latihan
; Jika Tombol khusus, maka ; ; AL = 00 ; ; AH = Extended ; ;\===========================================/; .MODEL SMALL .CODE ORG 100h 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 JE Extended ASCII: LEA DX,T_ASCII MOV AH,09 INT 21h
; Apakah ini karakter extended ? ; Ya !, Lompat ke Extended
POP MOV MOV INT
AX DL,AL AH,2 21h
; ; ; ;
Ambil kembali nilai AX pada stack Ambil kode ASCII yang ditekan Servis cetak karakter Cetak karakter !
CMP AL,'Q' JE exit CMP AL,'q' JE exit JMP Proses Extended: LEA DX,T_Extended MOV AH,09 INT 21h JMP Proses
; ; ; ; ;
Apakah yang ditekan huruf 'Q' ? Ya !, lompat ke Exit Apakah yang ditekan huruf 'q' ? Ya !, lompat ke Exit Lompat ke Proses
; ; ; ;
Ambil alamat efektif T_Extended Servis cetak kalimat Cetak kalimat ! Lompat ke Proses
exit: INT 20h END TData
; Kembali ke DOS !
; Ambil alamat efektif T_ASCII ; Servis cetak kalimat ; Cetak kalimat !
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 ;
Agus Haryawan - Politama Surakarta
69
Contoh-Contoh Program Untuk Latihan
;\===============================================/; .MODEL SMALL .CODE ORG 100h 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 END TData
; Kembali ke DOS !
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 ; ;\=========================================================/; .MODEL SMALL .CODE ORG 100h 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 LEA DX,Buffer INT 21h
; Servis Input kalimat ; DX menunjuk pada offset Buffer ; 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?
Agus Haryawan - Politama Surakarta
70
Contoh-Contoh Program Untuk Latihan
JE EXIT
; Ya! Lompat ke Exit
MOV DL,[BX] MOV AH,02 INT 21h
; Masukkan karakter pada DL ; Servis cetak karakter ; Cetak karakter
INC BX JMP Ulang
; BX := BX+1 ; Lompat ke Ulang
EXIT: INT 20h END TData
; Kembali ke DOS !
Program 28
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; PROGRAM : PROC_KAR.ASM ; ; FUNGSI : MENCETAK KARATER DENGAN PROCEDURE ; ;=============================================; .MODEL SMALL .CODE ORG 100h 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 ; ;============================================; .MODEL SMALL .CODE ORG 100h TData : JMP Proses Kar DB ? Klm DB 'BATMAN SI MANUSIA KELELAWAR ' Proses : MOV CX,28 XOR BX,BX Ulang : MOV DL,Klm[BX] MOV Kar,DL CALL Cetak_Kar INC BX LOOP Ulang
; 28 Karakter
; Banyaknya pengulangan ; Addressing Mode
; Panggil Cetak_Kar
Agus Haryawan - Politama Surakarta
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' ; ;-------------------------------------------------------; .MODEL SMALL .CODE ORG 100h 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' ; ;----------------------------------------------------------;
Agus Haryawan - Politama Surakarta
72
Contoh-Contoh Program Untuk Latihan
.MODEL SMALL .CODE ORG 100h 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
; ES Menunjuk pada segment layar
MOV MOV MUL MOV
AH,Y AL,160 AH BX,AX
; Hitung offset baris ; Simpan hasilnya pada BX
MOV MOV MUL ADD
AH,X AL,2 AH BX,AX
; Hitung offset kolom ; Tambahkan hasilnya pada BX
MOV AL,Kar MOV AH,Attr MOV ES:[BX],AL MOV ES:[BX+1],AH ENDM
; ; ; ;
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 ; ;\========================================================/; .MODEL SMALL .CODE ORG 100h Proses : Tulis_Kar 40 12 'S' 95 INT 20h END Proses
; Tulis karakter 'S' dengan ; no atribut 95 pada posisi ; kolom 40 dan baris 12
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
Agus Haryawan - Politama Surakarta
73
Contoh-Contoh Program Untuk Latihan
PUSH BX PUSH CX XOR MOV SUB MOV Loop2: MOV MOV Hilang: MOV
CX,CX AL,26 AL,PosY CL,AL
; Simpan semua register yang digunakan
; CX=banyaknya pergeseran kebawah
AL,BYTE PTR ES:[BX] ; AL=Karakter pada layar BYTE PTR ES:[BX+160],AL ; Geser ke bawah BYTE PTR ES:[BX],' '
ADD BX,160 LOOP Loop2
; ; ; ; ; ;
POP CX POP BX POP AX
; Kembalikan semua register yang digunakan
Delay
Hapus karakter sebelumnya delay, supaya bisa terlihat Menuju baris selanjutnya Ulangi ke Loop2
ENDM ;/===================================================\; ; Program : RONTOK.ASM ; ; Fungsi : Membersihkan layar dengan cara ; ; merontokkan hurufnya satu persatu ; ;\====================================================/ .MODEL SMALL .CODE ORG 100h TData : JMP Proses PosY DB ? Proses: MOV AX,0B800h MOV ES,AX MOV BX,3998 MOV CX,25 UlangY : MOV PosY,CL PUSH CX MOV CX,80 UlangX : CMP BYTE PTR ES:[BX],33 JB Tdk Geser PosY Tdk : SUB BX,2 LOOP UlangX POP CX LOOP UlangY EXIT: INT 20h
; ES mencatat segment layar ; Posisi karakter 80,25 ; Banyaknya pengulangan baris ; PosY mencatat posisi baris ; CX mencatat posisi Y ; Banyaknya pengulangan Kolom ; ; ; ;
Apakah ada karakter pada layar ? Lompat ke Tdk, jika tidak ada Geser karakter tersebut ke bawah
; ; ; ;
BX menunjuk karakter selanjutnya Proses 80 kali untuk kolom Ambil posisi Y Ulangi dan ganti baris ke atas
Agus Haryawan - Politama Surakarta
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 ; ;\===============================================/; .MODEL SMALL .CODE ORG 100h 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
; Servis untuk menggulung ke atas ; Servis untuk menggulung ke bawah
Program 35
Cls MACRO MOV AX,0600h XOR CX,CX MOV DX,184Fh MOV BH,10 INT 10h ENDM
; Macro untuk menghapus layar
GotoXY MACRO X,Y MOV AH,02 XOR BX,BX
; Macro untuk memindahkan kursor
; Atribut Hijau diatas hitam
Agus Haryawan - Politama Surakarta
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
; Macro untuk menyimpan seluruh ; isi layar monitor
BalikL MACRO LOCAL Ulang MOV CX,4000 XOR BX,BX Ulang: MOV AL,Layar[BX] MOV ES:[BX],AL INC BX LOOP Ulang ENDM
; Macro untuk mengembalikan semua ; isi layar yang telah disimpan
Sorot MACRO X,Y LOCAL Ulang
; Macro untuk membuat sorotan ; pada menu
MOV MOV MUL MOV
BL,Y AL,160 BL BX,AX
MOV MOV MUL ADD INC
AL,X AH,2 AH BX,AX BX
MOV CX,25 Ulang: MOV BYTE PTR ES:[BX],4Fh
; Alamat warna pada posisi X,Y ; Panjangnya sorotan ; Atribut sorotan ; putih diatas merah
ADD BX,2 LOOP Ulang ENDM Readkey MACRO MOV AH,00 INT 16h ENDM
; Macro untuk membaca masukan dari ; keyboard. ; hasilnya AH=Extended, AL=ASCII
MenuL MACRO String MOV AH,09
; Macro untuk mencetak menu
Agus Haryawan - Politama Surakarta
76
Contoh-Contoh Program Untuk Latihan
LEA DX,String INT 21h ENDM ;/===================================================\; ; Program : SOROT.ASM ; ; Fungsi : Membuat menu sorot untuk digunakan program ; ;\===================================================/; .MODEL SMALL .CODE ORG 100h 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 GotoXY 0 8 MenuL Menu SimpanL Ulang : BalikL Sorot PosX,PosY Masukan: Readkey CMP AH,Panah_Bawah JE Bawah
; ; ; ;
Hapus layar kursor = 0,8 Gambar menu Simpan isi layar
; Tampilkan isi layar yang ; disimpan ; Sorot posisi X,Y ; Baca masukan dari keyboard ; Panah bawah yang ditekan ? ; Ya! lompat bawah
CMP AH,Panah_Atas JE CekY
; Panah atas yang ditekan ? ; Ya, lompat CekY
CMP AL,TEnter JNE Masukan JMP Selesai CekY : CMP PosY,12 JE MaxY DEC PosY JMP Ulang MaxY : MOV PosY,15
; Tombol enter yang ditekan ? ; Bukan, lompat ke ulangi ; Ya, lompat ke selesai ; ; ; ;
Apakah sorotan paling atas ? Ya! lompat ke MaxY Sorotkan ke atas Lompat ke ulang
; PosY=Sorotan paling bawah
Agus Haryawan - Politama Surakarta
77
Contoh-Contoh Program Untuk Latihan
JMP Ulang Bawah : CMP PosY,15 JE NolY INC PosY JMP Ulang NolY : MOV PosY,12 JMP Ulang Selesai: INT 20h END TData
; lompat ke ulang ; ; ; ;
apakah sorotan paling bawah ? Ya! lompat ke NolY Sorotkan ke bawah Lompat ke ulang
; Sorotan paling atas ; Lompat ke ulang
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
; Macro ini untuk menunda program
Ak_Page MACRO No MOV AH,5 MOV AL,No INT 10h ENDM
; Macro ini digunakan untuk ; mengaktifkan halaman layar
;/==================================================\; ; Program : PAGE.ASM ; ; Fungsi : Untuk mengaktifkan halaman layar tertentu ; ;\==================================================/; .MODEL SMALL .CODE ORG 100h 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 Ulang: Ak_Page 2 Delay 100 Ak_Page 0 Delay 100 LOOP Ulang
; Banyaknya pengulangan ; Aktifkan halaman ke 2 ; Aktifkan halaman ke 0
Agus Haryawan - Politama Surakarta
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 ! ; ;\=====================================================================/; .MODEL SMALL .CODE ORG 100h 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 MOV MOV MOV MOV LEA INT
AX,1100h DX,'A' CX,1 BL,0 BH,16 BP,Tabel 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 .MODEL SMALL .CODE ORG 100H
START: JMP MULAI JUDUL JUDUL1 JUDUL2 JUDUL3
DB DB DB DB
‘╔═════════════════════╗’,13,10,’$’ ‘║PROGRAM SUARA ║’,13,10,’$’ ‘║TEKAN S UNTUK KELUAR ║’,13,10,’$’ ‘╚═════════════════════╝’,13,10,’$’
Agus Haryawan - Politama Surakarta
79
Contoh-Contoh Program Untuk Latihan
MULAI: MOV MOV INT MOV MOV MOV MOV LEA INT
AH,0 AL,3 10H ; AH,09H BH,0 BL,09H CX,25 DX,JUDUL 21H
MOV MOV MOV MOV LEA INT
AH,09H BH,0 BL,0AH CX,25 DX,JUDUL1 21H
MOV MOV MOV MOV LEA INT
AH,09H BH,0 BL,0CH CX,25 DX,JUDUL2 21H
MOV MOV MOV MOV LEA INT
AH,09H BH,0 BL,0EH CX,25 DX,JUDUL3 21H
;INT 10h service 0, mode screen ;80 huruf x 25 baris (text), berwarna
IN AL,61H OR AL,3 OUT 61H,AL MOV AL,10110110B OUT 43H,AL SUARA: MOV OUT MOV OUT MOV MOV INT
AX,1000000/200 42H,AL AL,AH 42H,AL AH,06 DL,0FFH 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
Agus Haryawan - Politama Surakarta
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:
Agus Haryawan - Politama Surakarta
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
Agus Haryawan - Politama Surakarta
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
start: gam db db db db db db db db db db db db db db db db db db db db db db db db db
.model small .code org 100h jmp mulai ' ' ' ' °°°°° ' °° °° ' °° °° ' °°°° ' °° ' °° ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
°°°° °°°°°° °° °° °° °° °°°°°° °°°°
°° °°°°°° °°°°° °° °° °° °° °° °°°°° °° °° °°°°° °° °° °° °°°°° °° °°°°°
°°°°° °°°°°°° °°°° °°°° °°°° °°°° °°°°°°°°° °°°° °°°° °°°° °°°°°°°° °°°°°
°°° °°° °°° °°° °°° °°° °°° °°° °°°°°°° °°°°°°° °°° °°° °°° °°° °°° °°° °°° °°°
°° °° °° °° °°°° °°°° °° °° °° °°
°°°°° °° °° °° °° °°°°° °° °°
°°° °°° °°°° °°°° °° °°° °° °° ° °° °° °° °° °°
°°°°° °°°°°°° °°°° °°°° °°°° °°°° °°° °°° °°°°°°°°° °°°°°°°°° °°° °°° °°° °°° °°° °°°
Tekan Sembarang Tombol Untuk Ke DOS
' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '
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
Agus Haryawan - Politama Surakarta
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
Agus Haryawan - Politama Surakarta
84
KODE ASCII
7
KODE ASCII
7.1 HEXADESIMAL
7.2 DESIMAL
Agus Haryawan - Politama Surakarta
85