bab i pengenalan bahasa mesin & bahasa...

32
1 Muhammad Taqiyyuddin Alawiy, ST., MT 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. 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).

Upload: dangdung

Post on 07-Feb-2018

226 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

1 Muhammad Taqiyyuddin Alawiy, ST., MT

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.

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

Page 2: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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 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,

Page 3: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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

Page 4: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

4 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 <enter> (E=Enter)

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

Page 5: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

5 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:

Page 6: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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

purpose, 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.

Page 7: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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

Page 8: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

8 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

Page 9: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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

Page 10: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

10 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

Page 11: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

11 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 !”.

Page 12: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

12 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

Page 13: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

13 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

Page 14: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

14 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

Page 15: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

15 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

Page 16: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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

Page 17: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

17 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'

Page 18: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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

Page 19: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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

Page 20: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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 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]

Page 21: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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+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

Page 22: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

22 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

Page 23: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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

Page 24: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

24 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 <=). CF = 0 and

ZF = 0 JNA, JBE

JB , JNAE, JC Jump if Below (<). Jump if Not Above or Equal (not >=).

Page 25: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

25 Muhammad Taqiyyuddin Alawiy, ST., MT

Jump if Carry. CF = 1 JNB, JAE, JNC

JAE , JNB, JNC Jump if Above or Equal (>=). Jump if Not Below (not <).

Jump if Not Carry. CF = 0 JNAE, JB JBE , JNA Jump if Below or Equal (<=).

Jump if Not Above (not >). CF = 1

or ZF = 1 JNBE, JA

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 (<>). Jump if Not Zero. ZF = 0 JE, JZ

JG , JNLE Jump if Greater (>). Jump if Not Less or Equal (not <=).

ZF = 0 and SF = OF

JNG, JLE JL , JNGE Jump if Less (<).

Jump if Not Greater or Equal (not >=). SF <> OF JNL, JGE JGE , JNL Jump if Greater or Equal (>=).

Jump if Not Less (not <). SF = OF JNGE, JL

JLE , JNG Jump if Less or Equal (<=). Jump if Not Greater (not >). ZF = 1

or SF <> OF

JNLE, JG

Pemakaian perintah Jumps 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

Page 26: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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

Direktori berhasil dibuat

BuatDir Hello

Direktori gagal dibuat

-a 100

0BB0:0100 jmp 139

0BB0:0102 db 'Direktori berhasil dibuat.',0d,0a,'$'

0BB0:011F db 'Direktori gagal dibuat.',0d,0a,'$'

0BB0:0139 xor bx,bx

0BB0:013B mov bl,[80]

0BB0:013F mov byte [bx+81],0

0BB0:0144 mov ah,39

0BB0:0146 mov dx,82

0BB0:0149 int 21

0BB0:014B jc 152

0BB0:014D mov dx,102

0BB0:0150 jmp 155

0BB0:0152 mov dx,11f

0BB0:0155 mov ah,9

0BB0:0157 int 21

0BB0:0159 mov ah,4c

0BB0:015B int 21

0BB0:015D

-n buatdir.com

-rcx

CX 005C

:5d

-w

Writing 0005D bytes

-

Latihan 1. 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.

Page 27: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

27 Muhammad Taqiyyuddin Alawiy, ST., MT

BAB 8

OPERASI 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 AND Operasi 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 dari

AND adalah sebagai berikut:

0 and 0 = 0

0 and 1 = 0

1 and 0 = 0

1 and 1 = 1

Contoh: MOV AL, 'a' ; AL = 01100001b

AND AL, 11011111b ; AL = 01000001b ('A')

RET

Operasi AND juga dapat digunakan untuk menghitung sisa bagi dest := dest MOD 2n

and ax, 3 ;AX := AX mod 4

and ax, 0Fh ;AX := AX mod 16

and ax, 1Fh ;AX := AX mod 32

and ax, 3Fh ;AX := AX mod 64

and ax, 7Fh ;AX := AX mod 128

mov ah, 0 ;AX := AX mod 256

; (Same as ax and 0FFh)

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

operasi OR adalah sebagai berikut:

