6
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. 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. 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.

pengenalan-bahasa-assembly.docx

Embed Size (px)

Citation preview

Page 1: pengenalan-bahasa-assembly.docx

BAB IPENGENALAN BAHASA MESIN & BAHASA

ASSEMBLY

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.

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 menggunakan bahasa tingkat tinggi dari pada menggunakan assembly. Pemakaian assembly akan

Page 2: pengenalan-bahasa-assembly.docx

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, sertaregister 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 Debug1. Aktifkan MS-DOS Prompt (Start, All Programs, Command Prompt2. Ubah keaktifkan ke folder anda

C:\> E:E:\> CD \920403024\ASME:\920403024\ASM>

3. Ketikan perintah Debug.exe untuk mengaktifkan program DebugE:\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 Revision

Page 3: pengenalan-bahasa-assembly.docx

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, 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 untukberbagai proses pengolahan oleh CPU, misalnya penjumlahan, pengurangi, perkalian, pembagian, sampai kepada operasi logika dan bit.

Untuk menampilkan isi Register dapat menggunakan perintah R (Register)-RAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0B40 ES=0B40 SS=0B40 CS=0B40 IP=0100 NV UP EI PL NZ NA PO NC0B40:0100 730B JNB 010DPada gambar diatas dapat dijelaskan bahwa nilai register AX adalah 0000, nilai registerBX adalah 0000, dan seterusnya. Kemudian register CS:IP menunjuk kelokasi0B40: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

Page 4: pengenalan-bahasa-assembly.docx

Overflow------------------ov-------------------nvDirection------------------dn-------------------up (increment)Interrupt-------------------ei (enabled)-----di (disabled)Sign------------------------ng (neg)-----------pl (positive)Zero------------------------zr--------------------nzAuxiliary carry-----------ac--------------------naParity-----------------------pe (even)---------po (odd)Carry-----------------------cy-------------------ncTrap 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 -RAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0B40 ES=0B40 SS=0B40 CS=0B40 IP=0100 NV UP EI PL NZ NA PO NC0B40:0100 730B JNB 010D-RAXAX 0000:1234-RAX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0B40 ES=0B40 SS=0B40 CS=0B40 IP=0100 NV UP EI PL NZ NA PO NC0B40: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.Program bahasa mesin anda yang pertamaAgar anda dapat lebih memahami perbedaan antara bahasa mesin dengan bahasaassembly, maka berikut ini kita akan membuat sebuah program yang menampilkan pesan“hello world!”.Bahasa mesin dalam bentuk representasi hexadesimalEB 1068 65 6C 6C 6F 20 77 6F 72 6C 64 20 21 0D 0A 24B4 09BA 02 01CD 21B4 4CCD 21Cara mengetikan bahasa mesin diatas :a. aktifkan program Debugb. ketik E 100 <enter> (E=Enter)

Page 5: pengenalan-bahasa-assembly.docx

c. ketik bilangan hexadecimal diatas diikuti dengan spasi, misalnya EB <spasi> 10<spasi> 68 <spasi> dan seterusnya sampai selesai dan diakhiri dengan <enter>d. ketik RCX <enter>, kemudian ketik 1D.e. ketik N hello.com <enter> (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).