diktat pemrograman bahasa rakitan x86

Upload: hendra-soewarno

Post on 15-Jul-2015

1.471 views

Category:

Documents


18 download

DESCRIPTION

Diktat belajar rakitan untuk mahasiswa

TRANSCRIPT

PEMROGRAMAN BAHASA RAKITAN

DIKTAT KULIAH

Oleh: Hendra, MT. Hartono, M.Kom.

PROGRAM STUDI TEKNIK INFORMASI STMIK IBBI MEDAN 2012

Kata PengantarBahasa mesin adalah bahasa yang yang menjadi bagian dari mikroprocessesor, dan dapat dieksekusi tanpa membutuhkan proses Assembler maupun Compiler, tetapi sesuatu hal yang menjadi masalah adalah bahasa mesin cenderung rumit, karena menggunakan bilangan biner sebagai representasi dari perintah-perintah. Pada perkembangan selanjutnya dikembangkan mnemonic yang melambangkan dari masing-masing instruksi bahasa mesin yang dikenal sebagai bahasa rakitan (Assembly), dan membutuhkan satu tahapan assembler untuk mengubah mnemonic menjadi bahasa mesin. Mempelajari bahasa mesin merupakan salah satu mata kuliah yang wajib dikuasai oleh oleh mahasiswa jurusan teknik informatika, walaupun dewasa ini adalah kurang relevan untuk memprogram suatu program dengan bahasa rakitan, tetapi penguasaan bahasa rakitan akan memberikan keunggulan tersendiri, terutama ketika kita ingin mengoptimalkan bagian tertentu dari program kita, mengakses ke perangkat keras, melakukan reversed engineering untuk mempelajari dan memperbaiki suatu software dimana source tidak tersedia. Penguasaan teknik pemrograman bahasa rakitan memberikan pengetahuan yang lebih kepada mahasiswa untuk melangkah kepada pemrograman kernel maupun device driver, karena pemrograman pada tingkat ini membutuhkan banyak akses langsung ke memori maupun perintah primitif API yang disediakan oleh sistim operasi maupun BIOS. Walaupun buku ini tidak membahas tentang pemrograman kernel maupun device driver, tetapi saya yakin dapat menjadi landasan bagi mahasiswa untuk mengembangkan diri kearah sana, karena berbagai referensi telah tersedia diinternet. Medan, 20 Februari 2012 Penulis

Daftar Isi

Bagian 1, Pengenalan Bahasa Mesin............................................................................1 Bagian 2, Pemrograman 8086.......................................................................................7 Bagian 3, Bahasa Rakitan x86....................................................................................16 Bagian 4, Interrupt dan Pemakiannya.........................................................................19 Bagian 5, Memori dan Pengalamatan.........................................................................27 Bagian 6, Percabangan................................................................................................35 Bagian 7, Perulangan..................................................................................................39 Bagian 8, Operasi Logika...........................................................................................43 Bagian 9, Operasi String.............................................................................................50 Bagian 10, Operasi Shift dan Rotasi...........................................................................57 Bagian 11, Operasi Aritmatika....................................................................................64 Bagian 12, Makro.......................................................................................................69 Bagian 13, Sub Rutin..................................................................................................76 Bagian 14, Parameter pada Sub Rutin........................................................................82 Bagian 15, Penanganan I/O........................................................................................85 DAFTAR PUSTAKA.................................................................................................96 LAMPIRAN A. 8086 Mnemonic.....................................................................................................97 B. Tabel ASCII..........................................................................................................105 C. Binary ke Hexadesimal........................................................................................106 D. Menghubungan ASM dengan Pascal...................................................................107 E. Build-in ASM pada Turbo Pascal.........................................................................110 F. Menghubungan Turbo C/C++ dengan Assembly..................................................112 G. Build-in ASM pada Turbo C................................................................................115

Pemrograman Bahasa Rakitan

Bab1, Pengenalan Bahasa MesinApa itu bahasa MesinSetiap jenis CPU memiliki bahasa mesin-nya masing-masing. Instruksi bahasa mesin dinyatakan dalam bilangan numeric (Binari) yang tersimpan sebagai byte dimemori. Masing-masing instruksi memiliki kode numerik yang unik yang disebut sebagai operation code atau opcode. Setiap perintah diawali dengan suatu opcode dan dapat diikuti oleh data (lihat lampiran A).

Apa itu bahasa AssemblyKarena Bahasa Mesin sangat rumit untuk diprogram secara langsung (karena berupa bilangan numeric), sehingga dibuat suatu symbol pelambang (mnemonic) untuk mewakili masing-masing instruksi tersebut yang lebih mudah diingat dan dibaca oleh manusia (bayangkan apakah anda lebih mudah mengingat nama teman anda atau nomor telepon rumahnya?).

Apa itu AssemblerSebagaimana dijelaskan sebelumnya bahwa bahasa Assembly menggunakan mnemonic sebagai penganti bagi instruksi bahasa Mesin, sehingga program yang ditulis dalam bahasa Assembly tidak dapat secara langsung dieksekusi oleh CPU. Dalam hal ini Assembler berperan untuk menterjemahkan mnemonic tersebut menjadi bahasa Mesin yang dapat dieksekusi oleh CPU. Untuk melakukan assembler dapat menggunakan program DEBUG.EXE maupu berbagai aplikasi compiler seperti TASM, MASM, NASM, FASM maupun emulator8086.

Apa itu disassemblerJika proses Assembler menterjemahkan program yang ditulis dengan bahasa Assembly menjadi bahasa mesin, maka proses disassembler adalah mengembalikan suatu binary program menjadi (mnemonic) bahasa Assembly. Tujuan dari disassembler adalah untuk keperluaan reversed engineering, dimana kita mempelajari maupun memperbaiki suatu software tanpa memiliki source code, misalnya untuk mempelajari teknik penyerangan suatu program malware untuk dibuat anti malwarenya, ataupun memeriksa kemungkinan suatu program terdapat payload.

Mengapa belajar AssemblyDewasa ini adalah tidak relevan lagi membuat buat suatu program yang secara keseluruhan ditulis dengan bahasa assembly. Assembly biasanya digunakan untuk rutinrutin penting tertentu. Mengapa? Karena adalah lebih mudah memprogram dengan Hendra, MT. & Hartono, M.Kom. 1

Pemrograman Bahasa Rakitan menggunakan bahasa tingkat tinggi dari pada menggunakan assembly. Pemakaian assembly akan mengakibatkan program sulit untuk dialihkan ke platform yang berbeda (ingat bahwa masing-masing CPU memiliki bahasa Mesin yang berbeda), dan berikut ini adalah alasan mengapa anda mempelajari bahasa Assembly : 1. Program yang ditulis dengan assembly akan lebih cepat dan lebih kecil dibandingkan dengan kode yang dihasilkan dengan menggunakan compiler. 2. Assembly memungkinkan akses langsung ke fasilitas system hardware yang mungkin tidak dapat dilakukan dengan menggunakan bahasa tingkat tinggi (membaca/menulis data langsung ke sector, memformat harddisk). 3. Mempelajari assembly akan membantu pengertian yang lebih mendalam bagaimana computer bekerja. 4. Mempelajari pemrograman assembly akan membantu pengertian yang lebih baik tentang bagaimana compiler dan bahasa tingkat tinggi seperti C bekerja. 5. Dengan mengerti bahasa Assembly anda dapat melakukan proses disassembly untuk menganalisa program tertentu.

Latihan :Topik: Memahami bahasa mesin dan bahasa assembly, serta register dengan program Debug.ExeDebug merupakan program yang tersedia sejak DOS untuk IBM PC, utility ini cukup bermanfaat dan merupakan suatu keharusan bagi programmer assembler. Debug bekerja pada level bahasa mesin, dan memiliki kemampuan disassembler serta melakukan assembler instruksi (mnemonic) secara langsung ke bahasa mesin.

Mempersiapkan lingkungan praktekKarena komputer LAB digunakan bersama oleh mahasiswa, maka perlu dipersiapkan folder untuk penyimpanan file praktek anda. Buatlah sebuah folder di Drive E: dengan nama folder menggunakan nim anda, dan kemudian didalam folder tersebut buatlah folder tambahan dengan nama ASM Sehingga menjadi E:\920403024\ASM

