pengenalan bahasa assembly

Upload: imawan-bangkit

Post on 08-Jul-2018

234 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/19/2019 Pengenalan Bahasa Assembly

    1/32

  • 8/19/2019 Pengenalan Bahasa Assembly

    2/32

    2 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 baiktentang 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 padalevel bahasa mesin, dan memiliki kemampuan disassembler serta melakukan assemblerinstruksi (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 RevisionPada 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 memoriyang ditampilkan dalam format Segment (FFFF) dan Offset (0000), pada bagian tengahadalah representasi isi memori pada masing-masing alamat dalam format hexadesimal,

  • 8/19/2019 Pengenalan Bahasa Assembly

    3/32

    3 Muhammad Taqiyyuddin Alawiy, ST., MT

    kemudian pada bagian kanan adalah representasi isi memori dalam format ASCII (sesuatu halyang perlu diperhatikan adalah tidak semua karakter ASCII dapat diprint dilayar, untukkarakter 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.

    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----------------CLEAROverflow------------------ov------------------- nvDirection------------------dn------------------- up (increment)Interrupt------------------- ei (enabled)-----di (disabled)Sign------------------------ng (neg)----------- pl (positive)Zero------------------------zr-------------------- nzAuxiliary carry-----------ac-------------------- na

    Parity-----------------------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 tuliske disk.Perubahan-R

    AX=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.

  • 8/19/2019 Pengenalan Bahasa Assembly

    4/32

    4 Muhammad Taqiyyuddin Alawiy, ST., MT

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

  • 8/19/2019 Pengenalan Bahasa Assembly

    5/32

    5 Muhammad Taqiyyuddin Alawiy, ST., MT

    Bab 2Pemrograman 8086

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

    Pengalamatan 8086Pengalamatan memori pada 8086 adalah terbagi atas segment-segment. Suatu alamat

    direpresentasikan dalam dua bagian yaitu segment dan offset yang masing-masing merupakanalamat 16-bit unsigned. Karena Offset merupakan pengalamatan 16-bit, maka jangkauanmasing-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 untukmendapat alamat fisik, angka pada Segment digeser sebesar 8 bit ke kiri, dan kemudiandijumlahkan kembali ke offset, sehingga FFFF:0005 merepresentasikan alamat fisik FFFF5,yaitu FFFF0+0005 = FFFF5.

    Data pada 8086Pada 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 terlebihdahulu dan diikuti dengan high byte, contoh misalnya kita ingin menyimpan $1234(hexadesimal), maka pada memori akan tersimpan $34 diikuti dengan $12, hal ini sejalanuntuk proses increment pada IP (instruction pointer) yang mengakses low byte terlebihdahulu.

    Bilangan Signed dan UnsignedCPU 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 dicapaiadalah 0 s/d 255, sedangkan untuk bilangan yang sign(bertanda) kita dapat merepresentasikannilai negatif -128 s/d -1, dan bilangan positif 0 s/d 127, sedangkan kalau dengan data word16-bit dapat menjangkau -32,768 s/d 32,767, dan dengan data double word (dword) 32-bitdapat menjangkau -2,147,483,648 s/d 2,147,483,647, sehingga secara umum n-bit dapatmenjangkau nilai -2 n-1 s/d 2 n-1-1.Sekarang kita telah mengerti bagaimana jangkauan representasi data bertanda, tetapi

    bagaimana caranya kerjanya pada CPU 8086. CPU 8086 menggunakan notasi two'scomplement (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 bilanganbertandauntuk 8-bit adalah sebagai berikut.Untuk mengkonversi suatu bilangan positif, menjadi bilangan negatif komplemen duadilakukan dengan cara sebagai berikut:1. Invers semua bit pada bilangan (aplikasikan operasi NOT)

    2. Tambah satu pada hasil Invers (aplikasikan operasi INC)Contoh:

  • 8/19/2019 Pengenalan Bahasa Assembly

    6/32

    6 Muhammad Taqiyyuddin Alawiy, ST., MT

    not 0000000111111110 + 1

    ------------11111111 (komplemen dua dari satu)

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

    Proses eksekusiProcessor mengambil perintah yang akan dieksekusi dari memori berdasarkan alamat

    yang ditunjuk oleh register CS (Code Segment) dan IP (Instruction Pointer). Pada sistimoperasi DOS, suatu program COM akan ditempatkan mulai dari offset $100. Nilai dariregister 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 yangsama, sehingga kita perlu menggunakan perintah JMP untuk melewati data, ataupun dataditempatkan dibawah kode.

    Register 8086Semua 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 AXdikenal sebagai accumulator untuk hasil artimatika, register BX sering digunakan untukmenyimpan alamat base, register CX sering digunakan untuk counter pada proses perulangan,sedangkan register DX sering untuk pengalamatan I/O dan data. Selain register general-

    purpose, terdapat juga index register yaitu SI (source index) dan DI (destination index) yangumumnya digunakan untuk pengalamatan dan operasi string. Kemudian terdapat registeruntuk pengelolaan data terkait dengan stack yaitu SP (Stack Pointer, BP (Base Pointer) danSS (Stack Segment). Untuk pengelolaan data dapat menggunakan DS (Data Segment) dan ES(Extra Segment). Selain register tersebut diatas, pada 8086 terdapat sebuah register specialyaitu register Flag yang menunjukan status yang dihasilkan dari hasil eksekusi dari suatuinstruksi atau operasi kendali lainnya.

    Ada enam flag sebagai flag status yaitu AF, CF, OF, SF, PF dan ZF, dan tiga sisanyaadalah flag kendali yaitu DF, IF dan TFPenjelasan dari masing-masing flag adalah sebagai berikut:

    AF (auxiliary flag), flag ini di set ketika terjadi carry out atau borrow pada 4 bitLSB. Flag ini digunakan pada saat instruksi logika dan aritmetika.

    CF (carry flag), flag ini diset ketika terjadi carry out atau overflow pada MSB. Inidigunakan oleh instruksi yang melakukan penjumlahan (ADC) dan pengurangan(SBB) angka banyak byte.

    OF (overflow flag), flag ini diset ketika suatu overflow aritmatika terjadi, dimanaterjadi kehilangan pada digit MSB karena ukuran dari hasil melebihi kapasitasdari 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 dapatdigunakan untuk mengecek kesalahan transmisi.

    ZF (zero flag), flag ini diset ketika hasil operasi adalah 0, digunakan untuksebagai hasil aritmatika dan perbadingan data.

  • 8/19/2019 Pengenalan Bahasa Assembly

    7/32

    7 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 menyebabkaninstruksi string ke auto-increment (count up), atau proses string darikiri ke kanan.

    IF (interrupt-enable flag), jika nilai IF di set, artinya memperbolehkan MPU untukmenangani eksternal maskable interrupt request. Jika nilai IF di clear artinyaMPU mengabaikan interrupt jenis tersebut. IF tidak ada efek terhadap nonmaskableinterrupt (NMI) dan internal generated interrupt.

    TF (trap flag), setting TF menempatkan processor pada modus single-step untukdebugging. Pada modus ini MPU secara otomatis membuat suatu internalinterrupt setelah setiap instruksi.

    StackSuatu stack adalah suatu bagian dari memori yang disisihkan untuk menyimpan alamat dandata ketika suatu subrutin dijalankan maupun terjadinya interrupt. Pada MPU 8086, suatu 64Kb segment dicadangkan sebagai stack. 16 bit alamat awal segment disimpan pada registerStack Segment (SS), dan register Stack Pointer (SP) mengandung 16-bit offset dimulai dariawal 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 dariTop of the stack saat ini adalah $5FFE0.

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

    JMP unconditional jumpdirect within segment 11101001 disp16bitdirect within segment-short 11101011 disp8bitindirect within segment 11111111 md100r/mdirect intersegment 11101010 offset:seg32bitindirect intersegment 11111111 md101r/m

    MOV move dataregister/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 address16bitaccu to mem. (AX/AL) 1010001w address16bitreg./mem. to segm. reg. 10001110 md0srr/msegm. reg. to reg./mem. 10001100 md0srr/m

    INT interrupt

    type specified 11001101 type8bittype 3 11001100

  • 8/19/2019 Pengenalan Bahasa Assembly

    8/32

    8 Muhammad Taqiyyuddin Alawiy, ST., MT

    Opcode ByteSetiap 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 akanditambahkan pada byte berikutnya. Opcode dari suatu instruksi transfer data, dapat dibagimenjadi tiga bagian opcode, bit d, dan bit w. bit d menspesifikasikan bit direction, bit wadalah 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 kememori, atau dari register ke register memiliki opcode 1000 10dw

    Byte PengalamatanByte 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=1000 BX+SI AL AX001 BX+DI CL CX010 BP+SI DL DX011 BP+DI BL BX100 SI AH SP101 DI CH BP110 ABS DH SI111 BX BH DIJenis 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 sourceadalah r/m dan destination adalah reg.Jika bit md=11, maka bit r/m juga mengacu kepada suatu register, denganmenggunakan 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-bitdispesifikasikan pada dua byte berikutnya. Secara default hal ini relatif terhadap registersegment DS.Jika bit md=01, maka merupakan offset 8 bit.Jika bit md=10, maka merupakan offset 16 bit.

    Contoh:EB 1068 65 6C 6C 6F 20 77 6F 72 6C 64 20 21 0D 0A 24B4 09BA 02 01CD 21B4 4CCD 21

    JMP unconditional jumpdirect within segment 11101001 disp16bitdirect within segment-short 11101011 disp8bitindirect within segment 11111111 md100r/mdirect intersegment 11101010 offset:seg32bitindirect intersegment 11111111 md101r/m

  • 8/19/2019 Pengenalan Bahasa Assembly

    9/32

    9 Muhammad Taqiyyuddin Alawiy, ST., MT

    EB 10EB = 11101011 = JMP

    jadi EB 10 adalah JMP 10 dalam hal ini adalah melakukan jump sebanyak 16 bytekedepan.

    68 65 6C 6C 6F 20 77 6F 72 6C 64 20 21 0d 0A 24dalam 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 09MOV move dataregister/mem. to/from register 100010dw mdregr/mimmediate to reg./mem. 1100011w md000r/m data8/16biimmediate to register 1011wreg data8/16bitmem. to accu (AX/AL) 1010000w address16bitaccu to mem. (AX/AL) 1010001w address16bitreg./mem. to segm. reg. 10001110 md0srr/msegm. reg. to reg./mem. 10001100 md0srr/mB4 = 10110100dimana w = 0, dan reg = 100, untuk reg = 100 dan w = 0 adalah AL

    jadi perintah B4 09 adalah MOV AH, 9BA 02 01BA = 10111010dimana w = 1, dan reg = 010, untuk reg = 010 dan w = 1 adalah DX02 01 adalah word $102 dengan low byte adalah 02 dan high byte adalah 01

    jadi perintah BA 02 01 adalah MOV DX, 102

    CD 21INT interrupttype specified 11001101 type8bittype 3 11001100CD = 11001101Jadi CD 21 adalah INT 21B4 4C adalah MOV AH, 4CCD 21 adalah INT 21

    Latihan

    1. Buatlah program bahasa mesin untuk program assembly berikut ini :JMP“Selamat Belajar Assembly”, CR, LF, “$” MOV AH, 9MOV DX, 102INT 21

    MOV AH, 4CINT 21

    2. Buatlah program bahasa mesin yang dapat menampikan nama dan nim anda

    dengan dua kali cetak.

  • 8/19/2019 Pengenalan Bahasa Assembly

    10/32

    10 Muhammad Taqiyyuddin Alawiy, ST., MT

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

    Bab 3Bahasa rakitan x86

    Pada bagian sebelumnya kita telah membahas tentang pemrograman 8086 denganmenggunakan bahasa mesin, dan pada bagian ini kita akan membahas tentangm

    pemrograman x86 Assembly.

    Mnemonic dan OpcodeSetiap 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.

    AssemblerSetiap program yang ditulis dengan menggunakan perintah assembly tidak dapat

    secara langsung dieksekusi oleh mesin, tetapi membutuhkan proses Assembly menggunakansoftware Assembler. Software Assembler yang paling sederhana adalah denganmenggunakan Debug.exe, dan untuk program yang lebih besar dan kompleks, tentu saja

    pemakaian Debug.exe tidak memadai, sehingga anda dapat menggunakan program assemberseperti TASM, MASM, dan NASM.

    Assembler pada DebugUntuk pembuatan program assembly dengan Debug dapat dilakukan dengan

    menggunakan perintah A (Assembly), adapun keterbatasan pada program Debug adalahhanya dapat membuat program COM, dan setiap program COM harus ditempatkan mulai darilokasi memori $100.

    Contoh:-a 1000B40:0100 jmp 1120B40:0102 db 'Hello World !',0d,0a,'$'0B40:0112 mov ah,90B40:0114 mov dx,1020B40:0117 int 21

    0B40:0119 mov ah,4c0B40:011B int 21

  • 8/19/2019 Pengenalan Bahasa Assembly

    11/32

    11 Muhammad Taqiyyuddin Alawiy, ST., MT

    0B40:011D-n helloasm.com-h 11D 100021D 001D-rcx

    CX 0000:1d-wWriting 0001D bytesProses diatas dapat dijelaskan bahwa pada awalnya kita memberikan perintah A(Assembler), dimana hasil assembler ditempatkan pada lokasi memori $100, kemudian kitamengetikan perintah-perintah dalam bahasa assembly (mnemonic), kemudian dilanjutkandengan menyimpan hasil assembler ke suatu file “helloasm.com”, dan melakukan penulisansebanyak $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 akanditampilkan hasil penjumlahan ($21d) dan hasil pengurangan ($1d).-h 11D 100021D 001D

    UnAssembler pada DebugProgram hasil assembler dapat di UnAssember dengan memberikan perintah U(UnAssembler) yang diikuti dengan lokasi memori bahasa mesin yang akan diUnAssembler.Contoh:D:\920403024\ASM>debug helloasm.com-u 1000BB0:0100 EB10 JMP 01120BB0:0102 48 DEC AX ;Hello World0BB0:0103 65 DB 650BB0:0104 6C DB 6C0BB0:0105 6C DB 6C0BB0:0106 6F DB 6F0BB0:0107 20576F AND [BX+6F],DL0BB0:010A 726C JB 01780BB0:010C 64 DB 640BB0:010D 2021 AND [BX+DI],AH0BB0:010F 0D0A24 OR AX,240A ;CR, LF, '$'0BB0:0112 B409 MOV AH,090BB0:0114 BA1201 MOV DX,01020BB0:0117 CD21 INT 210BB0:0119 B44C MOV AH,4C0BB0:011B CD21 INT 21 ;exit to DOSPada sisi kolom pertama adalah alamat memori yang masing instruksi mesin, pada kolomkedua adalah opcode dari masing-masing perintah, pada kolom terakhir adalah bahasaassembly.

    Latihan

    1. Buatlah program dalam bahasa assembly yang dapat mencetak “Belajar Bahasa

    Assembly !”.

  • 8/19/2019 Pengenalan Bahasa Assembly

    12/32

    12 Muhammad Taqiyyuddin Alawiy, ST., MT

    2. Buatlah program assembly berikut ini :-a 1000BB0:0100 jmp 1270BB0:0102 db 'Selamat belajar program assembly !',0d,0a,'$'0BB0:0127 mov cx,5

    0BB0:012A mov ah,90BB0:012C mov dx,1020BB0:012F int 210BB0:0131 loop 12a0BB0:0133 mov ah,4c0BB0:0135 int 210BB0:0137 mov ah,4c0BB0: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,0040mov ds,axor byte ptr [0017],40mov ah,1int 16mov ax,4c00int 21

    5. Cobalah program Caps_Off berikut ini :mov ax,0040

    mov ds,axand byte ptr [0017],bfmov ah,1int 16mov ax,4c00int 21

  • 8/19/2019 Pengenalan Bahasa Assembly

    13/32

    13 Muhammad Taqiyyuddin Alawiy, ST., MT

    Bab 4Interrupt dan Pemakaiannya

    Kadang-kadang proses dalam CPU mengalami interrupsi untuk kejadian-kejadianyang perlu segera mendapat respon, seperti pengetikan pada keyboard, proses I/O lainnya,dan clock tick untuk mengupdate waktu system. Pada prinsipnya interrupt terbagi ataseksternal, dan internal. Eksternal interrupt dibangkitkan oleh proses diluar program seperti

    proses I/O, dan clock, sedangkan proses Internal interrupt dibangkitkan oleh proses programseperti 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 saatini akan disimpan dan rutin interrupt handle umumnya akan mengembalikan kendali ke

    program termasuk semua nilai register seakan-akan tidak pernah terjadi sesuatu (hanyakehilangan beberapa siklus CPU), sedangkan Traps interrupt tidak akan kembali ke programdan menghentikan program tersebut.Catatan : Pada bagian ini kita akan lebih memfokuskan diri pada Software interrupt

    Maskable InterruptProcessor dapat mencegah interrupt dengan menggunakan mask bit khusus interrupt.

    Mask bit ini adalah bagian dari flag register pada microprocessor 8086 yang dikenal sebagaiinterrupt flag (IF), jika bit ini clear (IF=0), dan terjadi permintaan interrupt pada pin InterruptRequest, maka permintaan tersebut akandiabaikan.

    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 ituterjadi, processor menyelesaikan siklus memori saat ini, dan kemudian bercabang ke rutinkhusus yang ditulis untuk menangani permintaan interrupt.

    Interrupt pada 8086Adapun 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 interfacehardware.

    3. Interrupt jenis N (masing-masing interrupt memiliki nomor) dikirim ke CentralProcessing 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 Stack7. Isi dari register IP didorong ke Stack

  • 8/19/2019 Pengenalan Bahasa Assembly

    14/32

    14 Muhammad Taqiyyuddin Alawiy, ST., MT

    8. Isi dari vektor interrupt diambil, dari (4 x N) dan kemudian ditempatkan ke IP dandari (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 InterruptSoftware interrupt merupakan fungsi-fungsi yang disediakan oleh BIOS maupun

    sistim operasi, dimana fungsi-fungsi tersebut membuat tugas pemrograman menjadi lebihmudah, dari pada menulisnya sendiri dari awal, anda cukup mengirimkan nilai input yangdibutuhkan melalui register, kemudian memanggil rutin interrupt tersebut, dan selanjutnyarutin 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 directorydan file.

    Untuk melakukan panggilan terhadap rutin interrupt menggunakan perintahINT N Dimana N merupakan nomor interrupt yang dapat bernilai 0 s/d 255, yang umumnyaditulis secara hexadecimal 0 s/d FF Pada kenyataannya masing-masing interrupt terbagi lagisub-sub layanan, yang ditentukan pada nilai register AH, sebelum interrupt tersebutdipanggil, sehingga kita dapat memiliki 256 x 256 = 65536 fungsi layanan.

    Pemakaian InterruptSeperti 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 StringAH = 09DS: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 kitareview kembali program hello world sebelumnya. Dimana kita menggunakan INT $21 sublayanan AH=$9 untuk mencetak tulisan yang berada dioffset DX=$102. Jadi dalam hal iniAH dan DX merupakan parameter bagi INT $21.0B11:0100 jmp 1120B11: 0102 db 'hello world !',0d,0a,'$'0B11: 0112 mov ah,90B11:0114 mov dx, 1020B11:0117 int 210B11:0119 mov ah,4c0B11: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

  • 8/19/2019 Pengenalan Bahasa Assembly

    15/32

    15 Muhammad Taqiyyuddin Alawiy, ST., MT

    bekerja dengan rutin interrupt yang tidak mengembalikan hasil, tetapi hanya proses mencetakstring ke layar, berikut ini kita akan membahas rutininterrupt yang mengembalikan hasil.

    INT 21,8 - Console Input Without Echo

    AH = 08on 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 “ConsoleInput 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 diregister 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 akandikembalikan di register AL. Selanjutnya program dapat membandingkan nilai register ALdengan $41 (65 desimal).

    0B11:0100 mov ah,90B11:0102 mov dx,1130B11:0105 int 210B11:0107 mov ah,8 ;baca dari STDIN tanpa echo0B11:0109 int 21 ;karakter dikembalikan ke AL0B11:010B cmp al,410B11:010D jnz 1000B11:010F mov ah,4c0B11:0111 int 210B11: 0113 db „Ketik huruf A untuk selesai‟,0d,0a,‟$‟ 0B11:0131

    Latihan1. Misalkan diberikan suatu data interrupt sebagai berikut:INT 21,39 - Create Subdirectory (mkdir)AH = $39DS:DX = pointer to ASCIIZ path name

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

  • 8/19/2019 Pengenalan Bahasa Assembly

    16/32

    16 Muhammad Taqiyyuddin Alawiy, ST., MT

    on return:CF = 0 if successful= 1 if errorAX = error code if CF set (see DOS ERROR CODES)- changes the current directory to the directory specified

    by pointer DS:DXBuat program yang dapat mengaktifkan ke directory E:\Hendra.3. Misalkan diberikan suatu data interrupt sebagai berikut:INT 21,56 - Rename FileAH = $56DS:DX = pointer to old ASCIIZ path/filenameES:DI = pointer to new ASCIIZ path/filenameon return:AX = error code if CF set (see DOS ERROR CODES)- supports full pathnames and allows renaming files acrossdirectories and in DOS 3.x allows renaming subdirectories- does not support use of wildcards unless invoked from viaINT $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 berikutINT 10h / AH = 2 – setting posisi cursor.input:DH = baris.DL = kolom.BH = nomor halaman (0..7).Contoh:mov dh, 10mov dl, 20mov bh, 0mov ah, 2int 10h

    Buatlah program yang dapat mencetak tulisan “Hello World” pada lokasi 10,10.

    2. Jika anda diberi data sebagai berikutINT 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 menggunakanPOP.

  • 8/19/2019 Pengenalan Bahasa Assembly

    17/32

    17 Muhammad Taqiyyuddin Alawiy, ST., MT

    Contoh:Push DXPop DXBuatlah 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 berikutINT 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 COLOR0 0000 black1 0001 blue2 0010 green3 0011 cyan4 0100 red5 0101 magenta6 0110 brown7 0111 light gray8 1000 dark gray9 1001 light blueA 1010 light greenB 1011 light cyanC 1100 light redD 1101 light magentaE 1110 yellowF 1111 whiteJika nilai BH = $07, berarti warna background adalah black (0), dan warnaforeground adalah light gray (7).Jumlah Baris = 0 s/d 24Jumlah Kolom = 0 s/d 79

    Buatlah program yang mensimulasi perintah CLS pada DOS, dan mengeserkursor 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 danmengulung layer bila perlu, pencetakan dilakukan pada halaman yang aktif.

    Contoh:mov al, 'a'

  • 8/19/2019 Pengenalan Bahasa Assembly

    18/32

    18 Muhammad Taqiyyuddin Alawiy, ST., MT

    mov ah, 0ehint 10hBuatlah program yang mengambil satu ketukan dari keyboard dan mencetakkelayar pada posisi cursor aktif.

  • 8/19/2019 Pengenalan Bahasa Assembly

    19/32

    19 Muhammad Taqiyyuddin Alawiy, ST., MT

    BAB 5PENGALAMATAN MEMORI

    Arsitektur x86 mengimplementasikan memori tersegmentasi, dimana memori dibagimenjadi 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 RegisterKebanyakan 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 inimenduplikasi data dari operand source ke operand target. Sesuatu hal yang perlu diperhatikanadalah kedua operand harus berukuran yang sama.

    Contoh:mov ax, bx ;Copies the value from BX into AXmov dl, al ;Copies the value from AL into DLmov si, dx ;Copies the value from DX into SImov sp, bp ;Copies the value from BP into SPmov dh, cl ;Copies the value from CL into DHmov ax, ax ;Yes, this is legal!

    Sesuatu hal yang perlu diingat adalah register merupakan tempat yang terbaikuntukmenyimpan variabel yang sering digunakan, instruksi yang menggunakan registeradalah lebih pendek dan cepat dibandingkan dengan akses memori. Anda tidak dapatmelakukan operasi mov terhadap suatu register segment ke registersegment lainnya, untuk melakukan hal ini anda dapat menggunakan instruksi sebagai berikut:mov ax, csmov ds, axatau

    push ax pop ds

    Modus pengalamatan MemoriCPU 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, makaregister segment yang digunakan untuk data adalah DS, dan untuk stack adalah SS.Displacement

    Merupakan modus pengalamatan yang paling umum, dan yang paling mudahdipahami, displacement terdiri dari konstanta 16-bit yang menspesifikasikan alamat offsetdari memori target. Instruksi MOV AL,[8088] adalah mengisi register AL dengan isi memoriyang secara fisik ditunjuk oleh DS:8088, dan sebaliknya MOV [1234],DL adalah mengisilokasi 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 bytedari lokasi memori DS:1234 ke register AL, dan DS:1235 ke register AH.

  • 8/19/2019 Pengenalan Bahasa Assembly

    20/32

    20 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 bermaksudmengacu pada alamat memori berdasarkan register segment lainnya, maka anda perlumenuliskan MOV AX, ES:[0017] yang artinya mengisi register AX dengan nilai word dari

    lokasi memori ES:0017. Jika source adalah immediately, secara default adalah dianggapsebagai WORD, jika andaimmediately tersebut dimaksud adalah byte, maka anda perlu menambahkan kata bytecontoh :mov [1234], 10 'akan mengisi byte 10 ke memori DS:1234'dan byte 00 ke memori DS:1235mov byte [1234],10 'akan mengisi byte 10 ke memori DS:1234

    Modus Pengalamatan Register IndirectCPU 8086 memperbolehkan anda mengakses memori secara indirect dengan

    menggunakan modus pengalamatan indirect. Adapun register yang dapat digunakanuntuk 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 defaultmenggunakan SS. Jika anda ingin mengacu pada register segment lainnya, maka anda dapatmenambahkan segment register pada penulisan.

    mov al, cs:[bx]mov al, ds:[bp]mov al, ss:[si]mov al, es:[di]

    Modus pengalamatan IndexedModus 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-bitJika 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 IndexPengalamatan 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]

  • 8/19/2019 Pengenalan Bahasa Assembly

    21/32

    21 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+DisplacementModus pengalamatan ini mengkombinasikan register base (bx atau bp) denganregister 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 padaCPU 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 nilaiPerintah XCHG dapat digunakan untuk pertukaran data antara register dengan

    register, register dengan memori, memori dengan register.Contoh:Mov AX, 5Mov [10], 7XCHG AX,[10]

    Mengambil nilai dari Tabel

    Perintah XLATB dapat digunakan untuk menduplikasi nilai byte dari DS:[BX+AL]keregister AL.Contoh:-a 1000B40:0100 jmp 1120B40:0102 db '0123456789ABCDEF'0B40:0112 mov bx,1020B40:0115 mov al,0a0B40:0117 xlat0B40: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:0005FFFF: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 berikutINT 21,2 - Display OutputAH = 02

  • 8/19/2019 Pengenalan Bahasa Assembly

    22/32

    22 Muhammad Taqiyyuddin Alawiy, ST., MT

    DL = character to outputreturns 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 EchoAH = 01on 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 becalled again to return scan code- if Ctrl-Break is detected, INT 23 is executedBuatlah 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 = 39hDS:DX = pointer to ASCIIZ path nameon return:CF = 0 if successful= 1 if errorAX = error code (see DOS ERROR CODES)- creates specified subdirectory- returns error if directory already exists, element of the pathis not found, directory full or write protected diskCatatan: ASCIIZ adalah suatu string yang diakhiri dengan null (0)Untuk program jenis COM, program line parameter dapat diperoleh pada ProgramSegment Prefix (PSP), dimana byte ke $80 menunjukan jumlah byte parameter

    pada command-line, dan byte ke $80 s/d $FF (127 byte) adalah Command-lineyang diakhir dengan $0d.Buatlah program yang dapat membuat Subdirectori berdasarkan parameter yang

    dibuat user.-a 1000B40:0100 xor bx,bx0B40:0102 mov bl,[80]0B40:0106 mov byte [bx+81],00B40:010B mov ah,390B40:010D mov dx,820B40:0110 int 210B40:0112 mov ah,4c0B40:0114 int 210B40:0116

    -n buatdir.com-rcx

  • 8/19/2019 Pengenalan Bahasa Assembly

    23/32

    23 Muhammad Taqiyyuddin Alawiy, ST., MT

    CX 0000:16-wWriting 00016 bytes-q

    Untuk mencobanya ketik buatdir HelloOtomatis akan terbentuk sebuah Subdirectori baru dengan nama Hello.

    4. Perbaiki soal latihan no 2 dan 3 bab sebelumnya dengan kemampuan penggunakan parameter.

  • 8/19/2019 Pengenalan Bahasa Assembly

    24/32

    24 Muhammad Taqiyyuddin Alawiy, ST., MT

    BAB 6PERULANGAN

    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 kondisiPerintah unconditional melakukan transfer titik eksekusi ke titik lain dengan

    menggunakan perintah JMP. Secara sederhana perintah JMP dapat ditulis sebagai:JMP lokasiContoh :

    0B11:0100 jmp 1120B11:0102 db 'hello world !',0d,0a,'$'0B11: 0112 mov ah,90B11:0114 mov dx,1020B11:0117 int 210B11:0119 mov ah,4c0B11:011B int 21

    Jump dengan kondisiBerbeda 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 FlagInstruksi Keterangan Kondisi Instruksi lawanJZ, JE Jump if Zero (Equal) ZF=1 JNZ, JNEJC, JB, JNAE Jump if Carry (Below, Not Above Equal) CF=1 JNC, JNB, JAEJS Jump if Sign SF=1 JNSJO Jump if Overflow OF=1 JNOJPE, JP Jump if Parity Even PF=1 JPOJump untuk bilangan bertandaInstruksi Keterangan Kondisi Instruksi lawan

    JE, JZ Jump if Equal (=).Jump if Zero.ZF =1 JNE, JNZJNE, JNZ Jump if Not Equal (). ZF = 0 JE, JZJump if Not Zero.JA , JNBE Jump if Above (>).Jump if Not Below or Equal (not

  • 8/19/2019 Pengenalan Bahasa Assembly

    25/32

    25 Muhammad Taqiyyuddin Alawiy, ST., MT

    Jump if Carry.CF = 1 JNB, JAE, JNCJAE , JNB, JNC Jump if Above or Equal (>=).Jump if Not Below (not ).Jump if Not Less or Equal (not =).Jump if Not Less (not

  • 8/19/2019 Pengenalan Bahasa Assembly

    26/32

    26 Muhammad Taqiyyuddin Alawiy, ST., MT

    Catatan: ASCIIZ adalah suatu string yang diakhiri dengan null (0)Untuk program jenis COM, program line parameter dapat diperoleh pada ProgramSegment Prefix (PSP), dimana byte ke $80 menunjukan jumlah byte parameter

    pada command-line, dan byte ke $80 s/d $FF (127 byte) adalah Command-lineyang diakhir dengan $0d. Dan anda ditugaskan untuk membuat program yang dapat

    Subdirectori berdasarkan parameter yang diketikan oleh user, serta melaporkan apakah proses pembuatan Subdirectori berhasil atau tidak.Contoh:BuatDir HelloDirektori berhasil dibuatBuatDir HelloDirektori gagal dibuat-a 1000BB0:0100 jmp 1390BB0:0102 db 'Direktori berhasil dibuat.',0d,0a,'$'0BB0:011F db 'Direktori gagal dibuat.',0d,0a,'$'0BB0:0139 xor bx,bx0BB0:013B mov bl,[80]0BB0:013F mov byte [bx+81],00BB0:0144 mov ah,390BB0:0146 mov dx,820BB0:0149 int 210BB0:014B jc 1520BB0:014D mov dx,1020BB0:0150 jmp 1550BB0:0152 mov dx,11f0BB0:0155 mov ah,90BB0:0157 int 210BB0:0159 mov ah,4c0BB0:015B int 210BB0:015D-n buatdir.com-rcxCX 005C:5d-wWriting 0005D bytes

    -

    Latihan1. Gambarkan flowchart untuk contoh BuatDir.2. Buatlah program yang dapat membuat Subdirectori berdasarkan parameter yang

    dimasukan oleh pemakai, dan menampilkan status hasil.3. Buatlah program yang dapat menghapus Subdirectori berdasarkan parameter yang

    dimasukan oleh pemakai, dan menampilkan status hasil.

  • 8/19/2019 Pengenalan Bahasa Assembly

    27/32

    27 Muhammad Taqiyyuddin Alawiy, ST., MT

    BAB 8OPERASI LOGIKA

    Ada empat operasi logika yang sering dilakukan, yaitu AND, OR, XOR dan NOT,

    dimana pada masing-masing operasi dilakukan untuk pengaturan bit pada suatu data biner.

    Operasi ANDOperasi AND sering digunakan untuk operasi masking bit tertentu menjadi nol,

    maupun untuk mendeteksi apakah suatu bit aktif atau tidak, setelah dilakukan operasi AND,maka akan diperiksa ZF=1, jika benar artinya bit tersebut tidak aktif. Adapun operasi dariAND adalah sebagai berikut:

    0 and 0 = 00 and 1 = 01 and 0 = 0

    1 and 1 = 1

    Contoh:MOV AL, 'a' ; AL = 01100001bAND AL, 11011111b ; AL = 01000001b ('A')RETOperasi AND juga dapat digunakan untuk menghitung sisa bagi dest := dest MOD 2n

    and ax, 3 ;AX := AX mod 4and ax, 0Fh ;AX := AX mod 16and ax, 1Fh ;AX := AX mod 32and ax, 3Fh ;AX := AX mod 64and ax, 7Fh ;AX := AX mod 128mov ah, 0 ;AX := AX mod 256; (Same as ax and 0FFh)

    Operasi OROperasi OR sering digunakan untuk operasi masking bit tertentu menjadi satu, adapun

    operasi OR adalah sebagai berikut:

    0 or 0 = 00 or 1 = 11 or 0 = 11 or 1 = 1

    Example:

    MOV AL, 'A' ; AL = 01000001bOR AL, 00100000b ; AL = 01100001b ('a')RETPerintah OR juga sering digunakan untuk memeriksa apakah suatu register berisi nilainol.

    Contoh:CMP AX, 0 dapat ditulis juga OR AX, AX

  • 8/19/2019 Pengenalan Bahasa Assembly

    28/32

    28 Muhammad Taqiyyuddin Alawiy, ST., MT

    Operasi XOROperasi OR sering digunakan untuk membalikkan kondisi bit tertentu, maupun untukmenolkan suatu register, misalnya penulisan MOV AX, 0 dapat diganti dengan XORAX,AX,

    B80000 MOV AX,000031C0 XOR AX,AX ;lebih efisienDalam hal ini XOR AX, AX lebih pendek dari pada MOV AX,0Adapun operasi dari XOR adalah sebagai berikut :

    0 xor 0 = 00 xor 1 = 11 xor 0 = 11 xor 1 = 0

    Contoh:MOV AL, 00000111bXOR AL, 00000010b ; AL = 00000101bRET

    Operasi NOTOperasi NOT digunakan untuk membuat bilangan komplemen satu yaitu membalikankeaktifkan bit, adapun operasi NOT adalah sebagai berikut:

    NOT 0 = 1NOT 1 = 0

    Contoh:MOV AL, 00011011b

    NOT AL ; AL = 11100100b

    Pemakaian Operasi LogikaOperasi logika sering digunakan untuk memanipulasi status dari perangkat keras,

    misalnya untuk mendeteksi, mengaktifkan maupun mematikan bit-bit tertentu. Pada IBM PCCompatible data daftar peralatan dapat diperoleh dari data word di lokasi 0040:0010 padaBIOS Data Area dengan setting sebagai berikut ini: bit 0 Jika bernilai 0, artinya komputertidak memiliki drive disket bit 1 1 berarti terdapat numeric coprocessor bit 2-3 memorimotherboard: 01=16K; 10=32K; 11=64K+ (biasanya bernilai 00 pada PC modern, sehinggatidak ada artinya) Pada PS/2, jika bit 2 bernilai 1 ketika suatu mouse terdeteksi pada saatPOST bit 4-5 Video adaptor yang sedang aktif 00 = reserver, 01 = 40 clm color, 10 = 80- clmcolor, 11 = TTL Monochrome bit 6-7 Jumlah drive disket yang terdeteksi 00=1;01=2;10=3;11=4 bit 8 1 = hardware DMA tersedia (tidak reliable) bit 9-11 RS-232 serial portyang terdeteksi 000=0, 001=1, ... 100=4 ... 111=7 bit 12 1 = adapter game (joystick)terdeteksi oleh POST bit 13 (hanya pada PCjr) 1 = printer serial terpasang bit 14- 15 jumlahdari port printer parallel 00=0, 01=1, 10=2, 11=3 Sehingga untuk mendeteksi keberadaandrive disket kita dapat melakukan operasi AND word settting tersebut diatas dengan nilai $1,

    jika hasil operasi tersebut not zero (zero flag), maka berarti disk drive terpasang. Untukmendeteksi keberadaan coprocessor dapat dilakukan dengan melakukan operasi And wordsetting tersebut diatas dengan nilai $2.Operasi logika pada x86

    Tata cara penulisan operasi logika pada x86 dan register flag yang terpengaruhditunjukan pada tabel berikut ini: Format instruksi Fungsi Flags terpengaruh AND dest, src

  • 8/19/2019 Pengenalan Bahasa Assembly

    29/32

    29 Muhammad Taqiyyuddin Alawiy, ST., MT

    operasi logika and dari dua operand, dan mengembalikan hasil pada dest. CF, OF, PF, SF, ZF(AF tak terdefinisi) OR dest, src operasi logika or dari dua operand, dan mengembalikan hasil

    pada dest. CF, OF, PF, SF, ZF (AF tak terdefinisi) XOR dest, src operasi logika or dari duaoperand, dan mengembalikan hasil pada dest. CF, OF, PF, SF, ZF (AF tak terdefinisi) NOTdest mengembalikan invers bit pada dest TEST dest, src melakukan operasi AND dari dua

    operand dan mengupdate register CF, OF, PF, SF, ZF (AF tak terdefinisi) flag, tetapi tidakmengembalikan hasil pada dest.

    -a 1000B46:0100 mov ax,00400B46:0103 mov ds,ax0B46:0105 mov ax,[0010]0B46:0108 and ax,10B46:010B-tAX=0040 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0B46 ES=0B46 SS=0B46 CS=0B46 IP=0103 NV UP EI PL NZ NA PO NC0B46:0103 8ED8 MOV DS,AX-tAX=0040 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=0105 NV UP EI PL NZ NA PO NC0B46:0105 A11000 MOV AX,[0010] DS:0010=C822-tAX=C822 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=0108 NV UP EI PL NZ NA PO NC0B46:0108 250100 AND AX,0001-tAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=010B NV UP EI PL ZR NA PE NC

    Operasi tersebut diatas dapat dijelaskan bahwa pada awalnya akan diduplikasi nilai 0040 keregister AX, kemudian nilai dari register AX akan diduplikasi ke register DS, dan akandiduplikasi nilai dari lokasi memori 0040:0010 ke register AX, dan kemudian akan dilakukanoperasi AND register AX dengan nilai $1. Berdasarkan hasil T (Trace) yang dilakukanterlihat bahwa hasil akhir register AX adalah 0000 dan ZR (Zero flag aktif), berarti bahwatidak ada drive disket yang terpasang.

    org 100hpush dsmov ax,40hmov ds,axmov ax,[10h]pop dsand ax,2h

    jz cetak_tidak_adamov dx, offset ada

    jmp cetakcetak_tidak_ada:mov dx, offset tidak_adacetak:

    mov ah,9hint 21hmov ah,4ch

  • 8/19/2019 Pengenalan Bahasa Assembly

    30/32

    30 Muhammad Taqiyyuddin Alawiy, ST., MT

    int 21hada db 'ada coprocessor.',0dh,0ah,'$'tidak_ada db 'tidak ada coprocessor.',0dh,0ah,'$'

    Adapun program tersebut diatas dapat dijelaskan bahwa pada awalnya akan didorongnilai register DS ke stack, kemudian duplikasi nilai 40 ke register AX, kemudian diduplikasinilai AX ke DS, kemudian diduplikasi isi memori yang ditunjuk oleh DS: [0010] dalam halini adalah 0040:1000 ke register AX, dan kemudian register AX di AND dengan nilai $2, dantarik kembali nilai dari stack ke register DS, berdasarkan hasil operasi AND akan diuji nilaiZero flag, jika aktif akan dicetak „tidak ada coprocessor‟ dan sebaliknya akan dicetak „adacoprocessor‟. Sesuatu hal yang perlu diingat bahwa perintah TEST tidak menyimpan nilaihasil operasi, tetapi hanya mempengaruhi flag. Perintah test dapat digunakan untukmemeriksa apakah suatu register bernilai nol atau tidak, contoh: Sesuatu hal yang perludiingat bahwa operasi TEST tidak menyimpan nilai hasil operasi, tetapi hanya mempengaruhiflag. Test dapat digunakan untuk memeriksa apakah suatu register bernilai nol atau tidak.

    85C0 TEST AX,AX3D0000 CMP AX,0000

    Dalam hal ini TEST AX,AX lebih pendek dibandingkan dengan CMP AX,AX.

    LatihanByte pada 0040:0017 pada BIOS Data Area menunjukan status keyboard sebagai berikut ini :

    bit Status 0 shift sebelah kanan ditekan

    1 shift sebelah kiri ditekan

    2 ctrl ditekan3 alt ditekan4 keaktifkan ScrollLock5 keaktifan NumLock6 keaktifkan CapsLock7 Keaktifan Insert

    1. Buatlah program Assembly yang dapat menampilkan pesan keaktifan tombolCapsLock (CapsLock Aktif, CapsLock tidak Aktif).

    2. Buatlah program Assembly yang menon-aktifkan tombol Capslock3. Buatlah program Assembly yang mengaktifkan tombol NumLock

    4. Buatlah program Assembly yang dapat membalikkan status tombol Capslock (Onmenjadi Off dan sebaliknya).5. Modifikasi soal latihan nomor tiga bab sebelumnya agar password yang

    dimasukan tidak case sensitif.

    LATIHAN TAMBAHANCGA video memori untuk text mode terdapat dilokasi memori B800:0000 s/d

    B800:0F9F untuk halaman pertama. Masing-masing karakter yang ditampilkan pada layarterdiri dari menggunakan satu WORD, yaitu low byte adalah nilai ASCII dari karakter, danhigh byte adalah atribut (background dan foreground). Misalnya pada posisi baris 0, kolom 0

  • 8/19/2019 Pengenalan Bahasa Assembly

    31/32

    31 Muhammad Taqiyyuddin Alawiy, ST., MT

    ditampilkan huruf A dengan warna latarbelakang black dan warna tulisan light gray, maka isimemori B800:0000 adalah $41 dan isi memori B800:0001 adalah $07.

    1. Buatlah program yang dapat mengubah atribut layar menjadi latarbelakangmerah dan warna tulisan light gray tanpa mengubah tulisan yang ada.

    2. Buatlah program yang dapat mengubah karakter pada layar menjadi huruf besar semua.

    3. Buatlah program yang dapat mengubah karakter pada layar menjadi hurufkecil semua.

    4. Dengan menggunakan nested loop, buatlah program yang dapat menampilkanurutan angka berikut :12345 543211234 5432123 54312 541 5

    5. Buatlah program yang dapat menampilkan suatu daftar ASCII dengan tampilansebagai berikut:

  • 8/19/2019 Pengenalan Bahasa Assembly

    32/32

    REVERENSI

    Pemrograman Bahasa Assembly, Sutant o assembly Randall Hyde, The Art of Assembly Language

    http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/index.ht

    ml Documentation for 8086 assembler andemulator http://www.emu8086.com/assembler_tutorial

    http://pilipusbudidarma.files.wordpress.com/2012/03/assembly.pdfhttp://pilipusbudidarma.files.wordpress.com/2012/03/assembly.pdfhttp://pilipusbudidarma.files.wordpress.com/2012/03/assembly.pdfhttp://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/index.htmlhttp://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/index.htmlhttp://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/index.htmlhttp://www.emu8086.com/assembler_tutorialhttp://www.emu8086.com/assembler_tutorialhttp://www.emu8086.com/assembler_tutorialhttp://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/index.htmlhttp://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/index.htmlhttp://pilipusbudidarma.files.wordpress.com/2012/03/assembly.pdf