0 or 0 = 0

0 or 1 = 1

1 or 0 = 1

1 or 1 = 1

Example:

MOV AL, 'A' ; AL = 01000001b

OR AL, 00100000b ; AL = 01100001b ('a')

RET

Perintah OR juga sering digunakan untuk memeriksa apakah suatu register berisi nilai

nol.

Contoh:

CMP AX, 0 dapat ditulis juga OR AX, AX

Page 28: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

28 Muhammad Taqiyyuddin Alawiy, ST., MT

Operasi XOR Operasi OR sering digunakan untuk membalikkan kondisi bit tertentu, maupun untuk

menolkan suatu register, misalnya penulisan MOV AX, 0 dapat diganti dengan XOR

AX,AX,

B80000 MOV AX,0000

31C0 XOR AX,AX ;lebih efisien

Dalam hal ini XOR AX, AX lebih pendek dari pada MOV AX,0

Adapun operasi dari XOR adalah sebagai berikut :

0 xor 0 = 0

0 xor 1 = 1

1 xor 0 = 1

1 xor 1 = 0

Contoh: MOV AL, 00000111b

XOR AL, 00000010b ; AL = 00000101b

RET

Operasi NOT Operasi NOT digunakan untuk membuat bilangan komplemen satu yaitu membalikan

keaktifkan bit, adapun operasi NOT adalah sebagai berikut:

NOT 0 = 1

NOT 1 = 0

Contoh: MOV AL, 00011011b

NOT AL ; AL = 11100100b

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

misalnya untuk mendeteksi, mengaktifkan maupun mematikan bit-bit tertentu. Pada IBM PC

Compatible data daftar peralatan dapat diperoleh dari data word di lokasi 0040:0010 pada

BIOS Data Area dengan setting sebagai berikut ini: bit 0 Jika bernilai 0, artinya komputer

tidak memiliki drive disket bit 1 1 berarti terdapat numeric coprocessor bit 2-3 memori

motherboard: 01=16K; 10=32K; 11=64K+ (biasanya bernilai 00 pada PC modern, sehingga

tidak ada artinya) Pada PS/2, jika bit 2 bernilai 1 ketika suatu mouse terdeteksi pada saat

POST bit 4-5 Video adaptor yang sedang aktif 00 = reserver, 01 = 40 clm color, 10 = 80- clm

color, 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 port

yang 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 jumlah

dari port printer parallel 00=0, 01=1, 10=2, 11=3 Sehingga untuk mendeteksi keberadaan

drive 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. Untuk

mendeteksi keberadaan coprocessor dapat dilakukan dengan melakukan operasi And word

setting tersebut diatas dengan nilai $2.

Operasi logika pada x86 Tata cara penulisan operasi logika pada x86 dan register flag yang terpengaruh

ditunjukan pada tabel berikut ini: Format instruksi Fungsi Flags terpengaruh AND dest, src

Page 29: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

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 dua

operand, dan mengembalikan hasil pada dest. CF, OF, PF, SF, ZF (AF tak terdefinisi) NOT

dest 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 tidak

mengembalikan hasil pada dest.

-a 100

0B46:0100 mov ax,0040

0B46:0103 mov ds,ax

0B46:0105 mov ax,[0010]

0B46:0108 and ax,1

0B46:010B

-t

AX=0040 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0B46 ES=0B46 SS=0B46 CS=0B46 IP=0103 NV UP EI PL NZ NA PO NC

0B46:0103 8ED8 MOV DS,AX

-t

AX=0040 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=0105 NV UP EI PL NZ NA PO NC

0B46:0105 A11000 MOV AX,[0010] DS:0010=C822

-t

AX=C822 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=0108 NV UP EI PL NZ NA PO NC

0B46:0108 250100 AND AX,0001

-t

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=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 ke

register AX, kemudian nilai dari register AX akan diduplikasi ke register DS, dan akan

diduplikasi nilai dari lokasi memori 0040:0010 ke register AX, dan kemudian akan dilakukan

operasi AND register AX dengan nilai $1. Berdasarkan hasil T (Trace) yang dilakukan