Mengaktifkan program Debug1. Aktifkan MS-DOS Prompt (Start, All Programs, Command Prompt 2. Ubah keaktifkan ke folder anda C:\> E: Hendra, MT. & Hartono, M.Kom. 2

Pemrograman Bahasa Rakitan E:\> CD \920403024\ASM E:\920403024\ASM> 3. Ketikan perintah Debug.exe untuk mengaktifkan program Debug E:\920403024\ASM>Debug.exe

Tanda keaktifan program DebugTanda keaktifan anda dalam program Debug ditandai dengan sebuah prompt (-), pada tanda prompt inilah anda mengetikan perintah debug.

Menampilkan tanggal BIOS RevisionPada computer IBM PC Compatible menyimpan BIOS Revision Date pada alamat FFFF:0005, sehingga anda dapat menggunakan perintah D (Display untuk menampilkan isi pada alamat tersebut diatas. Pada tanda prompt (-) ketikan D FFFF:0005-d FFFF:0005 FFFF:0000 FFFF:0010 34 FFFF:0020 00 FFFF:0030 70 FFFF:0040 E2 FFFF:0050 12 FFFF:0060 8B FFFF:0070 4F FFFF:0080 98 30 00 00 30 51 00 00 14 36 00 00 00 52 8B 26 97 2F-31 00-00 00-00 BF-7F 57-55 44-02 8A-47 26-8A 32 00 00 01 1E A2 01 47 2F 00 00 B9 06 22 26 02 30 00 00 02 53 00 8A 2E 38 00 00 00 8B 88 67 3A 00 00 00 AB EC 26 0D 04 FC 00 00 47 8B 08 26 73 00 00 00 47 76 01 8B 2C 06/12/08... 4............... ................ p....0........GG ...VPQRWU..S...v ....0..D.."..&.. .4....&.G.&.g.&. O.&.W..&.G..:.s, .....

12 00 00 FB 2E 34 12 D1

00 00 2E CB 8E C4 26 E0

00 00 8E 56 1E 1E 8B 03

00 00 06 50 30 18 57 F0

Pada gambar diatas dapat dijelaskan bahwa pada sisi kiri ditampilkan alamat dari memori yang ditampilkan dalam format Segment (FFFF) dan Offset (0000), pada bagian tengah adalah representasi isi memori pada masing-masing alamat dalam format hexadesimal, kemudian pada bagian kanan adalah representasi isi memori dalam format ASCII (sesuatu hal yang perlu diperhatikan adalah tidak semua karakter ASCII dapat diprint dilayar, untuk karakter ASCII yang tidak dapat di print dilayar ditampilkan sebagai titik (.).

Menampilkan isi registerDalam pemrograman ASM, kita akan banyak berinteraksi dengan Register untuk berbagai proses pengolahan oleh CPU, misalnya penjumlahan, pengurangi, perkalian, pembagian, sampai kepada operasi logika dan bit.

Hendra, MT. & Hartono, M.Kom.

3

Pemrograman Bahasa Rakitan Untuk menampilkan isi Register dapat menggunakan perintah R (Register) -R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0B40 ES=0B40 SS=0B40 CS=0B40 IP=0100 NV UP EI PL NZ NA PO NC 0B40:0100 730B JNB 010D Pada gambar diatas dapat dijelaskan bahwa nilai register AX adalah 0000, nilai register BX adalah 0000, dan seterusnya. Kemudian register CS:IP menunjuk kelokasi 0B40:0010, dan isi memori lokasi yang ditunjuk adalah 730B (opcode bahasa mesin) yang direpresentasikan oleh JNB 010D (mnemonic bahasa assembly). Kemudian juga ditampilkan status dari register Flag sebagai berikut:FLAG NAME------------SET----------------CLEAR Overflow-------------ov-----------------nv Direction------------dn-----------------up (increment) Interrupt------------ei (enabled)-------di (disabled) Sign-----------------ng (neg)-----------pl (positive) Zero-----------------zr-----------------nz Auxiliary carry------ac-----------------na Parity---------------pe (even)----------po (odd) Carry----------------cy-----------------nc

Trap flag (TF) tidak ditampilkan.

Mengubah nilai registerPada beberapa perintah debug membutuhkan perubahan nilai register didalam operasinya, contohnya kita ingin menyimpan hasil pengetikan ke disk, maka perlu melakukan perubahan terhadap nilai register CX untuk menunjukan berapa byte data yang akan di tulis ke disk. Perubahan nilai register dilakukan dengan perintah R (register diikuti dengan nama register yang akan diganti), misalnya kita ingin menganti nilai Register AX menjadi 1234 hexa, maka perintah adalah RAX diikuti enter, dan kemudian mengetikan 1234 diikuti enter, setelah itu jika kita mengunakan perintah R untuk menampilkan isi register.-R AX=0000 BX=0000 DS=0B40 ES=0B40 0B40:0100 730B -RAX AX 0000 :1234 CX=0000 DX=0000 SP=FFEE SS=0B40 CS=0B40 IP=0100 JNB 010D BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

Hendra, MT. & Hartono, M.Kom.

4

Pemrograman Bahasa Rakitan-R AX=1234 BX=0000 DS=0B40 ES=0B40 0B40:0100 730B CX=0000 DX=0000 SP=FFEE SS=0B40 CS=0B40 IP=0100 JNB 010D BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

Catatan: Untuk menganti isi dari register flag dapat dilakukan dengan mengetikan perintah RF (Register Flag), kemudian ketikan state dari flag yang mau diganti misalnya DN EI CY.

Program bahasa mesin anda yang pertamaAgar anda dapat lebih memahami perbedaan antara bahasa mesin dengan bahasa assembly, maka berikut ini kita akan membuat sebuah program yang menampilkan pesan hello world!. Bahasa mesin dalam bentuk representasi hexadesimal EB 10 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 21 0D 0A 24 B4 09 BA 02 01 CD 21 B4 4C CD 21 Cara mengetikan bahasa mesin diatas : a. aktifkan program Debug b. ketik E 100 (E=Enter) c. ketik bilangan hexadecimal diatas diikuti dengan spasi, misalnya EB 10 68 dan seterusnya sampai selesai dan diakhiri dengan d. ketik RCX , kemudian ketik 1D. e. ketik N hello.com (N = Name) f. akhiri dengan perintah W (Write) g. ketikan U 100 (U=Unassembler) h. ketikan D 100 (D=Display) i. keluar dari program Debug dengan perintah Q (Quit). Contoh:-E 100 0B40:0100 0B40:0108 0B40:0110 0B40:0118 73.eb 06.77 2E.0a 90.21 0B.10 96.6f 8B.24 2E.b4 43.68 90.72 0E.b4 8B.4c 43.65 04.6c 94.09 36.cd E2.6c 00.64 90.ba 34.21 F2.6c 5D.20 2E.02 2E.6f 5F.21 A1.01 C7.20 5B.0d 96.cd

Hendra, MT. & Hartono, M.Kom.

5

Pemrograman Bahasa Rakitan-rcx CX 0000 :1d -n hello.com -w Writing 0001D bytes -u 100 0B40:0100 0B40:0102 0B40:0103 0B40:0104 0B40:0105 0B40:0106 0B40:0107 0B40:010A 0B40:010C 0B40:010D 0B40:010F 0B40:0112 0B40:0114 0B40:0117 0B40:0119 0B40:011B 0B40:011D 0B40:011F-d 100 0B40:0100 0B40:0110 0B40:0120 0B40:0130 0B40:0140 0B40:0150 0B40:0160 0B40:0170 -q E:\920403024\ASM>hello.com hello world !

EB10 68 65 6C 6C 6F 20776F 726C 64 2021 0D0A24 B409 BA0201 CD21 B44C CD21 002F 0B169A90EB 0A 16 00 00 FF 26 73 10 24 9A 75 75 E8 8A 08 68 B4 90 05 09 9E 4F E8 65 09 2E 2E 2E 00 08 0E 6C BA 8A FF C7 58 32 00

JMP DB DB DB DB DB AND JB DB AND OR MOV MOV INT MOV INT ADD OR6C 02 1E 06 06 EB ED E2 6F 01 9C 94 96 03 0B F6

0112 68 65 6C 6C 6F [BX+6F],DH 0178 64 [BX+DI],AH AX,240A AH,09 DX,0102 21 AH,4C 21 [BX],CH DX,[909A]20-77 CD-21 90-F8 90-2E 90-02 E8-1D C9-74 F9-EB 6F B4 C3 80 00 01 0D 06 72 4C 50 3C EB 58 8D 2E 6C CD 26 00 0E C3 6F 89 64 21 8B 75 50 F9 09 2E 20 00 07 19 B0 C3 E8 A9 21 2F A9 A9 03 55 19 90 0D 0B 02 01 B4 51 04 F8 ..hello world !. .$......!.L.!./. ..........P&.... .u........). Jump if Not Below or Equal (not =). Jump if Not Below (not ). Jump if Not Less or Equal (not =). Jump if Not Less (not 15 byte ;tidak sama goto cetakSalah ;sesuai dengan panjang pass ;es = ds ;clear DF

;baca keystroke --> al ;jika enter goto periksaPassword ;al --> ES:[DI]

;cetak * ;CX=CX-1; ulangi ketika CX 0

Pemrograman Bahasa Rakitan mov ah,9h int 21h

;cetak sesuai nilai DX

mov ah,4ch int 21h pesanAwal db 0dh,0ah,"ketik password:$" bacaString db 15 dup(0) passWord db "hendrasoewarno",0 pesanSalah db 0dh,0ah,"password salah!",0dh,0ah,"$" pesanBenar db 0dh,0ah,"password benar!",0dh,0ah,"$" end utama

Menggunakan AssemblerMulai bab ini kita akan menampilkan source code dalam format assembler seperti TASM, MASM, FASM, dan anda dapat juga menggunakan emu8086. Sesuatu hal yang perlu diperhatikan, pada software assembler mewajibkan kita mengetik instruksi didalam struktur tertentu dan diawali dengan directive tertentu, karena software assembler dapat mendukung berbagai target model memori (TINY, SMALL, COMPACT, MEDIUM, LARGE, HUGE, atau FLAT, yang mempengaruhi ukuran program dan data pointer), dan format executable (COM atau EXE). Sesuatu hal yang perlu diperhatikan didalam penulisan bilangan pada program Assembler jika tidak diakhir dengan huruf h, maka akan dianggap sebagai bilangan desimal (basis 10).format Executable COM .model tiny .code org 100h utama: format Executable EXE dosseg .model small .stack 100h .code main proc mov mov mov mov int mov int ax,@data ds,ax ah,9h dx,offset pesan 21h ah,4ch 21h

mov mov int mov int

ah,09 dx,offset pesan 21h ah,4ch 21h

main endp pesan db "hello world!$" end utama .data pesan db "hello world!$" end

Hendra, MT. & Hartono, M.Kom.

53

Pemrograman Bahasa Rakitan Adapun beberapa keuntungan menggunakan Assembler dibandingkan dengan Debug : 1. Pengetikan program Assembly dapat menggunakan text Editor 2. Dapat menggunakan label untuk pengalamatan sehingga tidak diperlukan perhitungan offset alamat dengan secara manual 3. Perbaikan program yang lebih mudah (cukup diperbaiki di sourcecode dan di Assembler ulang).

Model MemoriModel memori tradisional dikenali oleh banyak bahasa pemrograman seperti small, medium, compact, large dan huge (ini menjadi penting bila anda menghubungkan antara program ASM dengan suatu bahasa tingkat tinggi, lihat lampiran D) Model Small mendukung satu data segment dan satu code segment, dan secara default semua data dan koding adalah NEAR. Model Large mendukung banyak data segment dan codesegment, semua data dan koding adalah FAR. Model Medium mendukung satu data segment dan banyak code segment. Model Compact mendukung banyak data segmetn dan satu code segment. Model Huge memungkinkan satu data tunggal dapat lebih besar dari satu segment, tetapi implementasi dari item data besar tersebut harus dikodekan oleh programmer. Model Tiny hanya berjalan dibawah MS-DOS, model tiny menempatkan semua data dan kode pada satu segment yang sama, sehingga total data + kode tidak boleh lebih besar dari 64 Kb.

Pada masing-masing model, anda dapat mengatur pointer secara manual dengan menulikan sebagai NEAR atau FAR.

Memori FlatMemori Flat adalah konfigurasi yang tidak tersegmentasi dan hanya tersedia pada sistim operasi 32 bit. Model memori Flat menyerupai model tiny dimana semua kode dan data berada pada suatu pengalamatan tunggal 32-bit. Penulisan untuk program model Flat adalah menggunakan directive sebagai berikut:.386 .MODEL FLAT ; All data and code, including system resources, are in a single 32-bit segment.

Hendra, MT. & Hartono, M.Kom.

54

Pemrograman Bahasa Rakitan

Proses AssemblerProgram tersebut adalah executable COM, dan proses assembler melalui dua tahapan yaitu proses assembler itu sendiri dan proses link, dengan contoh sebagai berikut: TASM password.asm TLINK password /x /t

FASM (Fast Assembler)Selain TASM dan MASM, anda dapat juga menggunakan paket Assembler lainnya yaitu FASM, pemakaian FASM lebih sederhana, berikut ini contoh program Hello World untuk executable COM dan EXE.Format executable COM org 100h format executable EXE format MZ entry code_seg:start stack 100h segment code_seg start: mov ax,data_seg mov ds,ax mov ah,9h mov dx,pesan int 21h mov ax,4C00h int 21h segment data_seg pesan db 'Hello world!',24h

mov mov int mov int

ah,9h dx,pesan 21h ah,4ch 21h

pesan db "hello world!$"

Untuk proses assembler dengan Fast Assembler FASM hello.asm

Emulator8086Emulator adalah suatu lingkungan tiruan yang menyerupai lingkungan sebenarnya. Emu8086 adalah software emulator yang mensimulasikan lingkungan CPU 8086 dan sebagian sistim operasi DOS (tidak semua interrupt tersedia). Untuk proses pembelajaran, emulator cenderung lebih mudah digunakan dibandingkan dengan DEBUG.EXE maupun Assembler, karena pada saat eksekusi program dijalankan pada suatu lingkungan virtual sehingga kesalahan program tidak menyebabkan gangguan pada sistim secara keseluruhan. Hendra, MT. & Hartono, M.Kom. 55

Pemrograman Bahasa Rakitan

Anda dapat mendonwload software emu8086 untuk percobaan 14 hari pada http://www.emu8086.com.

Latihan1. Buatlah program yang dapat menerima maksimum 10 karakter dan dapat diakhir dengan Enter, dan karakter yang dapat diketik dibatasi yang berada pada nama anda. 2. Simpanlah isi layar text mode halaman pertama ke halaman kedua dengan akses langsung CGA video memori pada alamat $B800:0000 ke $B800:0FA0, sebanyak 4000 byte. Kemudian terima ketikan satu karakter dari user dan mencetak ke halaman pertama layar dengan akses langsung ke memori dengan background merah dan foreground light gray, kemudian jika pemakaian menekan sembarang tombol, kembalikan isi layar yang disimpan sebelumnya. 3. Buatlah program yang meminta pemakai memasukan password, dan menampilkan password tersebut benar atau tidak. 4. Perbaiki program soal nomor tiga agar password yang dimasukan tidak case sensitif. Catatan: Buatlah program dengan model COM.

Hendra, MT. & Hartono, M.Kom.

56

Pemrograman Bahasa Rakitan

Bab 10, Operasi Shift dan RotasiSalah satu fungsi utama dari pemakaian shift dan rotasi adalah untuk packing dan unpacking data. Jika data yang anda simpan lebih kecil dari 8-bit maupun 16-bit, maka pemakaian byte maupun word untuk menyimpan data anda tentu saja memboroskan, Misalnya kita perhatikan kembali BIOS Data area, dimana suatu byte 0040:0017 digunakan untuk menunjukan status On/Off dari shift kiri, shift kanan, ctrl, alt, scrollLock, numLock, capsLock, insert. Jika masing-masing status menggunakan 1 byte, maka diperlukan 8 byte, tetapi karena kondisi yang direpresentasikan adalah On/Off, maka pemakaian masing-masing bit dalam satu byte cukup untuk menyimpan status keyboard tersebut (hal inilah yang disebut sebagai packing data). Pemakaian lain dari perintah rotasi adalah untuk enkripsi dan dekripsi data. Contoh: mov al, 41h rol al,1 ror al,1 ; 1000001b adalah ascii dari karakter A ; 0000011b telah menjadi karakter ascii lain ; 1000001b telah kembali menjadi karakter A

Perintah Shift (SHL, SHR, SAL, SAR) juga sering digunakan untuk manipulasi data perkalian dan pembagian bulat 2n. Contoh: mov al, 2 shl al,1 shr al,1 ; 00000010b ; al = 4 = 00000100b ; al = 2 = 00000010b

Pemakaian SAL adalah sama dengan SHR, dan SAR digunakan untuk pembagian bilangan bertanda..

SHL (Shift Left)Melakukan shift semua bit ke kiri, bit yang keluar dimasukan ke CF, dan bit nol disisipkan pada posisi LSB.

Adapun sintak penulisan untuk SHL adalah sebagai berikut:shl shl op, 1 op, CL

Hendra, MT. & Hartono, M.Kom.

57

Pemrograman Bahasa Rakitan Dalam hal ini op adalah register atau memori, dan perintah ini mempengaruhi OF, SF, ZF, AF=?, PF, CF, flag OF = 0 jika tanda pada operand tidak berubah.Contoh: MOV AL, 11100000b SHL AL, 1 ; AL = 11000000b,

CF=1.

SHR (Shift Right)Melakukan shift semua bit ke kanan, bit yang keluar dimasukan ke CF, dan bit nol disisipkan pada posisi MSB.

Adapun sintak penulisan untuk SHR adalah sebagai berikut:shr shr op, 1 op, CL

Dalam hal ini op adalah register atau memori, flag OF = 0 jika tanda pada operand tidak berubah.Contoh: MOV AL, 00000111b SHR AL, 1 ; AL = 00000011b,

CF=1.

SAL (Shift Arithmetic Left)Melakukan shift semua bit ke kiri, bit yang keluar dimasukan ke CF, bit nol disisipkan pada LSB (Sama seperti SHL)

Adapun sintak penulisan untuk SAL adalah sebagai berikut:sal sal op, 1 op, CL

Dalam hal ini op adalah register atau memori, flag OF = 0 jika tanda pada operand tidak berubah.Contoh: MOV AL, 0E0h SAL AL, 1 RET ; AL = 11100000b ; AL = 11000000b,

CF=1.

Hendra, MT. & Hartono, M.Kom.

58

Pemrograman Bahasa Rakitan

SAR (Shift Arithmetic Right)Melakukan shift semua bit ke sebelah kanan, bit yang keluar akan dimasukan ke CF, dan bit tanda yang disisipkan ke MSB akan memiliki nilai yang sama sebelum shift.

Adapun sintak penulisan untuk SAR adalah sebagai berikut:sar sar op, 1 op, CL

Dalam hal ini op adalah register atau memori, flag OF = 0 jika tanda pada operand tidak berubah. Contoh:MOV SAR MOV SAR AL, AL, BL, BL, 0E0h 1 4Ch 1 ; ; ; ; AL AL BL BL = = = = 11100000b 11110000b, 01001100b 00100110b, CF=0. CF=0.

ROL (Rotate Left)Melakukan shift semua bit ke sebelah kiri, bit yang keluar akan dimasukan ke CF, dan bit yang sama disisipkan ke LSB.

Adapun sintak penulisan untuk ROL adalah sebagai berikut:rol rol op, 1 op, CL

Dalam hal ini op adalah register atau memori, flag OF = 0 jika tanda pada operand tidak berubah. Contoh:MOV AL, 1Ch ROL AL, 1 RET ; AL = 00011100b ; AL = 00111000b,

CF=0.

ROR (Rotate Right)Melakukan shift semua bit ke kanan, bit yang keluar dimasukan ke flag CF dan bit yang sama disisipkan ke MSB. Hendra, MT. & Hartono, M.Kom. 59

Pemrograman Bahasa Rakitan

Adapun sintak penulisan untuk ROR adalah sebagai berikut:ror ror op, 1 op, CL

Dalam hal ini op adalah register atau memori, flag OF = 0 jika tanda pada operand tidak berubah. Contoh:MOV AL, 1Ch ROR AL, 1 RET ; AL = 00011100b ; AL = 00001110b, CF=0.

RCL (Rotate with Carry Left)Melakukan shift semua bit ke kiri, bit yang keluar dimasukan ke CF dan nilai dari CF yang sebelumnya dimasukan ke LSB.

Adapun sintak penulisan untuk RCL adalah sebagai berikut:rcl rcl op, 1 op, CL

Dalam hal ini op adalah register atau memori, flag OF = 0 jika tanda pada operand tidak berubah. Contoh:STC MOV AL, 1Ch RCL AL, 1 RET ; set carry (CF=1) ; AL = 00011100b ; AL = 00111001b, CF=0.

RCR (Rotate with Carry Right)Melakukan shift semua bit ke kanan, bit yang keluar dimasukan ke flag CF, dan nilai CF yang sebelumnya disisipan pada LSB.

Hendra, MT. & Hartono, M.Kom.

60

Pemrograman Bahasa Rakitan

Adapun sintak penulisan untuk RCR adalah sebagai berikut:rcr rcr op, 1 op, CL

Dalam hal ini op adalah register atau memori, flag OF = 0 jika tanda pada operand tidak berubah. Contoh:STC MOV AL, 1Ch RCR AL, 1 RET dosseg .model small .stack 100h .data hexaDigit db '01234567890ABCDEF' pesan1 db 0dh,0ah,"ketik plaintext:$" pesan2 db 0dh,0ah,"ciphertext:$" panjang db 0 baca .code main proc mov ax,@data mov ds,ax mov ah,9h mov dx,offset pesan1 int 21h push ds pop es mov di,offset baca cld mov panjang,0 ;clear DF db 15 dup(0) ; set carry (CF=1). ; AL = 00011100b ; AL = 10001110b, CF=0.

;arahkan ds ke data segment ;cetak ketik plaintext

Hendra, MT. & Hartono, M.Kom.

61

Pemrograman Bahasa Rakitanmov cx, 15 ulangBaca: mov ah, 0 int 16h cmp al,0dh jz keluarBaca stosb mov ah,0eh int 10h inc panjang loop ulangBaca keluarBaca: mov ah,9h mov dx,offset pesan2 int 21h mov bx, offset hexaDigit mov si, offset baca mov cl, 0 ulangEnkrip: inc cl lodsb rol al,cl push ax and al, 11110000b shr al, 4 xlatb mov ah,0eh int 10h pop ax and al, 00001111b xlatb mov ah,0eh int 10h cmp cl, panjang jb ulangEnkrip

;baca keystroke ;jika enter keluar ;al --> ES:[DI] ;cetak nilai al ;panjang=panjang + 1 ;CX = CX -1; ulang ketika CX 0

;cl = 0 ;cl = cl + 1 ;ds:[si] --> al ;rotasi ke kiri sesuai nilai cl ;simpan nilai ax ;masking bit ;11110000 --> 00001111 ;al = ds:[bx+al] ;cetak al ;ambil nilai ax ;masking bit

;cetak al ;ulang ketika cl < panjang

Hendra, MT. & Hartono, M.Kom.

62

Pemrograman Bahasa Rakitanmain endp end

Program tersebut adalah executable EXE, dan proses assembler adalah sebagai berikut: TASM enkrip.asm TLINK enkrip

Latihan1. Buatlah program yang dapat menampilkan nilai biner dari byte yang terdapat pada BIOS Data Area 0040:0017. 2. Buatlah program yang dapat menampilkan nilai octal dari byte yang terdapat pada BIOS Data Area 0040:0017. 3. Buatlah program yang dapat menampilkan nilai hexa dari byte yang terdapat pada BIOS Data Area 0040:0017. 4. Buatlah program yang dapat menerima sebuah string, dan mencetak kembali nilai hexa dari masing-masing byte pada string setelah mengalami rotasi sesuai posisi masing-masing byte (byte terenkripsi). 5. Aplikasikan byte terenkripsi tersebut pada program password pada bab sebelumnya sehingga password tidak dapat terbaca langsung pada program. 6. Buatlah program yang dapat menampilkan konfigurasi hardware berdasarkan unpacking data word dari BIOS Data Area 0040:0010. Floopy Drive : ada CoProcessor : ada Disk Drive : 0 RS-232 Port : 4 Game Adapter : 0 Parallel Port : 0

Hendra, MT. & Hartono, M.Kom.

63

Pemrograman Bahasa Rakitan

Bab 11, Operasi AritmatikaCPU 8086 menyediakan beberapa perintah operasi artimatika untuk proses penjumlahan, pengurangan, perkalian dan pembagian.

Operasi PenjumlahanOperasi penjumlahan menggunakan perintah ADD yang memiliki sintak penulisan sebagai berikut: add dest, src

dimana dest dan src berupa : REG, memory memory, REG REG, REG memory, immediate REG, immediate Adapun operasi yang dilakukan adalah dest = dest + src, dan akan mempengaruhi flag OF, SF, ZF, AF, PF, CF.

Operasi PenguranganOperasi pengurangan menggunakan perintah SUB yang memiliki sintak penulisan sebagai berikut: sub dest, src

dimana dest dan src berupa : REG, memory memory, REG REG, REG memory, immediate REG, immediate Adapun operasi yang dilakukan adalah dest = dest src, dan akan mempengaruhi flag OF, SF, ZF, AF, PF, CF.

Hendra, MT. & Hartono, M.Kom.

64

Pemrograman Bahasa Rakitan

Operasi Penjumlahan dengan Carry FlagOperasi penjumlahan dengan perintah ADC adalah sama dengan perintah ADD ditambah lagi dengan nilai CF, sehingga operasi yang dilakukan adalah dest = dest + src + CF. Contoh:STC MOV AL, 5 ADC AL, 1 RET ; set CF = 1 ; AL = 5 ; AL = 7

Operasi Pengurangan dengan BorrowOperasi pengurangan dengan perintah SBB adalah sama dengan perintah SUB dikurangi lagi dengan nilai CF, sehingga operasi yang dilakukan adalah dest = dest src CF. Contoh:STC MOV AL, 5 SBB AL, 3

; AL = 5 - 3 - 1 = 1

Operasi PerkalianOperasi perkalian menggunakan perintah MUL yang memiliki operand berupa register ataupun memori. Jika operand adalah byte, maka operasi yang dilakukan adalah AX = AL * operand, sedangkan jika operand adalah word, maka operasi yang dilakukan adalah (DX AX) = AX * operand. Adapun flag yang dipengaruhi adalah OF, dan CF. Contoh:MOV AL, 200 MOV BL, 4 MUL BL ; AL = 0C8h ; AX = 0320h (800)

Operasi PembagianOperasi pembagian menggunakan perintah DIV yang memiliki operand berupa register ataupun memori. Jika operand adalah byte, maka operasi yang dilakukan adalah AL = AX / operand, dan AH berisi sisi bagi (modulus), sedangkan jika operand adalah word, maka operasi yang dilakukan adalah AX = (DX AX) / operand, dan DX adalah berisi modulus. Contoh:MOV AX, 203 ; AX = 00CBh

Hendra, MT. & Hartono, M.Kom.

65

Pemrograman Bahasa RakitanMOV BL, 4 DIV BL RET ; AL = 50 (32h), AH = 3

Perkalian bertandaJika anda bekerja dengan bilangan bertanda (signed), maka perintah yang digunakan untuk perkalian adalah IMUL menggantikan MUL. Contoh:MOV AL, -2 MOV BL, -4 IMUL BL RET ; AX = 8

Pembagian bertandaJika anda bekerja dengan bilangan bertanda (signed), maka perintah yang digunakan untuk pembagian adalah IDIV menggantikan DIV. Contoh:MOV AX, -203 ; AX = 0FF35h MOV BL, 4 IDIV BL ; AL = -50 (0CEh), AH = -3 (0FDh)

Operasi NegatifUntuk melakukan operasi negatif komplemen dua dapat menggunakan perintah NEG. Adapun operasi yang dilakukan adalah melakukan invers (NOT) terhadap semua bit dan menambahkan dengan satu. Contoh:MOV AL, 5 NEG AL NEG AL ; AL = 05h ; AL = 0FBh (-5) ; AL = 05h (5)

Program ini akan melakukan konversi suatu string ASCIIZ ke numerik yang disimpan pada variable hasil..model small .stack 100h .data string db '-32767',0 negatif db 0 hasil dw 0 ;string ASCIIZ

Hendra, MT. & Hartono, M.Kom.

66

Pemrograman Bahasa Rakitan.code main proc mov ax,@data mov ds,ax xor hasil,0 mov cx,5 cld mov si, offset string ulangKonversi: xor ax,ax lodsb or al,al jz keluarKonversi cmp jnz mov jmp al,'-' bukanNegatif negatif,1 prosesBerikutnya ;jika ketemu ASCIIZ ;pastikan ax = 0

bukanNegatif: sub al,30h push ax mov ax, hasil mov bx, 0ah mul bx mov hasil,ax pop ax add hasil,ax prosesBerikutnya: loop ulangKonversi keluarKonversi: cmp negatif,1 jnz bilanganPositif neg word ptr hasil ;konversi ke negatif ;ASCII 0=30h

;bl = 10 ;(dx ax) = ax * bx

Hendra, MT. & Hartono, M.Kom.

67

Pemrograman Bahasa RakitanbilanganPositif: ;proses lainnya ketik disini main endp end

Latihan1. Buatlah program yang mencetak bilangan biner dari suatu byte dengan metode pembagian. 2. Buatlah program yang mencetak bilangan octal dari suatu byte dengan metode pembagian. 3. Buatlah program yang mencetak bilangan hexa dari suatu byte dengan metode pembagian. 4. Buatlah program yang dapat mengkonversi dari string ke numerik dengan memperhatikan tanda. 5. Buatlah program yang dapat mengkonversi dari numerik ke string dengan memperhatikan tanda.

Hendra, MT. & Hartono, M.Kom.

68

Pemrograman Bahasa Rakitan

Bab 12, MakroMakro adalah fasilitas yang disediakan oleh Assembler (bukan CPU) yang berfungsi sebagai shorcut didalam pembuatan program. Didalam pengembangan program assembly, tidak jarang kita menggunakan sejumlah proses yang sama dan hanya berbeda dari segi parameter tertentu saja, sehingga adalah lebih efisien untuk dijadikan sebagai sebuah makro beserta parameternya.Makro hanya di source code, tetapi setelah proses assembler masing-masing makro akan diganti dengan kumpulan instruksi yang sebenarnya. Manfaat Makro: 1. Mengurangi pengetikan 2. Memudahkan pembacaan program 3. Memudahkan penanganan program 4. Mengurangi tingkat kesalahan Keuntungan lain dari pemanfaatan makro adalah anda dapat membuat sebuah file yang berisi makro-makro yang sering digunakan, dan setiap kali program assembly anda membutuhkan makro yang sama, anda cukup mengikutsertakan file makro tersebut kedalam program anda. Contoh: include emu8086.inc Dimana emu8086.inc adalah kumpulan makro yang disediakan oleh aplikasi emu8086.

Pemakaian MakroUntuk mendefinisikan suatu makro dapat mengunakan struktur sebagai berikut: nama_makro MACRO [parameter, ] instruksi ... EndM Suatu makro harus didefinisikan diatas program yang akan menggunakannya. Contoh:exitToDos MACRO mov ah,4ch int 21h endM

Hendra, MT. & Hartono, M.Kom.

69

Pemrograman Bahasa RakitancetakPesan MACRO pesan mov ah,9h mov dx,offset pesan int 21h endM cetakDigit MACRO mov ah,0eh int 10h endM barisBaru MACRO mov al,0dh cetakDigit mov al,0ah cetakDigit endM org 100h cetakPesan hello1 barisBaru cetakPesan hello2 barisBaru exitToDos hello1 db Hello Assembly!,$ hello2 db Hello Makro!,$

setelah diAssembler maka program diatas akan dikembangkan menjadi:org mov mov int 100h ah,9h dx, offset hello1 21h mov al,0dh mov ah,0eh int 10h mov al,0ah mov ah,0eh int 10h ah,9h dx, offset hello2 21h mov al,0dh mov ah,0eh int 10h mov al,0ah mov ah,0eh int 10h ah,4ch ;ekspansi dari cetakPesan hello1 ;ekspansi dari barisBaru ;ekspansi dari cetakDigit ;ekspansi dari barisBaru ;ekspansi dari cetakDigit

mov mov int

mov

Hendra, MT. & Hartono, M.Kom.

70

Pemrograman Bahasa Rakitanint 21h

Percabangan didalam MakroJika anda membuat percabangan didalam makro, maka perlu diingat bahwa setiap label yang digunakan harus ditandai sebagai LOCAL. Contoh:;makroLib.inc exitToDos MACRO mov ah,4ch int 21h endM cetakPesan MACRO pesan mov ah,9h mov dx,offset pesan int 21h endM cetakDigit MACRO mov ah,0eh int 10h endM barisBaru MACRO mov al,0dh cetakDigit mov al,0ah cetakDigit endM ;exit to DOS

;print until eos $

;teletype

;CR ;LF

bacaDigit MACRO local mulaiBaca,periksaTanda, periksaDigit, cetakKeLayar, keluarBaca mulaiBaca: mov ah,0h int 16h cmp jnz xor jmp al,0dh periksaTanda al,al keluarBaca ;get keystroke from keyboard --> AL

;jika bukan CR ;al = 0 ;akhir pembacaan (CR = selesai)

periksaTanda: cmp al,'-' jnz periksaDigit jmp cetakKeLayar

;jika bukan tanda negatif

Hendra, MT. & Hartono, M.Kom.

71

Pemrograman Bahasa RakitanperiksaDigit: cmp al,'0' jb mulaiBaca cmp al,'9' jg mulaiBaca cetakKeLayar: cetakDigit keluarBaca: endM bacaNumerik MACRO hasil local mulaiBaca, periksaTanda, prosesDigit, bacaBerikutnya, konversiSigned, selesaiBaca mov bp,sp push 0 mov hasil,0 mov cx,5 mulaiBaca: push cx bacaDigit or al,al jnz periksaTanda pop cx jmp konversiSigned periksaTanda: cmp al,'-' jnz prosesDigit mov [bp],1 pop cx jmp mulaiBaca prosesDigit: xor ah,ah sub al,30h push ax mov ax,hasil mov bx,0ah mul bx ;pada baca Digit CR --> AL = 0 ;lanjut ke pemeriksaan tanda ;buat satu variabel local, flag tanda ;hasil = 0 ;maksimal 5 digit ;simpan cx ke stak

;dibawah ASCII 0 ;diatas ASCII 9

;kalau bukan tanda ;flag tanda = 1 ;digit tambah tidak mengurangi CX ;pastikan AH = 0 ;ASCII to number ASCII 0 = 30h ;simpan nilai AX ke stack ; bx = 10 ;(dx ax) = ax x 10

Hendra, MT. & Hartono, M.Kom.

72

Pemrograman Bahasa Rakitanmov hasil,ax pop ax add hasil,ax bacaBerikutnya: pop cx loop mulaiBaca konversiSigned: cmp [bp],1 jnz selesaiBaca neg word ptr hasil selesaiBaca: mov sp,bp endM ;apakah flag tanda = 1 ;konversi negatif ke komplemen dua ;buang variabel lokal ;ambil nilai AX dari stack ;hasil = hasil + AX

cetakNumerik MACRO nilai local bukanNegatif, prosesDigit, prosesCetak mov ax, nilai or ax,ax jns bukanNegatif push ax mov al,'-' cetakDigit pop ax neg ax bukanNegatif: xor cx, cx prosesDigit: xor dx, dx mov bx,0ah div bx push dx inc cx or ax,ax jnz prosesDigit prosesCetak: pop ax add al,30h cetakDigit

;ax = (dx ax)/bx ;save reminder ;result = 0?

Hendra, MT. & Hartono, M.Kom.

73

Pemrograman Bahasa Rakitanloop prosesCetak

endM

Latihan1. Buatlah makro yang mencetak biner, octal, hexa dari suatu byte. 2. Buatlah program yang menerima dua bilangan bulat, lakukan proses penjumlahan dan cetak hasilnya. 3. Buatlah program yang menerima dua bilangan bulat, lakukan proses pengurangan dan cetak hasilnya. 4. Buatlah program yang dapat mencetak luas persegi panjang. 5. Buatlah program yang dapat menghitung fahrenheit dari suhu celcius

Hendra, MT. & Hartono, M.Kom.

74

Pemrograman Bahasa Rakitan

Quiz1. Buatlah makro-makro berikut ini: Clrscr MACRO gotoXY MACRO x,y 2. Buatlah program yang dapat mencetak daftar ASCII table sebagai berikut : No. ASCII ? ? dst dst No. ASCII ? ? dst dst No. ASCII ? ? dst dst No. ASCII, dst ? ? dst dst

3. Buatlah program yang dapat mencetak daftar basis bilangan sebagai berikut : Dec Oct Hex Bin

4. Buatlah program yang dapat mencetak daftar basis bilangan, dan negasinya dalam bentuk komplemen dua. Dec Oct Hex Bin Dec Oct Hex Bin

5. Buatlah makro yang dapat melakukan penjumlahan dan penguruangan data 32-bit, gunakan ADC longADD MACRO dest, src mov ax, word ptr [dest] add ax, word ptr [src] mov word ptr [dest],ax mov ax, word ptr [dest+2] adc ax, word ptr [src+2] mov word ptr [dest+2],ax endM longSUB MACRO dest, src mov ax, word ptr [dest] sub ax, word ptr [src] mov word ptr [dest],ax mov ax, word ptr [dest+2] sbb ax, word ptr [src+2] mov word ptr [dest+2],ax endM Hendra, MT. & Hartono, M.Kom.

; add with carry

; substract with borrow

75

Pemrograman Bahasa Rakitan

Bab 13, Sub RutinProcedure merupakan sub rutin yang dipanggil dengan menggunakan perintah CALL, pada saat perintah CALL terjadi, maka nilai register IP akan didorong ke stack, dan program bercabang ke alamat yang di CALL, dan ketika perintah RET, maka nilai tersebut akan ditarik dari stack ke register IP sehingga program dapat dilanjutkan. Perintah CALL dan RET adalah perintah yang disediakan oleh 8086.

Pembuatan Sub rutinPada dasarkan pemrograman 8086 tidak mensyaratkan sintak penulisan khusus untuk suatu procedure, yang perlu ingat adalah agar program dapat kembali ke program pemanggil, maka setiap procedure harus memiliki perintah RET. Tetapi jika anda bekerja dengan Assembler, maka anda diwajibkan menggunakan struktur penulisan sebagai berikut:nama_procedure instruksi RET name EndP PROC

Sesuatu hal yang perlu anda perhatikan adalah jika didalam procedure anda ada menggunakan perintah PUSH, maka pada titik RET perlu dipastikan bahwa nilai yang ditarik kembali pada saat RET adalah nilai yang didorong pada saat perintah CALL dilakukan. Contoh:cetakDigit PROC push ax mov ah,0eh int 10h pop ax ret endP barisBaru PROC push ax mov al,0dh call cetakDigit mov al,0ah call cetakDigit pop ax ret endP

Hendra, MT. & Hartono, M.Kom.

76

Pemrograman Bahasa Rakitan

Pemanggilan Sub rutinSebagaimana yang telah dijelaskan sebelumnya bahwa pemanggilan sub rutin menggunakan perintah CALL, pada saat perintah CALL dijalankan, maka nilai dari IP akan didorong ke Stack, dan nilai lokasi pemanggilan akan diberikan ke IP sehingga program bercabang ke sub rutin, ketika suatu perintah RET ditemukan, maka akan diambil dari dari stack ke register IP sehingga program bercabang kembali ke perintah setalah CALL.

Hal yang perlu diperhatikanJika anda melakukan looping untuk memanggil suatu sub rutin, maka perlu dipastikan bahwa didalam sub rutin tersebut tidak mempengaruhi nilai CX yang merupakan register counter pada program pemanggil, jika anda ragu, sebaiknya sebelum pemanggilan anda perlu menyimpan nilai register CX ke stack, dan menarik kembali nilai register CX setelah pemanggilan. Selain register CX, sebenarnya anda juga perlu memperhatikan perubahan terhadap nilai register lainnya, yang akhirnya akan mempengaruhi hasil proses pada program pemanggil. Contoh:.model small .stack 100h .data hasil1 dw 0 hasil2 dw 0 .code main PROC call bacaNumerik mov hasil1, ax call barisBaru call bacaNumerik mov hasil2, ax call barisBaru mov ax,hasil1 call cetakNumerik call barisBaru mov ax,hasil2 call cetakNumerik

Hendra, MT. & Hartono, M.Kom.

77

Pemrograman Bahasa Rakitancall barisBaru mov ah,4ch int 21h

endP

cetakDigit PROC push ax mov ah,0eh int 10h pop ax ret endP barisBaru PROC push ax mov al,0dh call cetakDigit mov al,0ah call cetakDigit pop ax ret endP bacaDigit PROC mulaiBacaDigit: mov ah,0h int 16h cmp jnz xor jmp al,0dh periksaTandaDigit al,al keluarBacaDigit

periksaTandaDigit: cmp al,'-' jnz periksaDigit jmp cetakKeLayar periksaDigit: cmp al,'0' jb mulaiBacaDigit cmp al,'9' jg mulaiBacaDigit cetakKeLayar: call cetakDigit keluarBacaDigit:

Hendra, MT. & Hartono, M.Kom.

78

Pemrograman Bahasa Rakitanret ;hasil --> AX

endP

bacaNumerik PROC push bx push cx push dx push bp mov bp,sp push 0 push 0 mov cx,5 mulaiBacaNumerik: push cx call bacaDigit

;variabel signFlag [bp] ;variabel hasil [bp-2]

or al,al jnz periksaTandaNumerik pop cx jmp konversiSignedNumerik periksaTandaNumerik: cmp al,'-' jnz prosesDigitNumerik mov [bp],1 pop cx jmp mulaiBacaNumerik prosesDigitNumerik: push ax xor ah,ah sub al,30h push ax mov ax,[bp-2] mov bx,0ah mul bx mov [bp-2],ax pop ax add [bp-2],ax bacaBerikutNumeriknya: pop ax pop cx or al,al

Hendra, MT. & Hartono, M.Kom.

79

Pemrograman Bahasa Rakitanloopnz mulaiBacaNumerik konversiSignedNumerik: cmp [bp],1 jnz selesaiBacaNumerik neg word ptr [bp-2] selesaiBacaNumerik: mov ax,[bp-2] ;hasil --> AX mov sp,bp pop pop pop pop ret endP cetakNumerik PROC push bx push cx push dx or ax,ax jns bukanNumerikNegatif push ax mov al,'-' call cetakDigit pop ax neg ax bukanNumerikNegatif: xor cx, cx prosesNumerikAwal: xor dx, dx mov bx,0ah div bx push dx ;nilai --> AX bp dx cx bx

;ax = (dx ax)/bx ;save reminder

inc cx or ax,ax ;result = 0? jnz prosesNumerikAwal prosesCetakNumerik:

Hendra, MT. & Hartono, M.Kom.

80

Pemrograman Bahasa Rakitanpop ax add al,30h call cetakDigit loop prosesCetakNumerik pop dx pop cx pop bx endP end ret

Latihan1. Buatlah sebuah sub rutin yang berfungsi membersihkan layar. 2. Buatlah program yang dapat menerima tiga bilangan, dan tampilkan hasil penjumlahan ketiganya .

Hendra, MT. & Hartono, M.Kom.

81

Pemrograman Bahasa Rakitan

Bab 14, Parameter pada Sub RutinDidalam pembuatan program, tidak jarang kita perlu mengirim nilai kedalam sub rutin maupun sebaliknya. Komunikasi nilai antara program pemanggil dengan subrutin dapat dilakukan melalui beberapa pendekatan sebagai berikut: 1. Menggunakan register 2. Menggunakan memori 3. Menggunakan stack Dari ketiga jenis pendekatan tersebut diatas, pemakaian register dan memori adalah cukup sederhana dan kita telah melakukannya pada Bab sebelumnya, tetapi pemakaian stack membutuhkan penanganan khusus, walaupun pendekatan ini cenderung lebih rumit, tetapi memiliki manfaat lebih, terutama ketika anda ingin menggunakan procedure yang anda buat dengan bahasa tingkat tinggi lainnya yang umumnya melewatkan nilai ke sub rutin dengan menggunakan stack. Pada bagian ini kita akan menfokuskan pada pembahasan pengiriman parameter lewat stack.

Mengirim parameter lewat StackUntuk melewatkan parameter ke sub rutin melalui stack, anda perlu mendorong masingmasing parameter ke stack sebelum proses pemanggilan fungsi dilakukan dengan urutan yang terbalik (parameter terakhir didorong terlebih dahulu). Karena stack bertambah ke bawah, parameter pertama akan ditempatkan pada alamat yang terendah. nama Proc Near Push BP Mov BP, SS Push 0 Push 0 POP BP Ret endP Push Param3 Push Param2 Push Param1 Call nama Kondisi stack ; variabel lokal1 ; variabel lokal2 BP -8 Param3 BP -6 Param2 BP -4 Param1 BP -2 Return Address (hanya IP) BP nilai BP (Push BP) BP +2 Variabel lokal1 BP +4 Variabel lokal2

Hendra, MT. & Hartono, M.Kom.

82

Pemrograman Bahasa Rakitan Pop Param1 Pop Param2 Pop Param3 ; atau add sp + 6

Setelah perintah Call, maka parameter yang didorong ke Stack harus di tarik kembali. GotoXY Proc Push BP Mov BP, SS Mov DX, [BP+4] Mov AH,2 Mov BH,0h Int 10h Ret endP Mov DL, 10 Mov DH, 15 Push DX Call gotoXY Pop DX ;parameter X low byte, Y high byte ;simpan BP ke stack ;BP menunjuk ke nilai BP yang dipush

; X low byte ; Y high byte ; atau add sp, 2

Pengembalian nilai dari sub rutinPengembalian nilai dari sub rutin dapat melalui memori, register, maupun Stack.

LatihanINT 10h / AH = 0 mengatur modus video input: AL = desired video mode. these video modes are supported: 00h - text mode. 40x25. 16 colors. 8 pages. 03h - text mode. 80x25. 16 colors. 8 pages. 13h - graphical mode. 40x25. 256 colors. 320x200 pixels. 1 page. INT 10h / AH = 0Ch - change color for a single pixel. input: AL = pixel color CX = column.

Hendra, MT. & Hartono, M.Kom.

83

Pemrograman Bahasa RakitanDX = row.

Sebagaimana yang telah pernah kita bahas sebelumnya bahwa CGA Video memori beradai di segment $B800, maka VGA Video memori berada di segment $A000. Akses langsung kememori memiliki perfomance yanglebih tinggi. Tetapi permasalahan yang dihadapi adalah bagaimana konversi koordinat pixel X,Y ke alamat offset memori, untuk mendapatkan alamat offset dari suatu pixel dapat menggunakan rumus: Offset = X + ( Y * 320 ) Setelah anda mendapatkan alamat offset memori dari pixel tersebut, anda dapat membuat sebuah pixel dengan perintah: mov es:[di], color Dimana ES menunjuk ke segment $A000, dan di menunjuk ke alamat offset dari pixel. Anda dapat juga menggunakan alternatif lain dengan perintah STOSB. Untuk melakukan perkalian 320 dapat dilakukan dengan :mov shl mov mov shl add mov add ax, ax, di, ax, ax, di, ax, di, Y 8 ax Y 6 ax X ax ; ax = ax * 256 ; ax = ax * 64 ; di = y * (256 + 64) = y * 320 ; di = y * 320 + x

Latihan1. Buatlah sub rutin initgraph yang berfungsi mengubah dari textmode menjadi grafik mode 2. Buatlah sub rutin putPixel yang berfungsi mengubah warna pada posisi pixel tertentu, warna, dan koordinat dikirim sebagai parameter melalui stack. 3. Buatlah sub rutin putPixelDirect yang berfungsi mengubah warna pada pixel tertentu, warna dan koordinat dikirim sebagai parameter melalui stack, dan pembuatan pixel menggunakan akses langsung ke memori VGA.

Hendra, MT. & Hartono, M.Kom.

84

Pemrograman Bahasa Rakitan

Bab 15, Penanganan I/OSecara hardware tentu saja mikroprocessor digunakan untuk mengendalikan berbagai peralatan, dan interaksi antara mikroprocessor dengan peralatan tersebut melalui berbagai nomor port yang berbeda. Untuk mengakses port perintah IN dan OUT dapat digunakan.

Membaca dari portUntuk membaca dari port dapat menggunakan perintah IN dengan sintak penulisan sebagai berikut:in in in in al, al, ax, ax, immediate byte dx immediate byte dx

perintah tersebut diatas membaca dari port yang ditunjuk oleh immediate byte ataupun register dx ke register al atau dx. Untuk mengakses port dengan nomor diatas 255 digunakan register dx.

Menulis ke portUntuk menulis ke port dapat menggunakan perintah OUT dengan sintak penulisan sebagai berikut:out out out out immediate byte, al immediate byte, ax dx, al dx, ax

perintah tersebut diatas menulis ke port yang ditunjuk oleh immediate byte ataupun register dx dari nilai register al atau dx. Contoh: Program Piano (menggunakan FASM)format MZ entry code_seg:start ; set entry point stack 100h segment data_seg nada dw 106h, 126h, 14ah, 15dh, 188h, 1b8h, 1efh, 200h pesan db "Tekan 12345678 untuk nada, Esc selesai.$" segment code_seg

Hendra, MT. & Hartono, M.Kom.

85

Pemrograman Bahasa Rakitanstart: mov ax, data_seg mov ds, ax mov ah,9h mov dx,pesan int 21h ulang: call readkey cmp al, 1bh jz keluar cmp al, '1' jb ulang cmp al, '8' jg ulang xor ah, ah sub al, '1' shl al, 1 ; ESC = 1b = 27

; al = al * 2

mov bx, nada mov si, ax push word [bx+si] call sound add sp,2 jmp ulang keluar: call nosound mov ax, 4ch int 21h readkey: ;proc mov ah,0 int 16h ret ;endp sound: ;proc push bp mov bp,sp ;parameter -->frek ; exit to dos ; add sp + 1 (recorver stack)

Hendra, MT. & Hartono, M.Kom.

86

Pemrograman Bahasa Rakitanin al,61h or al,3h out 61h,al mov al,0b6h out 43h,al mov dx,12h mov ax,34deh mov bx,[bp+4] div bx out 42h,al xchg ah,al out 42h,al pop bp ret ;endp nosound: ;proc in al,61h xor al,2h out 61h,al ret ;endp ;baca dari port 61h (8255) ;aktifkan bit 0 timer ; bit 1 speaker

;119318 / frek ;ax = (dx ax) / bx ;ah al

;non aktifkan bit speaker

Traffic lights Emulator

#start=Traffic_Lights.exe# name "traffic" mov ax, all_red out 4, ax

Hendra, MT. & Hartono, M.Kom.

87

Pemrograman Bahasa Rakitanmov si, offset situation next: mov ax, [si] out 4, ax ; wait 5 seconds (5 million microseconds) mov cx, 4Ch ; 004C4B40h = 5,000,000 mov dx, 4B40h mov ah, 86h int 15h add cmp jb mov jmp si, 2 ; next situation si, sit_end next si, offset situation next dw dw dw dw dw equ FEDC_BA98_7654_3210 0000_0011_0000_1100b 0000_0110_1001_1010b 0000_1000_0110_0001b 0000_1000_0110_0001b 0000_0100_1101_0011b 0000_0010_0100_1001b

; situation s1 s2 s3 s4 sit_end = $ all_red

Thermometer dan Heater Emulator#start=thermometer.exe# #make_bin# name "thermo" ; set data segment to code segment: mov ax, cs mov ds, ax start: in al, 125 cmp al, 60 jl low

Hendra, MT. & Hartono, M.Kom.

88

Pemrograman Bahasa Rakitancmp al, 80 jle ok jg high low: mov al, 1 out 127, al jmp ok high: mov al, 0 out 127, al ok: jmp start

; turn heater "on".

; turn heater "off". ; endless loop.

Stepper Motor

The motor can be half stepped by turning on pair of magnets, followed by a single and so on. The motor can be full stepped by turning on pair of magnets, followed by another pair of magnets and in the end followed by a single magnet and so on. The best way to make full step is to make two half steps. Half step is equal to 11.25 degrees. Full step is equal to 22.5 degrees. The motor can be turned both clock-wise and counter-clock-wise. Contoh:#start=stepper_motor.exe#

Hendra, MT. & Hartono, M.Kom.

89

Pemrograman Bahasa Rakitanname "stepper" #make_bin# steps_before_direction_change = 20h ; 32 (decimal) jmp start ; ========= data =============== ; bin data for clock-wise ; half-step rotation: datcw db 0000_0110b db 0000_0100b db 0000_0011b db 0000_0010b ; bin data for counter-clock-wise ; half-step rotation: datccw db 0000_0011b db 0000_0001b db 0000_0110b db 0000_0010b ; bin data for clock-wise ; full-step rotation: datcw_fs db 0000_0001b db 0000_0011b db 0000_0110b db 0000_0000b ; bin data for counter-clock-wise ; full-step rotation: datccw_fs db 0000_0100b db 0000_0110b db 0000_0011b db 0000_0000b start: mov bx, offset datcw ; start from clock-wise half-step. mov si, 0 mov cx, 0 ; step counter next_step: ; motor sets top bit when it's ready to accept new command wait: in al, 7 test al, 10000000b jz wait

Hendra, MT. & Hartono, M.Kom.

90

Pemrograman Bahasa Rakitanmov al, [bx][si] out 7, al inc si cmp si, 4 jb next_step mov si, 0 inc cx cmp cx, steps_before_direction_change jb next_step mov cx, 0 add bx, 4 ; next bin data cmp bx, offset datccw_fs jbe next_step mov bx, offset datcw ; return to clock-wise half-step. jmp next_step

Robot

Hendra, MT. & Hartono, M.Kom.

91

Pemrograman Bahasa Rakitan#start=robot.exe# name "robot" #make_bin# #cs = 500# #ds = 500# #ss = 500# #sp = ffff# #ip = 0#

; stack

; this is an example of contoling the robot. ; this code randomly moves the robot, ; and makes it to switch the lamps on and off. ; robot is a mechanical creature and it takes ; some time for it to complete a task. ; status register is used to see if robot is busy or not. ; ; ; ; c:\emu8086\devices\robot.exe uses ports 9, 10 and 11 source code of the robot and other devices is in: c:\emu8086\devices\developer\sources\ robot is programmed in visual basic 6.0

; robot base i/o port: r_port equ 9 ;=================================== eternal_loop: ; wait until robot ; is ready: call wait_robot ; examine the area ; in front of the robot: mov al, 4 out r_port, al call wait_exam ; get result from ; data register: in al, r_port + 1 ; nothing found? cmp al, 0 je cont ; - yes, so continue.

Hendra, MT. & Hartono, M.Kom.

92

Pemrograman Bahasa Rakitan; wall? cmp al, 255 je cont ; - yes, so continue. ; switched-on lamp? cmp al, 7 jne lamp_off ; - no, so skip. ; - yes, so switch it off, ; and turn: call switch_off_lamp jmp cont ; continue lamp_off: nop ; if gets here, then we have ; switched-off lamp, because ; all other situations checked ; already: call switch_on_lamp cont: call random_turn call wait_robot ; try to step forward: mov al, 1 out r_port, al call wait_robot ; try to step forward again: mov al, 1 out r_port, al jmp eternal_loop ; go again! ;=================================== ; this procedure does not ; return until robot is ready ; to receive next command: wait_robot proc ; check if robot busy: busy: in al, r_port+2 test al, 00000010b jnz busy ; busy, so wait. ret wait_robot endp ;===================================

Hendra, MT. & Hartono, M.Kom.

93

Pemrograman Bahasa Rakitan; this procedure does not ; return until robot completes ; the examination: wait_exam proc ; check if has new data: busy2: in al, r_port+2 test al, 00000001b jz busy2 ; no new data, so wait. ret wait_exam endp ;=================================== ; switch off the lamp: switch_off_lamp proc mov al, 6 out r_port, al ret switch_off_lamp endp ;=================================== ; switch on the lamp: switch_on_lamp proc mov al, 5 out r_port, al ret switch_on_lamp endp ;=================================== ; generates a random turn using ; system timer: random_turn proc ; get number of clock ; ticks since midnight ; in cx:dx mov ah, 0 int 1ah ; randomize using xor: xor dh, dl xor ch, cl xor ch, dh test ch, 2 jz no_turn test ch, 1

Hendra, MT. & Hartono, M.Kom.

94

Pemrograman Bahasa Rakitanjnz turn_right ; turn left: mov al, 2 out r_port, al ; exit from procedure: ret turn_right: mov al, 3 out r_port, al no_turn: ret random_turn endp ;===================================

Hendra, MT. & Hartono, M.Kom.

95

Pemrograman Bahasa Rakitan

Daftar PustakaRandall Hyde, The Art of Assembly Language, http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/index.html Documentation for 8086 assembler and emulator, http://www.emu8086.com/assembler_tutorial

Hendra, MT. & Hartono, M.Kom.

96

Pemrograman Bahasa Rakitan

Lampiran A, 8086 MenmonicMNEMONICS 8086/8088/80186/80188/8087/V30/V20assembly form : examples opcode [type ptr] [register],[address/reg] MOV AX,1234 INC BYTE PTR [BP] MOV AH,AL

machine code : xxxxxxxx[xxxxxxxx]|[mdxxxr/m]|[xxxxxxxx[xxxxxxxx]]|[xxxxxxxx[xxxxxxxx]] opcode 1 / 2 bytes|mdr/m byte| disp 1 / 2 bytes |imm. data 1 / 2 bytes ADDRESS MODES (mdxxxr/m byte) 97 effective address (EA) mdxxxr/m DS:[BX+SI] 00xxx000 DS:[BX+DI] 00xxx001 SS:[BP+SI] 00xxx010 SS:[BP+DI] 00xxx011 DS:[SI] 00xxx100 DS:[DI] 00xxx101 DS:disp16 00xxx110 DS:[BX] 00xxx111 DS:[BX+SI+disp8] 01xxx000 DS:[BX+DI+disp8] 01xxx001 SS:[BP+SI+disp8] 01xxx010 SS:[BP+DI+disp8] 01xxx011 DS:[SI+disp8] 01xxx100 DS:[DI+disp8] 01xxx101 SS:[BP+disp8] 01xxx110 DS:[BX+disp8] 01xxx111 DS:[BX+SI+disp16] 10xxx000 DS:[BX+DI+disp16] 10xxx001 SS:[BP+SI+disp16] 10xxx010 SS:[BP+DI+disp16] 10xxx011 DS:[SI+disp16] 10xxx100 DS:[DI+disp16] 10xxx101 SS:[BP+disp16] 10xxx110 DS:[BX+disp16] 10xxx111 register REGISTERS register 11xxxreg (reg or sr bits) 8bit AL CL DL BL 16bit AX CX DX BX reg 000 001 010 011 segment register 16bit ES CS SS DS sr 00 01 10 11

Hendra, MT. & Hartono, M.Kom.

97

Pemrograman Bahasa RakitanAH CH DH BH ADDRESSING MODES mode register immediate direct reg. indirect based indexed based indexed in the instruction in a register in memory example ,BX ,FFH ,[FFH] ,[BX] ,[BX+FFH] ,[SI+FFH] SP BP SI DI 100 101 110 111

register address----operand operand memory address---------------------operand register address----mem. address---operand register address----mem. address-+-operand displacement---------------------^ register address----displacement-+-operand mem. address---------------------^ register address----mem. address-v register address----displacement-+-operand displacement---------------------^ mem. address---operand mem. address---destination port address port address

,[BX+SI+FFH]

string operand I/O port dir. I/O port indir. DATA TRANSFER MOV

,20H ,DX

XCHG PUSH

PUSHA POP

move data register/mem. to/from register immediate to reg./mem. immediate to register mem. to accu (AX/AL) accu to mem. (AX/AL) reg./mem. to segm. reg. segm. reg. to reg./mem. exchange register/memory with register register with accu (AX) push register/memory register segment register immediate push all AX,CX,DX,BX,SP,BP,SI,DI pop

100010dw 1100011w 1011wreg 1010000w 1010001w 10001110 10001100 1000011w 10010reg 11111111 01010reg 000sr110 011010s0 01100000

mdregr/m md000r/m data8/16bit data8/16bit address16bit address16bit md0srr/m md0srr/m mdregr/m md110r/m data8/16bit * *

Hendra, MT. & Hartono, M.Kom.

98

Pemrograman Bahasa Rakitanregister/memory register segment register pop all, except SP, (skipping) DI,SI,BP,xx,BX,DX,CX,AX input from I/O port fixed port variable port in DX output to I/O port fixed port variable port in DX translate byte to AL (AL = [BX + AL]) load EA to register load pointer to DS load pointer to ES load AH with flags (O,D,I,S,Z,A,P,C) store AH into flags (O,D,I,S,Z,A,P,C) push flags pop flags 10001111 01011reg 000sr111 01100001 1110010w 1110110w 1110011w 1110111w 11010111 10001101 11000101 11000100 10011111 10011110 10011100 10011101 port8bit port8bit md000r/m

POPA IN OUT XLAT LEA LDS LES LAHF SAHF PUSHF POPF

*

mdregr/m mdregr/m mdregr/m

ARITHMETIC ADD add reg./mem. with reg. to either imm. to reg./mem. imm. to accu. (AX/AL) add with carry reg./mem. with reg. to either imm. to reg./mem. imm. to accu. (AX/AL) increment register/memory register ASCII adjust for add decimal adjust for add subtract reg./mem. and reg. to either imm. from reg./mem. imm. from accu. (AX/AL) subtract with borrow reg./mem. and reg. to either imm. from reg./mem. imm. from accu. (AX/AL) decrement register/memory register ASCII adjust for subtract decimal adjust for subtract multiply (unsigned) integer multiply (signed) register/memory immediate ASCII adjust for multiply 000000dw 100000sw 0000010w 000100dw 100000sw 0001010w 1111111w 01000reg 00110111 00100111 001010dw 100000sw 0010110w 000110dw 100000sw 0001110w 1111111w 01001reg 00111111 00101111 1111011w 1111011w 011010s1 11010100 mdregr/m md000r/m data8/16bit data8/16bit mdregr/m md010r/m data8/16bit data8/16bit md000r/m

ADC

INC AAA DAA SUB

mdregr/m md101r/m data8/16bit data8/16bit mdregr/m md011r/m data8/16bit data8/16bit md001r/m

SBB

DEC AAS DAS MUL IMUL AAM

md100r/m md101r/m mdregr/m 00001010 data8/16bit *

Hendra, MT. & Hartono, M.Kom.

99

Pemrograman Bahasa RakitanDIV IDIV AAD CBW CWD NEG CMP divide (unsigned) integer divide (signed) ASCII adjust for divide convert byte to word AL in AX convert word to double word (AX in DX : AX) change sign compare reg./mem. and register imm. with reg./mem. imm. with accu. (AX/AL) 1111011w 1111011w 11010101 10011000 10011001 1111011w 001110dw 100000sw 0011110w md110r/m md111r/m 00001010

md011r/m mdregr/m md111r/m data8/16bit data8/16bit

LOGIC AND and reg./mem. with reg. to either imm. to reg./mem. imm. to accu. (AX/AL) or reg./mem. with reg. to either imm. to reg./mem. imm. to accu. (AX/AL) exclusive or reg./mem. with reg. to either imm. to reg./mem. imm. to accu. (AX/AL) invert shift logical left (SAL) register/memory by 1 register/memory by CX register/memory by count shift logical right register/memory by 1 register/memory by CX register/memory by count rotate left register/memory by 1 register/memory by CX register/memory by count rotate right register/memory by 1 register/memory by CX register/memory by count shift arithmetic left (SHL) register/memory by 1 register/memory by CX register/memory by count shift arithmeric right register/memory by 1 register/memory by CX register/memory by count rotate through carry left register/memory by 1 register/memory by CX register/memory by count rotate through carry right 001000dw 100000sw 0010010w 000010dw 100000sw 0000110w 001100dw 100000sw 0011010w 1111011w 1101000w 1101001w 1100000w 1101000w 1101001w 1100000w 1101000w 1101001w 1100000w 1101000w 1101001w 1100000w 1101000w 1101001w 1100000w 1101000w 1101001w 1100000w 1101000w 1101001w 1100000w mdregr/m md100r/m data8/16bit data8/16bit mdregr/m md001r/m data8/16bit data8/16bit mdregr/m md110r/m data8/16bit data8/16bit md010r/m md100r/m md100r/m md100r/m md101r/m md101r/m md101r/m md000r/m md000r/m md000r/m md001r/m md001r/m md001r/m md100r/m md100r/m md100r/m md111r/m md111r/m md111r/m md010r/m md010r/m md010r/m

OR

XOR

NOT SHL

count8bit

*

SHR

count8bit

*

ROL

count8bit

*

ROR

count8bit

*

SAL

count8bit

*

SAR

count8bit

*

RCL

count8bit

*

RCR

Hendra, MT. & Hartono, M.Kom.

100

Pemrograman Bahasa Rakitanregister/memory by 1 1101000w register/memory by CX 1101001w register/memory by count 1100000w and function to flags (no result) reg./mem. and register 1000010w imm. data and reg./mem. 1111011w imm. data and accu. (AX/AL) 1010100w md011r/m md011r/m md011r/m

count8bit

*

TEST

mdregr/m md000r/m data8/16bit data8/16bit

STRING MANIPULATION DS:SI = source, ES:DI = destination, CX = rep. count direction flag = direction set = decrement SI/DI clear = increment SI/DI REP REPZ REPNZ REPE REPNE MOVSB MOVSW CMPSB CMPSW SCASB SCASW LODSB LODSW STOSB STOSW INSB INSW OUTSB OUTSW repeat next string oper. repeat for zero (REPE) repeat for not zero (REPNE) repeat for equal (REPZ) repeat for not equal (REPNZ) move byte(s) move word(s) compare byte(s) compare word(s) scan byte(s) scan word(s) load byte(s) to AL load word(s) to AX store byte(s) from AL store word(s) from AX input byte(s) from DX port input word(s) from DX port output byte(s) to DX port output word(s) to DX port 1111001z 11110011 11110010 11110011 11110010 10100100 10100101 10100110 10100111 10101110 10101111 10101100 10101101 10101010 10101011 01101100 01101101 01101110 01101111

* * * *

CONTROL TRANSFER CALL call to subroutine direct within segment indirect within segment direct intersegment indirect intersegment unconditional jump direct within segment direct within segment-short indirect within segment direct intersegment indirect intersegment return from call in segment adding immediate to SP (level) return intersegment adding immediate to SP (level) jump on not below or equal (JA) jump on above or equ. (JNB/JNC) jump on above (JNBE) jump on CX zero jump on not below (JAE/JNC) 11101000 11111111 10011010 11111111 11101001 11101011 11111111 11101010 11111111 11000011 11000010 11001011 11001010 01110111 01110011 01110111 11100011 01110011 disp16bit md010r/m offset:seg32bit md011r/m disp16bit disp8bit md100r/m offset:seg32bit md101r/m data16bit data16bit disp8bit disp8bit disp8bit disp8bit disp8bit

JMP

RET RETF JNBE JAE JA JCXZ JNB

Hendra, MT. & Hartono, M.Kom.

101

Pemrograman Bahasa RakitanJBE JB JNC JC JNAE JNA JZ JE JGE JG JNLE JNL JLE JL JNGE JNG JNZ JNE JPE JPO JNP JNS JNO JO JS JP LOOP LOOPNZ LOOPZ LOOPNE LOOPE ENTER LEAVE INT INTO IRET jump on below or equal (JNA) jump on below (JNAE/JC) jump on no carry (JNB/JAE) jump on carry (JB/JNAE) jump on not ab. or equ. (JB/JC) jump on not above (JBE) jump on zero (JE) jump on equal (JZ) jump on greater or equal (JNL) jump on greater (JNLE) jump on not less or equal (JG) jump on not less (JGE) jump on less or equal (JNG) jump on less (JNGE) jump on not great. or equ. (JL) jump on not greater (JLE) jump on not zero (JNE) jump on not equal (JNZ) jump on parity even (JP) jump on parity odd (JNP) jump on not parity (JPO) jump on not sign jump on not overflow jomp on overflow jump on sign jump on parity (JPE) loop CX times loop while not zero (LOOPNE) loop while zero (LOOPE) loop while not equal (LOOPNZ) loop while equal (LOOPZ) enter procedure leave procedure interrupt type specified type 3 interrupt on overflow interrupt return 01110110 01110010 01110011 01110010 01110010 01110110 01110100 01110100 01111101 01111111 01111111 01111101 01111110 01111100 01111100 01111110 01110101 01110101 01111010 01111011 01111011 01111001 01110001 01110000 01111000 01111010 11100010 11100000 11100001 11100000 11100001 11001000 11001001 11001101 11001100 11001110 11001111 disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit disp8bit data16bit level8bit type8bit

* *

PROCESSOR CONTROL CLC STC CMC CLD STD CLI STI ESC HLT LOCK NOP WAIT clear carry set carry complement carry clear direction set direction clear interrupt set interrupt escape (to external device) halt bus lock prefix (no external bus no operation wait till test pin is low 11111000 11111001 11110101 11111100 11111101 11111010 11111011 11011xxx mdxxxr/m 11110100 request allow. on next instr.) 11110000 10010000 10011011

Hendra, MT. & Hartono, M.Kom.

102

Pemrograman Bahasa RakitanSEGMENT CONTROL ES: CS: SS: DS: segment segment segment segment override override override override prefix prefix prefix prefix ES CS SS DS 001sr110 00100110 00101110 00110110 00111110

SPECIAL BITS d w s z x direction from/to 0 from register 1 to register word/byte 0 8bit data/reg. instruction 1 16bit data/reg. instruction sign extended 8bit or 16bit, w = 1 0 16bit data 1 8bit sign extended to 16bit uses for string primitives for comparison with ZF flag (zero) is don't care, uses with external device (8087)

SEGMENT REGISTERS sr 00 01 10 11 POSTBYTE md 00 01 10 11 r/m segment register ES CS SS DS (mdregr/m) mode if r/m = 110 then EA = disp16bit, else disp = 0 (no disp) disp is 8bit, sign extended to 16bit disp is 16bit r/m is a reg field disp follows 2nd byte of instruction (before data if required) register/memory 000 EA = (BX)+(SI)+disp / AX / AL 001 EA = (BX)+(DI)+disp / CX / CL 010 EA = (BP)+(SI)+disp / DX / DL 011 EA = (BP)+(DI)+disp / BX / BL 100 EA = (SI)+disp / SP / AH 101 EA = (DI)+disp / BP / CH 110 EA = (BP)+disp / SI / DH when md = 00, EA = disp16bit 111 EA = (BX)+disp / DI / BH disp follows 2nd byte of instruction (before data if required) register 8/16bits 000 AL / AX 001 CL / CX 010 DL / DX 011 BL / BX 100 AH / SP 101 CH / BP

reg

Hendra, MT. & Hartono, M.Kom.

103

Pemrograman Bahasa Rakitan110 DH / SI 111 BH / DI * is extended opcodes, not available in 8086/8088 only on V20/V30/80188/80186 and upper procedure protocol : ENTER data,level

: data is number of bytes to reserve on the stack level is nesting depth 1 = top, 0 = no nesting push BP on the stack, move SP in BP, look at level, if level is not zero then push level-1 words on the stack from old BP value address down, then push BP if level > 0. Finally subtract data from SP:

SP stack BP stack SP after->| | | | |------| | | : undef } data value | | |------| | | (SP/2)->|BP aft|>-when level > 0 | | |------| |------| :BP xxx:|BP xxx| |------| |------| high mem. SP before->| | | | |------| | | low mem. SP/BP before is value before ENTER opcode SP/BP after is value after ENTER opcode SP/1 is SP after when level and data is 0 SP/2 is SP after when data is 0 and level > 0 BP xxx is stack pointers from prev. procedure(s) LEAVE : move BP to SP, pop BP ; MOV SP,BP POP BP

Hendra, MT. & Hartono, M.Kom.

104

Pemrograman Bahasa Rakitan

Lampiran B, TABEL ASCII

Hendra, MT. & Hartono, M.Kom.

105

Pemrograman Bahasa Rakitan

LAMPIRAN C, BINARY KE HEXADESIMAL

Hendra, MT. & Hartono, M.Kom.

106

Pemrograman Bahasa Rakitan

Lampiran D, Menghubungkan ASM dengan Pascal1. Gunakan model memory large, PASCAL 2. Deklarasikan fungsi-fungsi yang akan diekspor sebagai public 3. Jika anda melakukan perubahan terhadap nilai register BP, SP, SS dan DS registers. Maka anda perlu mengembalikan nilainya. 4. Assember file tersebut menjadi OBJ 5. Pada pascal deklarasi masing-masing procedure/function yang akan dimport sebagai far; external. 6. Gunakan compiler direktif {$L nama_obj.obj} 7. Pengembalian nilai pada function dilakukan pada AL (byte), AX (Integer/Word) Contoh :Pascrt.Asm .MODEL large,PASCAL public public public public public .CODE clrscr PROC FAR mov ah,07h mov al,00h mov bh,07h mov ch,00h mov cl,00h mov dh,19h mov dl,50h int 10h ret ENDP PROC FAR x:BYTE, y:BYTE mov dl,x mov dh,y mov ah,02h mov bh,00h int 10h ret ENDP PROC FAR clrscr gotoxy readkey sound nosound

clrscr gotoxy

gotoxy readkey

Hendra, MT. & Hartono, M.Kom.

107

Pemrograman Bahasa Rakitanmov ah,00h int 16h ret ENDP ;return value in AL

readkey sound

sound nosound

PROC FAR frek:WORD in al,61h or al,3h out 61h,al mov al,0b6h out 43h,al mov dx,12h mov ax,34deh mov bx,frek div bx out 42h,al xchg ah,al out 42h,al ret ENDP PROC FAR in al,61h xor al,2h out 61h,al ret ENDP END

nosound

{Piano.Pas} program piano; procedure clrscr; procedure gotoxy(x,y:byte); function readkey : byte; procedure sound(frek : word); procedure nosound; {$L PASCRT.OBJ} var key : byte;

far; far; far; far; far;

external; external; external; external; external;

const nada : array [0..7] of word = ($106,$126,$14a,$15d,$188,$1b8,$1ef, $200); begin clrscr; gotoxy(5,5); writeln('Program Piano'); repeat

Hendra, MT. & Hartono, M.Kom.

108

Pemrograman Bahasa Rakitankey := readkey; if (key >= $31) and (key = $31) and (key