BAB I PENGENALAN BAHASA MESIN & BAHASA ASSEMBLY

Download binary program menjadi (mnemonic) bahasa Assembly. Tujuan dari ... tentang bagaimana compiler dan bahasa tingka...

1 downloads 106 Views 524KB Size
BAB I PENGENALAN BAHASA MESIN & BAHASA ASSEMBLY Bahasa Mesin Setiap jenis CPU memiliki bahasa mesin-nya masing-masing. Instruksi bahasa mesin dinyatakan dalam bilangan numeric (Binari) yang tersimpan sebagai byte dimemori. Masingmasing instruksi memiliki kode numerik yang unik yang disebut sebagai “operation code” atau “opcode”. Setiap perintah diawali dengan suatu opcode dan dapat diikuti oleh data.

Bahasa Assembly Karena 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 Assembler Sebagaimana 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 disassembler Jika 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 Assembly Dewasa 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 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).

1

Muhammad Taqiyyuddin Alawiy, ST., MT

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.Exe Debug 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.

Mengaktifkan program Debug 1. Aktifkan MS-DOS Prompt (Start, All Programs, Command Prompt 2. Ubah keaktifkan ke folder anda C:\> E: E:\> CD \920403024\ASM E:\920403024\ASM> 3. Ketikan perintah Debug.exe untuk mengaktifkan program Debug E:\920403024\ASM>Debug.exe

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

Menampilkan tanggal BIOS Revision Pada computer IBM PC Compatible menyimpan BIOS Revision Date pada alamatn FFFF:0005, sehingga anda dapat menggunakan perintah D (Display untuk menampilkan isi pada alamat tersebut diatas. Pada tanda prompt (-) ketikan D FFFF:0005

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,

2

Muhammad Taqiyyuddin Alawiy, ST., MT

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 register Dalam 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. 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 register Pada 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 -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 -RAX AX 0000 :1234 -R AX=1234 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

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.

3

Muhammad Taqiyyuddin Alawiy, ST., MT

Program bahasa mesin anda yang pertama Agar 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).

4

Muhammad Taqiyyuddin Alawiy, ST., MT

Bab 2 Pemrograman 8086 Pemrograman 8086 merupakan dasar dari pemrograman untuk processor seri 80x86, dan seterusnya. Perintah Debug mensimulasikan lingkungan 8086 merupakan tools yang tersedia sejak DOS versi 2.0

Pengalamatan 8086 Pengalamatan memori pada 8086 adalah terbagi atas segment-segment. Suatu alamat direpresentasikan dalam dua bagian yaitu segment dan offset yang masing-masing merupakan alamat 16-bit unsigned. Karena Offset merupakan pengalamatan 16-bit, maka jangkauan masing-masing offset dalam segment adalah 64 Kb (64 x 1024).Contoh: FFFF:0005 dimana FFFF adalah segment, dan 0005 adalah offset. Secara fisik, pengalamatan 8086 menggunakan pengalamatan 20-bit, sehingga untuk mendapat alamat fisik, angka pada Segment digeser sebesar 8 bit ke kiri, dan kemudian dijumlahkan kembali ke offset, sehingga FFFF:0005 merepresentasikan alamat fisik FFFF5, yaitu FFFF0+0005 = FFFF5.

Data pada 8086 Pada pemrograman 8086 kita bekerja dengan data 16-bit yang disebut sebagai word atau dua byte (8-bit). Satu word disimpan didalam memori dengan urutan low byte terlebih dahulu dan diikuti dengan high byte, contoh misalnya kita ingin menyimpan $1234 (hexadesimal), maka pada memori akan tersimpan $34 diikuti dengan $12, hal ini sejalan untuk proses increment pada IP (instruction pointer) yang mengakses low byte terlebih dahulu.

Bilangan Signed dan Unsigned CPU bekerja dengan data biner dan menggunakan bit tertentu sebagai tanda untuk bilangan, sebagai contoh data byte 8-bit dapat merepresentasikan 256 jenis objek yang berbeda. Pada bilangan unsigned (tidak bertanda) maka jangkauan nilai yang dapat dicapai adalah 0 s/d 255, sedangkan untuk bilangan yang sign(bertanda) kita dapat merepresentasikan nilai negatif -128 s/d -1, dan bilangan positif 0 s/d 127, sedangkan kalau dengan data word 16-bit dapat menjangkau -32,768 s/d 32,767, dan dengan data double word (dword) 32-bit dapat menjangkau -2,147,483,648 s/d 2,147,483,647, sehingga secara umum n-bit dapat menjangkau nilai -2n-1 s/d 2n-1-1. Sekarang kita telah mengerti bagaimana jangkauan representasi data bertanda, tetapi bagaimana caranya kerjanya pada CPU 8086. CPU 8086 menggunakan notasi two's complement (komplemen dua). Pada sistem komplemen dua most significant bit (MSB) digunakan sebagai sign bit (bit tanda). Jika MSB adalah nol, bilangan tersebut adalah positif, dan jika MSB adalah satu, maka bilangan adalah negatif. Representasi bilanganbertanda untuk 8-bit adalah sebagai berikut. Untuk mengkonversi suatu bilangan positif, menjadi bilangan negatif komplemen dua dilakukan dengan cara sebagai berikut: 1. Invers semua bit pada bilangan (aplikasikan operasi NOT) 2. Tambah satu pada hasil Invers (aplikasikan operasi INC) Contoh:

5

Muhammad Taqiyyuddin Alawiy, ST., MT

not 00000001 11111110 + 1 -----------11111111 (komplemen dua dari satu)

Konversi bilangan positif ke negatif dan sebaliknya pada 8086 dapat menggunakan perintah NEG.

Proses eksekusi Processor mengambil perintah yang akan dieksekusi dari memori berdasarkan alamat yang ditunjuk oleh register CS (Code Segment) dan IP (Instruction Pointer). Pada sistim operasi DOS, suatu program COM akan ditempatkan mulai dari offset $100. Nilai dari register IP maupun CS akan berubah sesuai dengan perubahan titik eksekusi oleh processor. Perubahan nilai CS:IP dapat dipengaruhi oleh perintah seperti JMP dan LOOP. Sesuatu yang perlu diperhatikan pada program COM adalah data dan kode terganbung pada segment yang sama, sehingga kita perlu menggunakan perintah JMP untuk melewati data, ataupun data ditempatkan dibawah kode.

Register 8086 Semua register pada 8086 adalah 16-bit, yang dapat dibagi menjadi low byte dan high byte. Ada empat register “general purpose” yaitu AX, BX, CX, dan DX, masing-masing register tersebut dibagi menjadi AL, AH, BL, BH, CL, CH, dan DL, DH. Register AX dikenal sebagai accumulator untuk hasil artimatika, register BX sering digunakan untuk menyimpan alamat base, register CX sering digunakan untuk counter pada proses perulangan, sedangkan register DX sering untuk pengalamatan I/O dan data. Selain register generalpurpose, terdapat juga index register yaitu SI (source index) dan DI (destination index) yang umumnya digunakan untuk pengalamatan dan operasi string. Kemudian terdapat register untuk pengelolaan data terkait dengan stack yaitu SP (Stack Pointer, BP (Base Pointer) dan SS (Stack Segment). Untuk pengelolaan data dapat menggunakan DS (Data Segment) dan ES (Extra Segment). Selain register tersebut diatas, pada 8086 terdapat sebuah register special yaitu register Flag yang menunjukan status yang dihasilkan dari hasil eksekusi dari suatu instruksi atau operasi kendali lainnya. Ada enam flag sebagai flag status yaitu AF, CF, OF, SF, PF dan ZF, dan tiga sisanya adalah flag kendali yaitu DF, IF dan TF Penjelasan dari masing-masing flag adalah sebagai berikut: AF (auxiliary flag), flag ini di set ketika terjadi carry out atau borrow pada 4 bit LSB. Flag ini digunakan pada saat instruksi logika dan aritmetika. CF (carry flag), flag ini diset ketika terjadi carry out atau overflow pada MSB. Ini digunakan oleh instruksi yang melakukan penjumlahan (ADC) dan pengurangan (SBB) angka banyak byte. OF (overflow flag), flag ini diset ketika suatu overflow aritmatika terjadi, dimana terjadi kehilangan pada digit MSB karena ukuran dari hasil melebihi kapasitas dari lokasi tujuan penampungan. SF (sign flag), karena bilangan binari negatif direpresentasikan pada 8086 dalam bentuk notasi komplemen dua. SF mengindikasikan sign dari hasil (0 = positif, 1 = negatif). PF (parity flag), flag ini diset ketika hasil adalah parity even, flag ini dapat digunakan untuk mengecek kesalahan transmisi. ZF (zero flag), flag ini diset ketika hasil operasi adalah 0, digunakan untuk sebagai hasil aritmatika dan perbadingan data.

6

Muhammad Taqiyyuddin Alawiy, ST., MT

DF (direction flag). Jika DF diset menyebabkan instruksi string melakukan autodecrement (hitungan mundur), dalam hal ini proses dari string dari alamat yang besar ke alamat yang kecil, atau dari kanan ke kiri. Jika nilai DF diclear menyebabkan instruksi string ke auto-increment (count up), atau proses string dari kiri ke kanan. IF (interrupt-enable flag), jika nilai IF di set, artinya memperbolehkan MPU untuk menangani eksternal maskable interrupt request. Jika nilai IF di clear artinya MPU mengabaikan interrupt jenis tersebut. IF tidak ada efek terhadap nonmaskable interrupt (NMI) dan internal generated interrupt. TF (trap flag), setting TF menempatkan processor pada modus single-step untuk debugging. Pada modus ini MPU secara otomatis membuat suatu internal interrupt setelah setiap instruksi.

Stack Suatu stack adalah suatu bagian dari memori yang disisihkan untuk menyimpan alamat dan data ketika suatu subrutin dijalankan maupun terjadinya interrupt. Pada MPU 8086, suatu 64 Kb segment dicadangkan sebagai stack. 16 bit alamat awal segment disimpan pada register Stack Segment (SS), dan register Stack Pointer (SP) mengandung 16-bit offset dimulai dari awal segment ke lokasi memori dimana suatu word yang paling akhir disimpan ke Stack. Gambar tersebut diatas dapat dijelaskan bahwa SS=$5000, dan SP=$FFE0, alamat fisik dari Top of the stack saat ini adalah $5FFE0.

Instruksi 8086 Suatu instruksi pada 8086 dapat terdiri dari satu sampai enam byte, ditambah dengan byte opsional pengendali segment. machine code : xxxxxxdw|[mdregr/m]|[xxxxxxxx[xxxxxxxx]]|[xxxxxxxx[xxxxxxxx]] opcode |mdr/m byte| disp 1 / 2 bytes |imm. data 1 / 2 bytes

Contoh: JMP unconditional jump direct within segment 11101001 disp16bit direct within segment-short 11101011 disp8bit indirect within segment 11111111 md100r/m direct intersegment 11101010 offset:seg32bit indirect intersegment 11111111 md101r/m MOV move data register/mem. to/from register 100010dw mdregr/m immediate to reg./mem. 1100011w md000r/m data8/16bit immediate to register 1011wreg data8/16bit mem. to accu (AX/AL) 1010000w address16bit accu to mem. (AX/AL) 1010001w address16bit reg./mem. to segm. reg. 10001110 md0srr/m segm. reg. to reg./mem. 10001100 md0srr/m

INT interrupt type specified 11001101 type8bit type 3 11001100

7

Muhammad Taqiyyuddin Alawiy, ST., MT

Opcode Byte Setiap byte pertama dari instruksi adalah byte opcode, yang menspesifikasikan operasi yang akan dilakukan. Jika ada data yang harus ditangani, maka byte kedua adalah byte pengalamatan, jika ada pemindahan (displacement) atau data lain diperlukan, maka akan ditambahkan pada byte berikutnya. Opcode dari suatu instruksi transfer data, dapat dibagi menjadi tiga bagian opcode, bit d, dan bit w. bit d menspesifikasikan bit direction, bit w adalah menspesifikan ukuran w =0 adalah operasi 8 bit, dan w = 1 adalah operasi 16 bit. Opcode untuk instruksi yang tidak memanipulasi data tidak memiliki bit d atau w. Sebagai contoh, instruksi untuk duplikasi data dari memori ke register, dari register ke memori, atau dari register ke register memiliki opcode 1000 10dw

Byte Pengalamatan Byte kedua memspesifikasikan modus pengalamatan, byte ini dalam bentuk mdregr/m. Bit md memspesifikasikan interpretasi dari bit r/m, dan memberikan jumlah dari byte pemindahan yang harus dilakukan, dan bit reg mespesifikasikan register. r/m mem w=0 w=1 000 BX+SI AL AX 001 BX+DI CL CX 010 BP+SI DL DX 011 BP+DI BL BX 100 SI AH SP 101 DI CH BP 110 ABS DH SI 111 BX BH DI Jenis register yang dispesifikasikan tergantung kepada bit w. Berdasarkan tabel diatas untuk nilai r/m=000 dapat menspesifikasikan register AL untuk w=0, dan register AX untuk w=1. Jika bit d=0, maka source adalah reg dan destination adalah r/m, dan jika d =1, maka source adalah r/m dan destination adalah reg. Jika bit md=11, maka bit r/m juga mengacu kepada suatu register, dengan menggunakan kode yang sama untuk reg. Jika bit md=00, maka referensi memori adalah pada kolom kedua dari tabel, dan tidak ada byte perpindahan, kecuali untuk kasus r/m = 110 (absolute), ketika suatu offset 16-bit dispesifikasikan pada dua byte berikutnya. Secara default hal ini relatif terhadap register segment DS. Jika bit md=01, maka merupakan offset 8 bit. Jika bit md=10, maka merupakan offset 16 bit. Contoh: 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 JMP unconditional jump direct within segment 11101001 disp16bit direct within segment-short 11101011 disp8bit indirect within segment 11111111 md100r/m direct intersegment 11101010 offset:seg32bit indirect intersegment 11111111 md101r/m

8

Muhammad Taqiyyuddin Alawiy, ST., MT

EB 10 EB = 11101011 = JMP jadi EB 10 adalah JMP 10 dalam hal ini adalah melakukan jump sebanyak 16 byte kedepan. 68 65 6C 6C 6F 20 77 6F 72 6C 64 20 21 0d 0A 24 dalam hal ini adalah “Hello World !”, 0d,0a, “$” yaitu pesan “Hello World !” diikuti dengan CR, dan LF, dan “$” yang merupakan end of string yang secara total adalah 16 byte atau $10. B4 09 MOV move data register/mem. to/from register 100010dw mdregr/m immediate to reg./mem. 1100011w md000r/m data8/16bi immediate to register 1011wreg data8/16bit mem. to accu (AX/AL) 1010000w address16bit accu to mem. (AX/AL) 1010001w address16bit reg./mem. to segm. reg. 10001110 md0srr/m segm. reg. to reg./mem. 10001100 md0srr/m

B4 = 10110100 dimana w = 0, dan reg = 100, untuk reg = 100 dan w = 0 adalah AL jadi perintah B4 09 adalah MOV AH, 9 BA 02 01 BA = 10111010 dimana w = 1, dan reg = 010, untuk reg = 010 dan w = 1 adalah DX 02 01 adalah word $102 dengan low byte adalah 02 dan high byte adalah 01 jadi perintah BA 02 01 adalah MOV DX, 102 CD 21 INT interrupt type specified 11001101 type8bit type 3 11001100

CD = 11001101 Jadi CD 21 adalah INT 21 B4 4C adalah MOV AH, 4C CD 21 adalah INT 21

Latihan 1. Buatlah program bahasa mesin untuk program assembly berikut ini : JMP “Selamat Belajar Assembly”, CR, LF, “$” MOV AH, 9 MOV DX, 102 INT 21 MOV AH, 4C INT 21 2. Buatlah program bahasa mesin yang dapat menampikan nama dan nim anda dengan dua kali cetak.

9

Muhammad Taqiyyuddin Alawiy, ST., MT

1. Ujilah program bahasa mesin anda dengan menggunakan program debug.

Bab 3 Bahasa rakitan x86 Pada bagian sebelumnya kita telah membahas tentang pemrograman 8086 dengan menggunakan bahasa mesin, dan pada bagian ini kita akan membahas tentangm pemrograman x86 Assembly.

Mnemonic dan Opcode Setiap perintah assembly x86 direpresentasikan dengan suatu mnemonic yang mana merupakan kombinasi dari satu atau lebih operand, dan diterjemahkan menjadi satu atau lebih byte yang disebut sebagai opcode, misalnya perintah INT 21 diterjemahkan menjadi CD 21.

Assembler Setiap program yang ditulis dengan menggunakan perintah assembly tidak dapat secara langsung dieksekusi oleh mesin, tetapi membutuhkan proses Assembly menggunakan software Assembler. Software Assembler yang paling sederhana adalah dengan menggunakan Debug.exe, dan untuk program yang lebih besar dan kompleks, tentu saja pemakaian Debug.exe tidak memadai, sehingga anda dapat menggunakan program assember seperti TASM, MASM, dan NASM.

Assembler pada Debug Untuk pembuatan program assembly dengan Debug dapat dilakukan dengan menggunakan perintah A (Assembly), adapun keterbatasan pada program Debug adalah hanya dapat membuat program COM, dan setiap program COM harus ditempatkan mulai dari lokasi memori $100. Contoh: -a 100 0B40:0100 jmp 112 0B40:0102 db 'Hello World !',0d,0a,'$' 0B40:0112 mov ah,9 0B40:0114 mov dx,102 0B40:0117 int 21 0B40:0119 mov ah,4c 0B40:011B int 21

10

Muhammad Taqiyyuddin Alawiy, ST., MT

0B40:011D -n helloasm.com -h 11D 100 021D 001D -rcx CX 0000 :1d -w Writing 0001D bytes Proses diatas dapat dijelaskan bahwa pada awalnya kita memberikan perintah A (Assembler), dimana hasil assembler ditempatkan pada lokasi memori $100, kemudian kita mengetikan perintah-perintah dalam bahasa assembly (mnemonic), kemudian dilanjutkan dengan menyimpan hasil assembler ke suatu file “helloasm.com”, dan melakukan penulisan sebanyak $1d byte dengan merubah nilai register CX, dan diakhiri dengan perintah w. Nilai $1d diperoleh dengan mengurangkan $11d dengan $100, proses Hexa arithmetic (fasilitas kalkulator pada DEBUG) dapat menggunakan perintah h11D 100, dan akan ditampilkan hasil penjumlahan ($21d) dan hasil pengurangan ($1d). -h 11D 100 021D 001D

UnAssembler pada Debug Program hasil assembler dapat di UnAssember dengan memberikan perintah U (UnAssembler) yang diikuti dengan lokasi memori bahasa mesin yang akan di UnAssembler. Contoh: D:\920403024\ASM>debug helloasm.com -u 100 0BB0:0100 EB10 JMP 0112 0BB0:0102 48 DEC AX ;Hello World 0BB0:0103 65 DB 65 0BB0:0104 6C DB 6C 0BB0:0105 6C DB 6C 0BB0:0106 6F DB 6F 0BB0:0107 20576F AND [BX+6F],DL 0BB0:010A 726C JB 0178 0BB0:010C 64 DB 64 0BB0:010D 2021 AND [BX+DI],AH 0BB0:010F 0D0A24 OR AX,240A ;CR, LF, '$' 0BB0:0112 B409 MOV AH,09 0BB0:0114 BA1201 MOV DX,0102 0BB0:0117 CD21 INT 21 0BB0:0119 B44C MOV AH,4C 0BB0:011B CD21 INT 21 ;exit to DOS

Pada sisi kolom pertama adalah alamat memori yang masing instruksi mesin, pada kolom kedua adalah opcode dari masing-masing perintah, pada kolom terakhir adalah bahasa assembly.

Latihan 1. Buatlah program dalam bahasa assembly yang dapat mencetak “Belajar Bahasa Assembly !”.

11

Muhammad Taqiyyuddin Alawiy, ST., MT

2. Buatlah program assembly berikut ini : -a 100 0BB0:0100 jmp 127 0BB0:0102 db 'Selamat belajar program assembly !',0d,0a,'$' 0BB0:0127 mov cx,5 0BB0:012A mov ah,9 0BB0:012C mov dx,102 0BB0:012F int 21 0BB0:0131 loop 12a 0BB0:0133 mov ah,4c 0BB0:0135 int 21 0BB0:0137 mov ah,4c 0BB0:0139 3. Modifikasi program tersebut diatas untuk mencetak pesan selamat belajar program assembly menjadi 20 baris. 4. Cobalah program Caps_On berikut ini : mov ax,0040 mov ds,ax or byte ptr [0017],40 mov ah,1 int 16 mov ax,4c00 int 21

5. Cobalah program Caps_Off berikut ini : mov ax,0040 mov ds,ax and byte ptr [0017],bf mov ah,1 int 16 mov ax,4c00 int 21

12

Muhammad Taqiyyuddin Alawiy, ST., MT

Bab 4 Interrupt dan Pemakaiannya Kadang-kadang proses dalam CPU mengalami interrupsi untuk kejadian-kejadian yang perlu segera mendapat respon, seperti pengetikan pada keyboard, proses I/O lainnya, dan clock tick untuk mengupdate waktu system. Pada prinsipnya interrupt terbagi atas eksternal, dan internal. Eksternal interrupt dibangkitkan oleh proses diluar program seperti proses I/O, dan clock, sedangkan proses Internal interrupt dibangkitkan oleh proses program seperti devide for zero error (Traps interrupt) dan Software interrupt (dibangkitkan dengan perintah INT). Ketika suatu interrupt terjadi, processor akan menyelesaikan siklus memori saat ini, dan bercabang kepada rutin khusus menanggani interrupt tersebut, status dari program saat ini akan disimpan dan rutin interrupt handle umumnya akan mengembalikan kendali ke program termasuk semua nilai register seakan-akan tidak pernah terjadi sesuatu (hanya kehilangan beberapa siklus CPU), sedangkan Traps interrupt tidak akan kembali ke program dan menghentikan program tersebut. Catatan : Pada bagian ini kita akan lebih memfokuskan diri pada Software interrupt

Maskable Interrupt Processor dapat mencegah interrupt dengan menggunakan mask bit khusus interrupt. Mask bit ini adalah bagian dari flag register pada microprocessor 8086 yang dikenal sebagai interrupt flag (IF), jika bit ini clear (IF=0), dan terjadi permintaan interrupt pada pin Interrupt Request, maka permintaan tersebut akan diabaikan.

Non-Maskable Interrupt (NMI) Ada beberapa interrupt yang mana tidak dapat di mask atau diabaikan oleh processor, hal ini terkait dengan tugas-tugas prioritas tinggi yang tidak boleh diabaikan (seperti terjadi pariti pada memori atau kegagalan BUS). NMI memiliki prioritas yang absolut, dan ketika itu terjadi, processor menyelesaikan siklus memori saat ini, dan kemudian bercabang ke rutin khusus yang ditulis untuk menangani permintaan interrupt.

Interrupt pada 8086 Adapun urutan dari proses interrupt pada microprocessor 8086 dapat dijelaskan sebagai berikut: 1. Interface eksternal mengirim suatu sinyal interrupt ke pin Interrupt Request INTR), atau suatu internal interrupt terjadi. 2. CPU menyelesaikan instruksi yang berlangsung dan mengirim (untuk suatu hardware interrupt) dan mengirim Interrupt Acknowledge (INTA) ke interface hardware. 3. Interrupt jenis N (masing-masing interrupt memiliki nomor) dikirim ke Central Processing Unit (CPU) melalui data bus dari interface hardware. 4. Isi dari register flag didorong ke stack. 5. Flag interrupt (IF) dan trap (TF) di clear, hal ini akan mencegah pin INTR dan kemampuan single-step untuk proses debugging (trap) 6. Isi dari register CS didorong ke Stack 7. Isi dari register IP didorong ke Stack

13

Muhammad Taqiyyuddin Alawiy, ST., MT

8. Isi dari vektor interrupt diambil, dari (4 x N) dan kemudian ditempatkan ke IP dan dari (4 x N + 2) ke CS, sehingga instruksi berikutnya yang akan dijalankan adalah procedure dari interrupt service berdasarkan alamat pada interrupt vector. 9. Ketika kembali dari rutin interrupt-service oleh instruksi Interrupt Return (IRET), nilai IP, CS dan register Flag akan ditarik dari Stack dan kembali ke kondisi sebelum terjadinya interrupt.

Software Interrupt Software interrupt merupakan fungsi-fungsi yang disediakan oleh BIOS maupun sistim operasi, dimana fungsi-fungsi tersebut membuat tugas pemrograman menjadi lebih mudah, dari pada menulisnya sendiri dari awal, anda cukup mengirimkan nilai input yang dibutuhkan melalui register, kemudian memanggil rutin interrupt tersebut, dan selanjutnya rutin interrupt akan melakukan fungsinya dan mengembalikan nilai hasil melalui register. Fungsi yang tersedia dalam interrupt dapat terdiri dari layanan hardware seperti screen, diskdrive, printer, serial port dan keyboard, maupun layanan secara software seperti directory dan file. Untuk melakukan panggilan terhadap rutin interrupt menggunakan perintah INT N Dimana N merupakan nomor interrupt yang dapat bernilai 0 s/d 255, yang umumnya ditulis secara hexadecimal 0 s/d FF Pada kenyataannya masing-masing interrupt terbagi lagi sub-sub layanan, yang ditentukan pada nilai register AH, sebelum interrupt tersebut dipanggil, sehingga kita dapat memiliki 256 x 256 = 65536 fungsi layanan.

Pemakaian Interrupt Seperti yang telah dijelaskan sebelumnya, salah satu parameter layanan fungsi interrupt adalah sub layanan yang ditentukan oleh nilai register AH, selain nilai register AH, kita juga perlu mengisi nilai-nilai register lainnya sesuai dengan kebutuhan layanan interrupt tersebut. Contoh: INT 21,9 - Print String AH = 09 DS:DX = menunjuk alat suatu striung yang diakhir dengan "$" returns nothing - outputs character string to STDOUT up to "$" - backspace is treated as non-destructive - if Ctrl-Break is detected, INT 23 is executed Berdasarkan data tersebut diatas, maka untuk pemakaian interrupt $21, sub layanan $9 dengan fungsi “Print String”, maka perlu ditentukan nilai register AH=$9, dan kemudian nilai register DS:DX menunjuk ke alamat suatu string yang diakhiri dengan '$'. Coba kita review kembali program hello world sebelumnya. Dimana kita menggunakan INT $21 sub layanan AH=$9 untuk mencetak tulisan yang berada dioffset DX=$102. Jadi dalam hal ini AH dan DX merupakan parameter bagi INT $21. 0B11:0100 jmp 112 0B11:0102 db 'hello world !',0d,0a,'$' 0B11:0112 mov ah,9 0B11:0114 mov dx,102 0B11:0117 int 21 0B11:0119 mov ah,4c 0B11:011B int 21

Dalam hal ini kita tidak menentukan nilai DS, karena secara default pada program jenis COM, nilai DS, ES, dan SS adalah sama dengan CS. Pada contoh sebelumnya kita

14

Muhammad Taqiyyuddin Alawiy, ST., MT

bekerja dengan rutin interrupt yang tidak mengembalikan hasil, tetapi hanya proses mencetak string ke layar, berikut ini kita akan membahas rutin interrupt yang mengembalikan hasil. INT 21,8 - Console Input Without Echo AH = 08 on return: AL = character from STDIN - returns 0 for extended keystroke, then function must be called again to return scan code - waits for character from STDIN and returns data in AL - if Ctrl-Break is detected, INT 23 is executed Berdasarkan data tersebut diatas, maka untuk menjalankan fungsi Int $21 “Console Input Without Echo”, kita perlu ditentukan nilai register AH=$8, dan interrupt rutin akan menunggu karakter dari STDIN, jika ada karakter yang diketik, maka akan disimpan di register AL. Untuk kongkritnya mari kita lihat contoh berikut ini, dimana setelah mencetak pesan “Ketik huruf A untuk selesai”, program akan menanti input dari keyboard dengan menggunakan INT $21 sub layanan AH=$8, dan nilai ASCII dari input keyboard akan dikembalikan di register AL. Selanjutnya program dapat membandingkan nilai register AL dengan $41 (65 desimal). 0B11:0100 mov ah,9 0B11:0102 mov dx,113 0B11:0105 int 21 0B11:0107 mov ah,8 ;baca dari STDIN tanpa echo 0B11:0109 int 21 ;karakter dikembalikan ke AL 0B11:010B cmp al,41 0B11:010D jnz 100 0B11:010F mov ah,4c 0B11:0111 int 21 0B11:0113 db „Ketik huruf A untuk selesai‟,0d,0a,‟$‟ 0B11:0131

Latihan 1. Misalkan diberikan suatu data interrupt sebagai berikut: INT 21,39 - Create Subdirectory (mkdir) AH = $39 DS:DX = pointer to ASCIIZ path name on return: CF = 0 if successful = 1 if error AX = error code (see DOS ERROR CODES) - creates specified subdirectory - returns error if directory already exists, element of the path is not found, directory full or write protected disk Catatan: ASCIIZ adalah suatu string yang diakhiri dengan null (0) Buatlah sebuah program assembly yang dapat membuat directory di E:\Nama Anda 2. Misalkan diberikan suatu data interrupt sebagai berikut: INT 21,3B - Change Current Directory (chdir) AH = $3B DS:DX = pointer to ASCIIZ path name

15

Muhammad Taqiyyuddin Alawiy, ST., MT

on return: CF = 0 if successful = 1 if error AX = error code if CF set (see DOS ERROR CODES) - changes the current directory to the directory specified by pointer DS:DX Buat program yang dapat mengaktifkan ke directory E:\Hendra. 3. Misalkan diberikan suatu data interrupt sebagai berikut: INT 21,56 - Rename File AH = $56 DS:DX = pointer to old ASCIIZ path/filename ES:DI = pointer to new ASCIIZ path/filename on return: AX = error code if CF set (see DOS ERROR CODES) - supports full pathnames and allows renaming files across directories and in DOS 3.x allows renaming subdirectories - does not support use of wildcards unless invoked from via INT $21, $5D in which case error code $12 is returned - unpredictable result may occur if an opened file is renamed - see Bibliography reference to "Undocumented DOS" Buatlah program yang dapat mengubah directori E:\Hendra menjadi E:\Susan SOAL QUIS 1. Jika anda diberi data sebagai berikut INT 10h / AH = 2 – setting posisi cursor. input: DH = baris. DL = kolom. BH = nomor halaman (0..7). Contoh: mov dh, 10 mov dl, 20 mov bh, 0 mov ah, 2 int 10h Buatlah program yang dapat mencetak tulisan “Hello World” pada lokasi 10,10. 2. Jika anda diberi data sebagai berikut INT 10h / AH = 03h – mendapatkan posisi cursor dan ukuran. input: BH = page number. return: DH = row. DL = column. CH = cursor start line. CL = cursor bottom line. Untuk menyimpan nilai register 16-bit ke Stack anda dapat mengunakan perintah PUSH, dan untuk mengambil kembali nilai dari Stack anda dapat menggunakan POP.

16

Muhammad Taqiyyuddin Alawiy, ST., MT

Contoh: Push DX Pop DX Buatlah program yang dapat mencetak tulisan “Hello World” pada lokasi 10,10 dan mengembalikan posisi cursor ke lokasi semula sebelum proses pencetakan. 3. Jika anda diberi data sebagai berikut INT 10h / AH = 06h – menggulung layar ke atas. INT 10h / AH = 07h – menggulung layer ke bawah. input: AL = jumlah baris yang digulung (00h = membersihkan layar). BH = attribute untuk baris kosong pada bagian bawah window. CH, CL = row, column sisi kiri atas jendela. DH, DL = row, column sisi kanan bawah jendela. Atribut HEX BIN COLOR 0 0000 black 1 0001 blue 2 0010 green 3 0011 cyan 4 0100 red 5 0101 magenta 6 0110 brown 7 0111 light gray 8 1000 dark gray 9 1001 light blue A 1010 light green B 1011 light cyan C 1100 light red D 1101 light magenta E 1110 yellow F 1111 white

Jika nilai BH = $07, berarti warna background adalah black (0), dan warna foreground adalah light gray (7). Jumlah Baris = 0 s/d 24 Jumlah Kolom = 0 s/d 79 Buatlah program yang mensimulasi perintah CLS pada DOS, dan mengeser kursor ke posisi sudut kiri atas. 4. Jika anda diberi data berikut : INT 16h / AH = 00h - ambil keystroke dari keyboard (no echo). return: AH = BIOS scan code. AL = ASCII character. (if a keystroke is present, it is removed from the keyboard buffer). INT 10h / AH = 0Eh - teletype output. input: AL = karakter yang dicetak. Fungsi ini menampilkan suatu karakter pada layer, memajukan cursor dan mengulung layer bila perlu, pencetakan dilakukan pada halaman yang aktif. Contoh: mov al, 'a'

17

Muhammad Taqiyyuddin Alawiy, ST., MT

mov ah, 0eh int 10h Buatlah program yang mengambil satu ketukan dari keyboard dan mencetak kelayar pada posisi cursor aktif.

18

Muhammad Taqiyyuddin Alawiy, ST., MT

BAB 5 PENGALAMATAN MEMORI Arsitektur x86 mengimplementasikan memori tersegmentasi, dimana memori dibagi menjadi bagian-bagian yang dapat dialamatkan oleh sebuah register index tunggal (16- bit) tanpa mengubah bagian selektor 16-bit. Masing-masing segment selalu berukuran 64 Kb (menggunakan offset 16-bit). Pengalamatan fisik memori pada 8086 menggunakan pengalamatan 20-bit (5 digit Hexa) yang dalam penulisannya dibagi atas segment dan offset, misalnya sebuah alamat 0040:0010 secara fisik adalah 00410.

Modus pengalamatan Register Kebanyakan instruksi pada 8086 beroperasi pada register “general purpose” dengan menspesifikasikan nama dari register sebagai operand pada instruksi, anda dapat mengakses kepada isi dari register tersebut dengan perintah MOV dest, source. Instruksi ini menduplikasi data dari operand source ke operand target. Sesuatu hal yang perlu diperhatikan adalah kedua operand harus berukuran yang sama. Contoh: mov ax, bx ;Copies the value from BX into AX mov dl, al ;Copies the value from AL into DL mov si, dx ;Copies the value from DX into SI mov sp, bp ;Copies the value from BP into SP mov dh, cl ;Copies the value from CL into DH mov ax, ax ;Yes, this is legal!

Sesuatu hal yang perlu diingat adalah register merupakan tempat yang terbaik untukmenyimpan variabel yang sering digunakan, instruksi yang menggunakan register adalah lebih pendek dan cepat dibandingkan dengan akses memori. Anda tidak dapat melakukan operasi mov terhadap suatu register segment ke register segment lainnya, untuk melakukan hal ini anda dapat menggunakan instruksi sebagai berikut : mov ax, cs mov ds, ax atau push ax pop ds

Modus pengalamatan Memori CPU 8086 menyediakan berbagai cara yang berbeda untuk mengakses memori, modus pengalamatan yang disediakan adalah displacement, base, displacement+base, base+indexed, dan displacement+base+indexed. Secara default jika tidak dituliskan, maka register segment yang digunakan untuk data adalah DS, dan untuk stack adalah SS.

Displacement Merupakan modus pengalamatan yang paling umum, dan yang paling mudah dipahami, displacement terdiri dari konstanta 16-bit yang menspesifikasikan alamat offset dari memori target. Instruksi MOV AL,[8088] adalah mengisi register AL dengan isi memori yang secara fisik ditunjuk oleh DS:8088, dan sebaliknya MOV [1234],DL adalah mengisi lokasi memori DS:1234 dengan nilai register DL. Pada contoh diatas, kita bekerja dengan register satu byte, bagaimana kalau kita menulis MOV AX,[1234], dimana AX adalah register word. Perintah ini akan menduplikasi nilai byte dari lokasi memori DS:1234 ke register AL, dan DS:1235 ke register AH.

19

Muhammad Taqiyyuddin Alawiy, ST., MT

Pemakaian modus displacement cocok jika kita mengacu pada variable tunggal, tetapi jika kita melakukan pengolahan Array maupun String tentu saja metode ini kurang sesuai. Secara default modus displacement bekerja pada data-segment, jika anda bermaksud mengacu pada alamat memori berdasarkan register segment lainnya, maka anda perlu menuliskan MOV AX, ES:[0017] yang artinya mengisi register AX dengan nilai word dari lokasi memori ES:0017. Jika source adalah immediately, secara default adalah dianggap sebagai WORD, jika anda immediately tersebut dimaksud adalah byte, maka anda perlu menambahkan kata byte contoh : mov [1234], 10 'akan mengisi byte 10 ke memori DS:1234 'dan byte 00 ke memori DS:1235 mov byte [1234],10 'akan mengisi byte 10 ke memori DS:1234

Modus Pengalamatan Register Indirect CPU 8086 memperbolehkan anda mengakses memori secara indirect dengan menggunakan modus pengalamatan indirect. Adapun register yang dapat digunakan untuk mengakses memori secara indirect adalah bx, bp, si dan di. Sebagaimana pada penulisan berikut: mov al, [bx] mov al, [bp] mov al, [si] mov al, [di]

Penulisan tersebut diatas akan menduplikasi nilai byte yang ditunjuk oleh ds:[bx], ss:[bp], ds:[si], dan ds[di] ke register al. Sesuatu hal yang perlu anda perhatikan adalah bahwa khusus untuk register BP secara default menggunakan SS. Jika anda ingin mengacu pada register segment lainnya, maka anda dapat menambahkan segment register pada penulisan. mov al, cs:[bx] mov al, ds:[bp] mov al, ss:[si] mov al, es:[di]

Modus pengalamatan Indexed Modus pengalamatan indexed menggunakan sintak penulisan sebagai berikut: mov al, [bx+disp] mov al, [bp+disp] mov al, [si+disp] mov al, [di+disp] mov al, ss:[bx+disp] mov al, es:[bp+disp] mov al, cs:[si+disp] mov al, ss:[di+disp]

Displacement merupakan suatu konstanta 8-bit ataupun 16-bit Jika bx berisi nilai $1000 dan konstanta disp adalah $234, maka MOV AL,[bx+234] adalah mengisi nilai byte dari lokasi DS:1234 ke register AL.

Modus Pengalamatan Base Index Pengalamatan modus base index secara sederhana mengkombinasikan register base (bx atau bp) dengan register index (si atau di), adapun bentuk penulisan yang ada yaitu: mov al, [bx+si]

20

Muhammad Taqiyyuddin Alawiy, ST., MT

mov al, [bx+di] mov al, [bp+si] mov al, [bp+di]

Secara default untuk register bx mengacu kepada DS, dan register bp mengacu kepada SS.

Modus pengalamatan Base+Index+Displacement Modus pengalamatan ini mengkombinasikan register base (bx atau bp) dengan register index (si atau di) dan ditambah dengan sebuah konstanta disp 8-bit atau 16-bit, adapun bentuk penulisan yang ada adalah: mov al, [bx+si+disp] mov al, [bx+di+disp] mov al, [bp+si+disp] mov al, [bp+di+disp]

Berdasarkan kombinasi dari berbagai modus pengalamatan tersebut diatas, maka pada CPU 8086 terdapat 17 bentuk pengalamantan yaitu : disp, [bx], [bp], [si], [di], disp[bx], disp[bp], disp[si], disp[di], [bx][si], [bx][di], [bp][si], [bp][di], disp[bx][si], disp [bx][di], disp[bp][si], and disp[bp][di].

Untuk memudahkan anda mengingat berbagai macam pengalamatan tersebut diatas.

Pertukaran nilai Perintah XCHG dapat digunakan untuk pertukaran data antara register dengan register, register dengan memori, memori dengan register. Contoh: Mov AX, 5 Mov [10], 7 XCHG AX,[10]

Mengambil nilai dari Tabel Perintah XLATB dapat digunakan untuk menduplikasi nilai byte dari DS:[BX+AL] ke register AL. Contoh: -a 100 0B40:0100 jmp 112 0B40:0102 db '0123456789ABCDEF' 0B40:0112 mov bx,102 0B40:0115 mov al,0a 0B40:0117 xlat 0B40:0118 Maka nilai al adalah “9”

Latihan 1. Misalkan anda diberi data sebagai berikut: Pada lokasi memori FFFF:0005 s/d FFFF:000C berisi BIOS Revision Date -d FFFF:0005 FFFF:0000 30 36 2F-31 32 2F 30 38 00 FC 00 06/12/08... FFFF:0010 34 12 00 00 00 00 00 00-00 00 00 00 00 00 00 00 4...............

Dan perintah untuk mencetak karakter ke STDOUT adalah sebagai berikut INT 21,2 - Display Output AH = 02

21

Muhammad Taqiyyuddin Alawiy, ST., MT

DL = character to output returns nothing - outputs character to STDOUT - backspace is treated as non-destructive cursor left - if Ctrl-Break is detected, INT 23 is executed Buatlah program yang dapat mencetak “BIOS Revision Date is 06/12/08”. 2. Misalkan anda diberi data sebagai berikut: INT 21,1 - Keyboard Input with Echo AH = 01 on return: AL = character from standard input device - waits for keyboard input from STDIN and echoes to STDOUT - returns 0 for extended keystroke, then function must be called again to return scan code - if Ctrl-Break is detected, INT 23 is executed Buatlah program yang dapat menerima 3 karakter, dan mencetak kembali “Anda mengetik huruf : XXX” 3. Misalkan anda diberi data sebagai berikut: INT 21,39 - Create Subdirectory (mkdir) AH = 39h DS:DX = pointer to ASCIIZ path name on return: CF = 0 if successful = 1 if error AX = error code (see DOS ERROR CODES) - creates specified subdirectory - returns error if directory already exists, element of the path is not found, directory full or write protected disk Catatan: ASCIIZ adalah suatu string yang diakhiri dengan null (0) Untuk program jenis COM, program line parameter dapat diperoleh pada Program Segment Prefix (PSP), dimana byte ke $80 menunjukan jumlah byte parameter pada command-line, dan byte ke $80 s/d $FF (127 byte) adalah Command-line yang diakhir dengan $0d. Buatlah program yang dapat membuat Subdirectori berdasarkan parameter yang dibuat user. -a 100 0B40:0100 xor bx,bx 0B40:0102 mov bl,[80] 0B40:0106 mov byte [bx+81],0 0B40:010B mov ah,39 0B40:010D mov dx,82 0B40:0110 int 21 0B40:0112 mov ah,4c 0B40:0114 int 21 0B40:0116 -n buatdir.com -rcx

22

Muhammad Taqiyyuddin Alawiy, ST., MT

CX 0000 :16 -w Writing 00016 bytes -q Untuk mencobanya ketik buatdir Hello Otomatis akan terbentuk sebuah Subdirectori baru dengan nama Hello. 4. Perbaiki soal latihan no 2 dan 3 bab sebelumnya dengan kemampuan penggunakan parameter.

23

Muhammad Taqiyyuddin Alawiy, ST., MT

BAB 6 PERULANGAN Program komputer umumnya terdiri dari tiga struktur dasar, yaitu urutan perintah, keputusan, dan perulangan. Suatu keputusan dilakukan untuk melakukan percabangan berdasarkan kondisi tertentu. Pada CPU 8086 menyediakan berbagai perintah untuk proses percabangan, baik yang bersifat unconditional jump maupun conditional jump.

Jump Tanpa kondisi Perintah unconditional melakukan transfer titik eksekusi ke titik lain dengan menggunakan perintah JMP. Secara sederhana perintah JMP dapat ditulis sebagai: JMP lokasi Contoh : 0B11:0100 jmp 112 0B11:0102 db 'hello world !',0d,0a,'$' 0B11:0112 mov ah,9 0B11:0114 mov dx,102 0B11:0117 int 21 0B11:0119 mov ah,4c 0B11:011B int 21

Jump dengan kondisi Berbeda dengan perintah JMP yang melakukan jump tanpa kondisi, perintah-perintah berikut ini melakukan jump (ke posisi -128 byte kebelakang atau 127 byte kedepan) berdasarkan kondisi. Perintah ini terbagi atas tiga kempok Jump berdasarkan bit Flag Instruksi Keterangan Kondisi Instruksi lawan JZ, JE Jump if Zero (Equal) ZF=1 JNZ, JNE JC, JB, JNAE Jump if Carry (Below, Not Above Equal) CF=1 JNC, JNB, JAE JS Jump if Sign SF=1 JNS JO Jump if Overflow OF=1 JNO JPE, JP Jump if Parity Even PF=1 JPO

Jump untuk bilangan bertanda Instruksi Keterangan Kondisi Instruksi lawan JE, JZ Jump if Equal (=). Jump if Zero. ZF =1 JNE, JNZ JNE, JNZ Jump if Not Equal (). ZF = 0 JE, JZ Jump if Not Zero. JA , JNBE Jump if Above (>). Jump if Not Below or Equal (not =). Jump if Not Below (not ). Jump if Not Less or Equal (not =). Jump if Not Less (not