terlihat bahwa hasil akhir register AX adalah 0000 dan ZR (Zero flag aktif), berarti bahwa

tidak ada drive disket yang terpasang.

org 100h

push ds

mov ax,40h

mov ds,ax

mov ax,[10h]

pop ds

and ax,2h

jz cetak_tidak_ada

mov dx, offset ada

jmp cetak

cetak_tidak_ada:

mov dx, offset tidak_ada

cetak:

mov ah,9h

int 21h

mov ah,4ch

Page 30: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

30 Muhammad Taqiyyuddin Alawiy, ST., MT

int 21h

ada db 'ada coprocessor.',0dh,0ah,'$'

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

Adapun program tersebut diatas dapat dijelaskan bahwa pada awalnya akan didorong

nilai register DS ke stack, kemudian duplikasi nilai 40 ke register AX, kemudian diduplikasi

nilai AX ke DS, kemudian diduplikasi isi memori yang ditunjuk oleh DS: [0010] dalam hal

ini adalah 0040:1000 ke register AX, dan kemudian register AX di AND dengan nilai $2, dan

tarik kembali nilai dari stack ke register DS, berdasarkan hasil operasi AND akan diuji nilai

Zero flag, jika aktif akan dicetak „tidak ada coprocessor‟ dan sebaliknya akan dicetak „ada

coprocessor‟. Sesuatu hal yang perlu diingat bahwa perintah TEST tidak menyimpan nilai

hasil operasi, tetapi hanya mempengaruhi flag. Perintah test dapat digunakan untuk

memeriksa apakah suatu register bernilai nol atau tidak, contoh: Sesuatu hal yang perlu

diingat bahwa operasi TEST tidak menyimpan nilai hasil operasi, tetapi hanya mempengaruhi

flag. Test dapat digunakan untuk memeriksa apakah suatu register bernilai nol atau tidak.

85C0 TEST AX,AX

3D0000 CMP AX,0000

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

Latihan Byte 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 ditekan

3 alt ditekan

4 keaktifkan ScrollLock

5 keaktifan NumLock

6 keaktifkan CapsLock

7 Keaktifan Insert

1. Buatlah program Assembly yang dapat menampilkan pesan keaktifan tombol

CapsLock (CapsLock Aktif, CapsLock tidak Aktif).

2. Buatlah program Assembly yang menon-aktifkan tombol Capslock

3. Buatlah program Assembly yang mengaktifkan tombol NumLock

4. Buatlah program Assembly yang dapat membalikkan status tombol Capslock (On

menjadi Off dan sebaliknya).

5. Modifikasi soal latihan nomor tiga bab sebelumnya agar password yang

dimasukan tidak case sensitif.

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

B800:0F9F untuk halaman pertama. Masing-masing karakter yang ditampilkan pada layar

terdiri dari menggunakan satu WORD, yaitu low byte adalah nilai ASCII dari karakter, dan

high byte adalah atribut (background dan foreground). Misalnya pada posisi baris 0, kolom 0

Page 31: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

31 Muhammad Taqiyyuddin Alawiy, ST., MT

ditampilkan huruf A dengan warna latarbelakang black dan warna tulisan light gray, maka isi

memori B800:0000 adalah $41 dan isi memori B800:0001 adalah $07.

1. Buatlah program yang dapat mengubah atribut layar menjadi latarbelakang

merah 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 huruf

kecil semua.

4. Dengan menggunakan nested loop, buatlah program yang dapat menampilkan

urutan angka berikut :

12345 54321

1234 5432

123 543

12 54

1 5

5. Buatlah program yang dapat menampilkan suatu daftar ASCII dengan tampilan

sebagai berikut:

Page 32: BAB I PENGENALAN BAHASA MESIN & BAHASA …taqiyyuddinalawiy.com/wp-content/uploads/2013/03/pengenalan-bahas… · Jika proses Assembler menterjemahkan program yang ditulis dengan

32 Muhammad Taqiyyuddin Alawiy, ST., MT

REVERENSI

Pemrograman Bahasa Assembly, Sutanto 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 and

emulator http://www.emu8086.com/assembler_tutorial