Professional Documents
Culture Documents
Memahami Bahasa Assembly Lewat Arsitektu
Memahami Bahasa Assembly Lewat Arsitektu
1) John Socha and Peter Norton ASSEMBY LANGUAGE FOR THE PC, Third Edition, Brady Publishing, ISBN 1-56686-106-5 (c) 1992
BEBERAPA ALASAN BELAJAR BAHASA ASSEMBLY
• Karena tidak ada lapisan magis antara Anda (yang memakai Bahasa Assembly) dengan mesin, maka
Anda perlu mengerti benar arsitektur (VAX, Motorola 680000, Intel x86, ARM, dst.) dan sistem
operasi komputer sehingga nantinya mampu menopang teknik lanjutan dunia komputer.
• Agar mampu menulis lebih baik dalam Bahasa Tingkat Tinggi, Anda perlu memahami bagaimana,
memori, address dan instruksi bekerja di tingkat bawah. Banyak kesalahan pemrograman tidak
mudah ditemukan di tingkat tinggi; seringkali perlu menyelesaikannya dengan “menggali” internal
program untuk menemukan mengapa ia tidak bekerja. Ini dilakukan pada tingkatan Bahasa Assembly
hasil kompilasi.
• Faktanya semakin kompleks bahasa high-level, akan makin banyak ADT (abstract data type), tentunya
akan butuh lebih banyak overhead untuk mendukungnya. Dalam hal .NET, ada MSIL (Microsoft’s
Intermediate Language); Java memiliki Java Byte Code. Di sinilah Bahasa Assembly bersinar dimana ia
cocok untuk optimisasi speed. Semua tentang performansi dan efisiensi.
• Bahasa Assembly menyediakan kontrol penuh atas sumber daya sistem (register, memori, device dst.)
sehingga cocok untuk dipakai membangun device drivers, low-level embedded systems dan sistem
real-time.
• Bahasa Assembly merupakan batu penjuru pendidikan programmer, gerbang ke beberapa metodologi
pemrograman penting lainnya seperti teknik konstruksi dan algoritma compiler, teknik program
generation, decompilation, reverse engineering dan metode lain yang memerlukan pengetahuan
program biner. Dr Nikolai Bezroukov (www.softpanorama.org) berani mengatakan:
“Without solid base of assembler language programming, the whole building of programmer education is
built on sand”. .... http://www.softpanorama.org/Lang/assembler.shtml
• Donald Knuth, pengarang seri buku The Art of Computer Programming mengatakan:
“Some people [say] that having machine language, at all, was the great mistake that I made. I really don’t
think you can write a book for serious computer programmers unless you are able to discuss low-level
detail.”
Bahasa Tingkat Tinggi
• Bahasa Tingkat Tinggi adalah bahasa yang statement nya menyerupai
Bahasa Inggris.
• Contoh dalam Bahasa Tingkat Tinggi C++:
English-likeness C++
if (this is true) { 56 (7 == 9) {
peform this series of actions :;<= << “@ ABC D AEF =ℎF HAIF”;
} }
else { FLHF {
perform this series of actions :;<= << “@ ABC D AEF C566FEFB=”;
} }
• Bahasa Tingkat Tinggi dan abstraksi yang disediakannya tentu sangat
berguna bagi manusia, tetapi statement2 harus diterjemahkan dari
Tingkat Tinggi ke Tingkat Mesin agar dapat dieksekusi oleh komputer.
• Lihat ....... Translation Pipeline (Pipa Saluran Penerjemahan).
Sumber:
Brian R. Hall dan Kevin J. Slonka, “Assembly Programming and Computer Architecture for Software Engineer”. © 2018 Prospect Press, Inc.
ISBN: 978-1-943153-32-9
Translation Pipeline
• Program yang ditulis dalam Bahasa tingkat-tinggi harus ditranslasi atau High-Level
diterjemahkan ke dalam tingkat yang lebih rendah.
Language
• Translasi dilakukan lewat dua cara:
1.Interpreter, dimana translasi dilakukan baris-per-baris ketika program eksekusi,
contoh Bahasa Interpreter Tingkat-Tinggi: Python
2. Compiler, dimana translasi seluruh kode dilakukan sekali langkah sebelum eksekusi,
contoh Bahasa Compiler Tingkat-Tinggi: C++
• Statement bahasa tingkat-tinggi seperti !"# $ = & + 2; memiliki relasi one- Assembly
to-many dengan Bahasa Mesin; artinya satu statement bahasa tingkat-tinggi Language
berpasangan dengan beberapa instruksi Assembly dan Mesin.
• Assembly merupakan bentuk intermediasi (perantara) dalam translation decoding encoding
pipeline (pipa saluran translasi). Program Tingkat-Tinggi diterjemahkan ke
Assembly; selanjutnya Assembly diterjemahkan ke Bahasa Mesin berdasarkan
Instruction Set Architecture (ISA) dari prosesor. Proses dimana kode Assembly Machine
diterjemahkan menjadi Bahasa Mesin disebut encoding; proses kebalikannya Language
disebut decoding.1)
• Statement Bahasa Assembly memiliki relasi one-to-one dengan Bahasa
Mesin; artinya setiap instruksi Bahasa Assembly berpasangan dengan satu
instruksi Bahasa Mesin . Instruksi Bahasa Mesin dinyatakan dalam bentuk
perantara numerik (intermediate numeric form) yakni heksadesimal yang
berikutnya diterjemahkan dan diwujudkan secara fisik sebagai biner pada Digital Logic
hardware, yang kita sebut digital logic.
1) Beberapa compiler seperti Microsoft C Compiler langsung menerjemahkan kode tingkat-tinggi ke bahasa mesin dan membuat Assembly sebagai opsi.
Compiler lainnya seperti GCC menerjemahkan ke Bahasa Assembly lebih dulu, lalu kode Assembly diterjemahkan ke kode mesin.
Instruction Set Architecture
(ISA)
• Instruction Set Architecture (ISA) adalah aspek
arsitektur komputer yang terkait pemrograman.
• ISA memerinci instruksi2, register2, arsitektur
memori, data type dan atribut2 lain sesuai
prosesor tertentu. ISA bisa dibayangkan sebagai
bahasa komputer bercakap-cakap. Seperti terlihat
dalam gambar, ISA memfasilitasi komunikasi antara
software dan hardware.
• Dua jenis ISA:
1. Arsitektur Complex Instruction Set Computing (CISC) memiliki instruksi2 yang panjangnya (dalam
byte) beragam dan kompleks dalam arti satu instruksi tunggal mampu melakukan lebih dari satu task
(misal: mengakses lokasi memori dan melakukan aritmetika).
2. Arsitektur Reduced Instruction Set Computing (RISC) dimana semua instruksi sama panjang dan
hanya melakukan satu task (misal: mengakses lokasi memori).
• x86 dan x86_64 berarsitektur CISC. Intel dan AMD berbeda dalam implementasi tingkat
microarchitecture; mereka memiliki ISA yang sama.
Konsep CISC sudah hadir sejak 1960-an pertama kali diwakili oleh produk seperti IBM System z mainframe, PDP-8, PDP-10, PDP-11, Burroughs B5000, VAX,
Zilog Z80k, MOS Technology 6502, Motorola 68k dan x86. RISC hadir tahun 1980-an diwakili oleh DEC Alpha, AMD 29k, ARC, ARM, Atmel AVR, Blackfin, Intel
i860 dan i960, MIPS, Motorola 8800, PA-RISC, Power dan PowerPC, SuperH dan SPARC.
Proses Translasi (Penerjemahan)
Contoh Instruksi Assembly di-encode menjadi bahasa mesin Intel 32-bit
Tingkat Bahasa Kode
Bahasa C++ sum = 5;
Tingkat Tinggi
Bahasa GNU Assembler, AT&T syntax movl $0x5, -0x8(%ebp)
Assembly
Bahasa Mesin IA-32 C745F805000000
Digital Logic Binary (implementasi fisik) 1100 0111 0100 0101 1111 1000 0000 0101 0000
0000 0000 0000 0000 0000
• Bahasa Mesin adalah numerik sehingga Anda perlu memahami sistem bilangan terutama heksadesimal dan
biner.
• Bahasa Mesin spesifik terhadap prosesor. Akan tetapi dalam satu keluarga prosesor punya bahasa mesin
yang umum (common) sehingga kode yang ditulis untuk prosesor x86 atau x86_64 bisa jalan pada prosesor
mana saja asalkan bagian keluarga itu.
• Kode Assembly tidak portabel antar keluarga prosesor berbeda. Misalkan kode ditulis untuk keluarga
prosesor x86 tidak akan jalan pada prosesor2 seperti SUN Sparc, IBM 370 dan ARM Cortex.
• Keluarga prosesor x86 / x86_64 termasuk prosesor2 Intel (seperti Pentium, Core-Duo, dan Core i7), dan
prosesor2 AMD (seperti Athlon, Phenom, dan Opteron). Baik Intel maupun AMD menerapkan x86
instruction set dalam desain prosesor mereka, tetapi teknik desain prosesor yang dipakai untuk
menerapkan instruction set yang dikenal sebagai microarchitecture jelas2 sangat berbeda.
• Ketika RISC pertama kali dikembangkan, semata-mata disebabkan akses memori dan HDD sangat
lambat. Complex Instructions yang gendut yang ada dalam CPU x86 model lama sangat
membebani. Itulah sebabnya komputer seperti MAC dan Compaq yang berbasiskan DEC Alpha
jauh meninggalkan sistem Intel dan AMD x86 saat itu. Akan tetapi, sejak Intel mengeluarkan
Pentium III dan AMD mendorong Athlon, terlihat x86 mulai melewati RISC di pasar workstation
dan server. Ini disebabkan adanya perbaikan besar-besaran dalam hal efisiensi caching dan
memori pada CPU x86. Setelah bagian ini diperbaiki, bagian lain dari CPU dengan mudah disetél
(tune) untuk menandingi RISC dan dalam waktu singkat CPU RISC menghilang dari arus utama
komputasi.
• Namun pada tahun 2013 dari dunia mobile, ARM mengusung kembali RISC dengan konsep ARM-
based SoC (System on Chip). Konsepnya cukup sederhana yakni membangun suatu device yang
kecil, efisien energi yang mampu memanfaatkan memori dan siklus prosesor seefisien mungkin.
Ini juga yang sedang dicoba oleh pabrikan x86. Akan tetapi mengapa lebih banyak pabrikan
mendukung ARM-based SoC dibanding x86? Semata-mata ini disebabkan masalah lisensi.
Pertempuran sudah dimulai dan akan makin memanas. ARM akan berusaha dari dunia mobile
merasuk ke desktop bahkan jika dimungkinkan ke dunia workstation dan server. Tentunya Intel
tidak akan diam begitu saja. Mari kita lihat pertarungan teknologi abad 21 yang seru ini.
Sisi Perangkat Keras
Mikroprosesor, Register dan Memori
I/O Interface
Intel 4004 Intel 8008 Intel 8080 Intel 8086 Intel 8088 Intel 80286 Intel 80386 Intel 80486
VKRZQLQ)LJXUHZKHUHWKHFRQGXFWLYHFKDQQHOVDSSHDUDVDOLJKWHUFRORUGXHWRWKHSUHVH
FRSSHUEHWZHHQWKHOD\HUVRIILEHUJODVV
7KHPDLQEXVLQDFRPSXWHUVKRZQLQ)LJXUHLVWKHV\VWHPEXVZKLFKLVDFWXDOO\DFROOHF
WKUHHVHSDUDWHEXVHVWKHGDWDEXVWKHDGGUHVVEXVDQGWKHFRQWUROEXV7KHV\VWHPEXVLVKR
&38FRPPXQLFDWHVZLWKPHPRU\DQGRWKHU,2GHYLFHVLQDFRPSXWHU6XFKFRPSRQHQWVFRQ
Arsitektur Prosesor Intel® HDFK RI WKH WKUHH EXVHV VR SURSHU FRPPXQLFDWLRQ FDQ RFFXU 7KH GDWDEXV LV WKH EXV WKDW WUD
LQVWUXFWLRQV VXFKDVORDGIURPPHPRU\VWRUHLQPHPRU\UHDGIURPWKHRSWLFDOGULYHHWF DQ
EHWZHHQ FRPSRQHQWV ,Q RUGHU IRU LQIRUPDWLRQ WR EH WUDQVIHUUHG WKH FRUUHFW PHPRU\ DGGUHVV
LQVWUXFWLRQVDQGRUGDWDPXVWDOVREHVHQW&RPPXQLFDWLRQRIDGGUHVVHVLVWKHSXUSRVHRIWKHD
EXV 7KH FRQWUROEXV KDV DQ HTXDOO\ LPSRUWDQW UROH LQ WKH FRPPXQLFDWLRQ RI V\VWHP FRPSRQH
• Keluarga CPU Intel® dikelompokkan sebagai mesin berarsitektur Von Neumann.1) WUDQVIHUV VLJQDOV EHWZHHQ FRPSRQHQWV WR HQVXUH WKDW WKH\ DUH V\QFKURQL]HG IRU DSSURSULDWHO\
FRPPXQLFDWLRQ HJRQHFRPSRQHQWGRHVQRWWU\WRUHDGIURPDGHYLFHWKDWLVEXV\
data sesama mereka dengan menaruh data pada data bus. Control bus berisi
sinyal2 yang menentukan arah lalulintas data (ke/dari memori dan ke/dari piranti
I/O).
1) Arsitektur komputer lainnya bernama Arsitektur Harvard memisahkan penyimpanan
(storage) dan jalur lintas (bus) instruksi dengan storage dan bus data. Dengan demikian
diperlukan memory register untuk instruksi dan memory register lainnya untuk data.
Arsitektur Harvard lebih rumit tetapi saluran yang terpisah menghilangkan kemacetan
(bottleneck) yang mungkin terjadi pada Arsitektur Von Neumann.
Sekilas Prosesor Intel®
• 8088/80188. Prosesor2 ini memiliki register2 16-bit, data bus 8-bit dan mampu mengalamatkan sampai
1 mega byte memori internal. Sekalipun register2 mampu memproses 2 byte sekaligus, data bus hanya
mampu mengirim 1 byte saja. 80188 disajikan sama dengan 8088 dengan sedikit tambahan instruksi.
Prosesor2 ini bekerja dalam apa yang dikenal sebagai real mode, yakni satu program pada satu waktu.
• 8086/801861). Prosesor2 ini mirip dengan 8088/80188, tetapi data bus 16-bit dan mampu bekerja lebih
cepat. 80186 disajikan sama dengan 8086 dengan tambahan sedikit instruksi.
• 80286. Prosesor2 ini bekerja lebih cepat dibanding prosesor2 pendahulunya dan mampu
mengalamatkan sampai 16 mega byte. Ia dapat beroperasi baik dalam real mode (kompatibel dengan
8088/8086) maupun dalam protected mode untuk multitasking (menjalankan lebih dari satu job pada
satu waktu) dan menangani memori sampai 16MB.
• 80386. Prosesor ini memiliki register2 32-bit dan data bus 32-bit serta mampu mengalamatkan sampai 4
giga byte memori. Ia mampu beroperasi baik dalam real mode maupun protected mode (menjaga
kompatibilitas dengan 80286) untuk multitasking, dan tambahan satu lagi: virtual mode sehingga
mampu menangani memori sampai 4GB.
• 80486. Prosesor ini juga memiliki register2 32-bit dan data bus 32-bit (walaupun beberapa clones punya
data bus 16-bit) dan dirancang untuk peningkatan kinerja. Prosesor ini masih banyak dipakai sampai
sekarang sebagai jantung peralatan kontroler seperti kontroler2 aviasi di pesawat terbang.
• Pentium (atau 80586). Prosesor ini memiliki register2 32-bit dan data bus 64-bit serta mampu
mengeksekusi lebih dari satu instruction per clock cycle (Intel mengadopsi nama “Pentium” karena,
berbeda dengan angka, nama dapat dibuat hak cipta).
• PentiumPro (atau 6x86). Prosesor ini lebih jauh meningkatkan kapasitas register2 dan data bus.
Contohnya dimana koneksi prosesor terdahulu ke storage cache pada system board menyebabkan
delays (tundaan), prosesor ini dikoneksikan ke sebuah storage cache yang built-in lewat 64-bit wide bus .
1) Intel membuat prosesor 8085 (Maret 1976) lebih dahulu sebelum 8086. 8085 masih 8-bit tetapi mampu melakukan operasi2 data 16-bit. 8085 banyak
diterapkan untuk terapan mikrokontroler karena built-in serial I/O dan 5 prioritized interrupts. Prosesor ini menyelamatkan Intel dalam persaingan komputer
desktop berbasis CP/M yang saat itu mayoritas dikuasai CPU dari Zilog z80. Zilog didirikan oleh mantan pegawai Intel, Federico Faggin, tahun 1974.
Evolusi Mikroprosesor Intel
Product 8080 8085 8086 8088 80286 80386 80486
Tahun diperkenalkan 1974 1976 1978 1979 1982 1985 1989
Clock rate (MHz) 2–3 3–8 5 – 10 5–8 6 – 16 16 – 33 25 – 50
Jlh. transistor 4500 6500 29.000 29.000 130.000 275.000 1.2 juta
Memori Fisik 64K 64K 1M 1M 16M 4G 4G
Internal data bus 8 8 16 16 16 32 32
External data bus 8 8 16 8 16 32 32
Address bus 16 16 20 20 24 32 32
Data type (bits) 8 8 8, 16 8, 16 8, 16 8, 16, 32 8, 16, 32
Catatan:
1. Arsitektur 80386SX sama dengan 80386 kecuali external data bus nya 16 bit dalam SX bukan 32 bit, dan
address bus nya 24 bit bukan 32; oleh karena itu memori fisiknya 16MB.
2. Clock rate berada di sekitaran rate saat produk diperkenalkan; beberapa rate telah meningkat selama
waktu ini.
Perbedaan Antara Intel® Core i3, i5 dan i7
• Awalnya perlombaan dalam clock speed untuk mengejar
work per cycle. Akan tetapi sekarang berlomba menggunakan
Core (pertama diperkenalkan oleh AMD)
• i3 datang dengan Hyper-Threading
• i5 memiliki fitur Hyper-Threading dan Turbo boost
• i7 datang dengan 2 sampai 8 core dengan fitur Hyper-Threading, Turbo boosting, dan
kemampuan Overclocking.
• Hyper-Threading adalah teknologi yang memampukan satu prosesor tunggal berlaku seperti dua prosesor
terhadap sistem operasi dan program2 aplikasi yang menggunakannya.
• Intel® Turbo Boost Technology mampu mempercepat kinerja prosesor dan grafis mencapai beban puncaknya
(peak loads). Teknologi ini mampu meningkatkan frekuensi Core secara otomatis sehingga jauh lebih cepat
daripada frekuensi yang tercatat seharusnya. Tingkat kecepatan prosesor tersebut bisa bekerja maksimal
dalam batasan daya, suhu, dan spesifikasi dari kekuatan desain termal (TDP). Hasilnya, Anda akan melihat
bagaimana ia bereaksi dalam hal peningkatan kinerja aplikasi tunggal dan multi-threaded.
Arsitektur Prosesor 8086 • Prosesor dipartisi menjadi dua logical units: execution
unit (EU) dan bus interface unit (BIU). Tugas EU adalah
mengeksekusi instruksi2, BIU mengantar instruksi2 dan
data ke EU. EU berisi sebuah arithmetic and logic unit
(ALU), sebuah control unit (CU) dan sejumlah register.
Gabungan ini memampukan prosesor mengeksekusi
instruksi2 dan operasi2 aritmetika dan logika.
• Tugas utama BIU adalah mengelola bus control unit,
segment register dan instruction queue. BIU
mengendalikan bus2 yang mengirim data ke EU, ke
memori dan ke piranti I/O eksternal dimana segment
register mengendalikan pengalamatan memori.
• Tugas lain BIU adalah menyediakan akses bagi
instruksi2. Karena instruksi2 sebuah program yang
sedang eksekusi berada dalam memori, BIU harus
mengakses instruksi2 dari memori dan menaruhnya
dalam instruction queue, yang bervariasi dalam
ukurannya tergantung prosesor. Fitur ini membuat BIU
mampu melihat lebih dulu (look ahead) dan
menjemput lebih dulu (prefetch) instruksi2 sehingga
selalu ada antrian instruksi yang siap untuk dieksekusi.
• EU dan BIU bekerja secara paralel, dimana BIU selalu menjaga satu langkah di depan.
EU mengabarkan BIU kapan ia perlu mengakses data dalam memori atau piranti I/O.
Juga, EU meminta instruksi2 mesin dari antrian instruksi BIU. Instruksi paling atas yang
sedang eksekusi saat ini dan sementara EU diduduki oleh instruksi yang eksekusi, BIU
sudah menjemput instruksi lain dari memori. Penjemputan (fetching) ini tumpang
tindih dengan eksekusi dan ini ”mempercepat” pemrosesan.
• Prosesor2 sampai 80486 dikenal sebagai single-stage pipeline dimana ada
keterbatasan harus menyelesaikan satu instruksi sebelum memulai yang baru.
Pipelining adalah cara sebuah prosesor membagi satu instruksi menjadi beberapa
langkah berturutan dalam rangka menggunakan sumberdaya2 berbeda. Pentium
memiliki five-stage pipelined structure; PentiumPro memiliki 12-stage superpipelined
structure. Fitur inilah yang membuat prosesor seolah2 mampu menjalankan banyak
operasi secara paralel.
• Masalah yang dihadapi perancang adalah karena prosesor bekerja jauh lebih cepat
dari memori, ia mesti menunggu memori menyerahkan instruksi2. Untuk mengatasi
masalah ini, prosesor canggih pada gilirannya memiliki kemampuan lebih dalam
dynamic execution, yang terdiri dari tiga unsur:
1. Multiple branch prediction, dimana prosesor melihat lebih dulu (look ahead) sejumlah langkah
untuk memprediksi apa yang akan diproses berikutnya;
2. Dataflow analysis, yang menganalisis kebergantungan (dependencies) antar instruksi2; dan
3. Speculative execution, yang memanfaatkan hasil dari dua unsur tadi untuk berspekulasi
mengeksekusi instruksi2.
• Sebagai programmer, Anda tidak mungkin mengakses fitur2 prosesor di atas. Sudah
bawaan lahir dari perangkat keras yang tidak bisa disentuh-sentuh.
System Clock
• Bersamaan dengan system bus, komunikasi antar komponen memerlukan potongan puzzle
lainnya. Tanpa komponen yang berlaku sebagai metronom operasional (metronom adalah
alat yang menjaga pemusik agar ritmenya konsisten selama bermain dengan melakukan
“ketukan” atau “dentang” atau “ticking” atau “beat”), komponen2 bisa saja mengirim data
lewat bus2 pada interval waktu yang acak dan komponen pada ujung lain bisa sudah siap
atau belum menerima komunikasi.
• Komponen motherboard yang bernama system clock menyelesaikan masalah komunikasi ini
dengan berdenyut pada laju yang konstan (constant rate), semata2 untuk menjaga waktu
komponen2 komputer.
• Satuan dasar system clock adalah clock cycle yang
terdiri dari up-tick (setengah pertama dari siklus,
dimana tegangan berjalan dari rendah ke tinggi, atau
dalam biner 0 ke 1) dan down-tick (setengah kedua
dari siklus, dimana tegangan berjalan dari tinggi ke
rendah, atau dalam biner 1 ke 0).
)LJXUH&ORFNF\FOH
7KHEDVHXQLWIRUWKHV\VWHPFORFNLVDFORFNF\FOHZKLFKFRQVLVWVRIDQXSWLFN WKHILUVWKDOIRIWKH
F\FOHZKHUHWKHYROWDJHJRHVIURPORZWRKLJKRULQELQDU\WR DQGDGRZQWLFN WKHVHFRQGKDOI
RIWKHF\FOHZKHUHWKHYROWDJHJRHVIURPKLJKWRORZRULQELQDU\WR )LJXUHVKRZVDFORFN
F\FOH
'DWDWUDQVIHURSHUDWLRQVUDLVHWKHLVVXHRIGDWDDQGLQVWUXFWLRQVWRUDJH,QRUGHUWRVWRUHGDWDDQG
LQVWUXFWLRQVDFRPSXWHUPXVWKDYHPHPRU\:KHQGLVFXVVLQJPHPRU\ZHPXVWEHFOHDUDERXWZKLFK
W\SHRIPHPRU\LVXQGHUFRQVLGHUDWLRQ:HFDQWKLQNRIWKHGLIIHUHQWNLQGVRIPHPRU\LQDFRPSXWHUDV
DKLHUDUFK\DVGHSLFWHGLQ)LJXUH
(Untuk Referensi Saja)
Eksekusi Instruksi ,Q DGGLWLRQ WR EHLQJ DEOH WR DGGUHVV PRUH 5$0 [B SURFHVVRUV DOVR KDYH HLJKW PRUH JHQHUDO
SXUSRVHUHJLVWHUVUWKURXJKU
• Agar sebuah instruksi dieksekusi (mis. ADD), urutan langkah2 yang dikenal sebagai instruction
,QVWUXFWLRQ([HFXWLRQ
execution cycle perlu diikuti. Bagi programmer instruksi ADD seperti proses satu-langkah, tetapi
prosesor membaginya menjadi sub-tasks,,QRUGHUIRUDQLQVWUXFWLRQWREHH[HFXWHG
atau stages (atau tahapan),HJ$'' DVHTXHQFHRIVWHSVNQRZQDVWKHLQVWUXFWLRQ
yang berisi eksekusi instruksi.
Jumlah stages beragam dari sedikitnyaH[HFXWLRQF\FOHLVIROORZHG$OWKRXJKWKH$''LQVWUXFWLRQLVRQO\RQHLQVWUXFWLRQDQGPLJKWVHHPOLNH
tiga stages pada level abstrak sampai 20 atau lebih ditemukan
dalam prosesor high-end modern.D RQHVWHS SURFHVV WR
Jadi ketika D SURJUDPPHU PDQ\
programmer VPDOOHUinstruksi
menulis VXEWDVNV RUADD
VWDJHV untuk
FRPSULVH LQVWUXFWLRQ
H[HFXWLRQterjadi
menjumlahkan dua bilangan, ada 20 langkah 7KH QXPEHU RI VWDJHV FDQlayar
di belakang YDU\ IURP
yang DVbergerak
IHZ DV WKUHHsesuai
VWDJHV DWexecution
DQ DEVWUDFW OHYHO )LJXUH
WRXSZDUGVRIRUPRUHVWDJHVLQPRGHUQKLJKHQGSURFHVVRUV
cycle agar supaya menghasilkan penjumlahan.
• View yang umum dari cycle tersebut
adalah tiga langkah: Fetch, Decode dan
Execute. Selama tahapan Fetch, CPU
mengambil (retrieve) instruksi berikutnya
yang akan dieksekusi (yakni dari penunjukkan
RIP/EIP/IP ke memori). )LJXUH6WDJHLQVWUXFWLRQH[HFXWLRQF\FOH
• Pada tahapan Decode, CPU menentukan instruksi apa itu dan data apa yang ia operasikan. Selama
6RZKHQDSURJUDPPHUZULWHVWKH$''LQVWUXFWLRQWRFRPSXWHWKHVXPRIWZRYDOXHVVWHSVPD\
tahapan ini, CPU melihat bit2 instruksi (0 dan 1) dan mampu menentukan jenis operasi (yakni ADD,
RFFXUEHKLQGWKHVFHQHVWRSURFHHGWKURXJKWKHH[HFXWLRQF\FOHLQRUGHUWRSURGXFHWKHVXP
SUB, MOV) dan apakah perlu tidaknya $operasiFRPPRQ KLJKOHYHO
menyertakan YLHZ RI operand2.
WKH F\FOH LV VHHQ
JikaDV WKUHH
operasiVWHSVmemerlukan
)HWFK 'HFRGH DQG ([HFXWH
operand2, CPU juga perlu menjemputnya 'XULQJWKH)HWFK
(fetch) juga. VWDJH WKH &38 UHWULHYHV WKH QH[W LQVWUXFWLRQ WR EH H[HFXWHG LH ZKHUH ULSHLS LV
SRLQWLQJ LQ PHPRU\ ,Q WKH 'HFRGH VWDJH WKH &38 GHWHUPLQHV ZKDW WKH LQVWUXFWLRQ LV DQG RQ ZKDW
• Setelah seluruh data yang diperlukan GDWDLWRSHUDWHV'XULQJWKH'HFRGHVWDJHWKH&38ORRNVDWWKHELWVRIWKHLQVWUXFWLRQ
dijemput (fetched) dan di-decode, CPU dapat Execute instruksi.VDQGV DQG
Apabila ada hasil, seperti halnya instruksi ADD dan SUB, CPU akanHJ$''68%029
LVDEOHWRGHWHUPLQHWKHW\SHRIRSHUDWLRQ menyimpan (store) hasil pada
DQGZKHWKHURUQRWWKHRSHUDWLRQ
tempat yang sesuai (yakni Register, Memori).
LQFOXGHVRSHUDQGV,IWKHRSHUDWLRQLQFOXGHVRSHUDQGVWKH&38PD\QHHGWRIHWFKWKRVHDVZHOO2QFH
DOOQHFHVVDU\GDWDLVIHWFKHGDQGGHFRGHGWKH&38FDQ([HFXWHWKHLQVWUXFWLRQ6KRXOGWKHRSHUDWLRQ
SURGXFH D UHVXOW DV ZLWK WKH $'' DQG 68% LQVWUXFWLRQV WKH &38 ZLOO VWRUH WKH UHVXOW LQ WKH
DSSURSULDWHSODFH HJUHJLVWHUPHPRU\
3LSHOLQLQJ
,QPRGHUQSURFHVVRUVHDFKSDUWRIWKHVWDJHF\FOHFDQFRQWDLQVXEVWHSV3URFHVVRUDUFKLWHFWVKDYH
IRXQGRYHUWKH\HDUVWKDWRYHUODSSLQJWKHVWDJHVRIWKHF\FOHUHVXOWVLQEHWWHUSHUIRUPDQFHEHFDXVHWKH
Pipelining
• Pada prosesor modern, setiap 3-stage cycle bisa terdiri atas sub-steps. Arsitek2 prosesor beberapa
dekade belakangan ini menemukan bahwa menumpang tindih stage2 dalam cycle bisa menghasilkan
kinerja lebih baik karena prosesor bisa bekerja menjemput instruksi kedua saat bergerak men-decode
instruksi pertama dst. Rancangan tumpang tindih ini dinamakan pipelining.
HFRQGPHWKRGLVWKHEHVWXVHRI\RXUWLPH7KHODXQGU\H[DPSOHLOOXVWUDWHVWKHFRQFHSWRISLSHOLQLQJ
&38ZLWKVHSDUDWH)HWFK'HFRGHDQG([HFXWHXQLWVPD\QRWEHDEOHWRSHUIRUPWKUHHIHWFKHVDWWKH
• Superpipeline adalah pipeline sampai 20 tahapan. CPU mampu bekerja dengan 20 langkah berbeda
DPHWLPHEXWLWFDQSHUIRUPD)HWFKD'HFRGHDQGDQ([HFXWHVLPXOWDQHRXVO\'RLQJVRLVDEHWWHU
VHRIDSURFHVVRU¶VWLPHDQGUHVXOWVLQEHWWHUSHUIRUPDQFH
sekaligus, dimana instruksi2 berada dalam tahapan2 berbeda. Makin banyak tahapan pipeline yang
dipakai CPU, makin banyak kerja yang diselesaikan CPU dalam satu rangka waktu. Dengan 20-stage
Instruction Execution Cycle, prosesor tanpa pipeline perlu menunggu semuanya 20 stages instruksi2
untuk selesai yaitu 200 clock cycle untuk menyelesaikan 10 operasi. Prosesor2 20-staged pipelined
$77(17,210RGHUQSURFHVVRUVDFWXDOO\FRQWDLQPXOWLSOH)HWFK'HFRGHDQG([HFXWHXQLWVWR
PD[LPL]HWKURXJKSXWRILQVWUXFWLRQH[HFXWLRQ
mampu mengurangi clock cycle sampai 29, suatu peningkatan kinerja 690%.
)LJXUH3LSHOLQHGLQVWUXFWLRQH[HFXWLRQF\FOH
)LJXUHVWDJHVXSHUSLSHOLQH
$V SUHYLRXVO\ PHQWLRQHG D SLSHOLQH FRXOG KDYH XSZDUGV RI VWDJHV ZKLFK LV NQRZQ DV D
XSHUSLSHOLQH $ &38 FRXOG EH ZRUNLQJ RQ GLIIHUHQW VWHSV VLPXOWDQHRXVO\ ZLWK LQVWUXFWLRQV LQ
,QSXWDQG2XWSXW
LIIHUHQWVWDJHV7KHPRUHSLSHOLQHVWDJHVWKH&38XVHVWKHPRUHZRUNFDQEHSHUIRUPHGE\WKH&38
QDVSHFLILFWLPHIUDPH:LWKDVWDJH,QVWUXFWLRQ([HFXWLRQ&\FOHLQDQRQSLSHOLQHGSURFHVVRUD
8SWRWKLVSRLQWZHKDYHGLVFXVVHGWKHSURFHVVRULQVRPHGHWDLODQGKRZLWFRPPXQLFDWHVZLWKRWKHU
PLQLPXPRIFORFNF\FOHVZRXOGEHQHHGHGWRFRPSOHWHRSHUDWLRQVEHFDXVHHDFKLQVWUXFWLRQ
PDMRU FRPSRQHQWV ORFDWHG RQ WKH PRWKHUERDUG %XW KRZ GRHV WKH SURFHVVRU FRPPXQLFDWH ZLWK
RXOGKDYHWRZDLWIRUDOOVWDJHVRIWKHSUHYLRXVLQVWUXFWLRQWRILQLVK:LWKDVWDJHSLSHOLQHG
Intel® 8086 merupakan prosesor berdesain futuristik jauh ke depan. Ia merupakan prosesor pertama dengan
kemampuan pipeline, berbeda dengan pendahulunya yang belum punya kemampuan itu. Pada sistem dengan
pipeline, data bus dan address bus tetap sibuk (busy) melalulintaskan data sementara CPU memproses
informasi. dengan demikian processing power efektif dari prosesor meningkat.
Memori Internal
• Dua jenis memori dalam PC adalah random access memory (RAM) dan read-only memory
(ROM). Byte2 dalam memori diberi nomor berurutan, mulai dengan 00, sehingga setiap
lokasi memiliki nomor alamat yang unik.
ROM. ROM terdiri dari memory chips khusus yang
hanya bisa dibaca. Karena instruksi2 dan data
secara permanen ditanam ke dalam chips, maka
tidak dapat diubah. ROM Basic Input/Output
System (BIOS) mulai pada alamat 768K dan
menangani seluruh piranti input/output seperti
hard disk controller. ROM mulai dari 960K
mengendalikan fungsi2 dasar komputer seperti
Peta Fisik dari Memori Dasar PC 8086 power-on self-test, pola titik (dot pattern) dari
Dari satu megabyte memori, 640K pertama grafis, dan disk self-loader. Saat Anda tekan tombol
adalah RAM dasar, kebanyakan tersedia
power, ROM melakukan beragam cek dan
untuk Anda pakai
mengangkat (load) special system data dari disk ke
RAM.
RAM. Programmer sangat terkait dengan RAM yang sering dinamakan
“read-write memory”. RAM tersedia sebagai “kertas kerja” untuk
tampungan temporer dan eksekusi program.
Karena isi RAM hilang saat komputer mati (volatile), Anda perlu
tampungan eksternal, terpisah, untuk menyimpan program dan data.
Ketika Anda mematikan komputer, prosedur boot-up ROM mengangkat
(load) sebagian sistem operasi ke dalam RAM. Lalu Anda dapat
memintanya melakukan beberapa aksi, misalnya loading sebuah
program dari disk ke dalam RAM. Program Anda berjalan dalam RAM
dan secara normal berproduksi suatu output ke layar, printer atau disk.
Setelah selesai, Anda bisa meminta sistem untuk loading program
lainnya ke dalam RAM, sebuah aksi yang menimpa (overwrites)
program terdahulu. Seluruh diskusi tentang RAM, selanjutnya kita
gunakan kata “memori”.
195
Hirarki Memori
Pengalamatan Data dalam Memori
• Tergantung modelnya, prosesor dapat mengakses satu atau lebih byte dari memori
pada satu waktu. Anggaplah bilangan desimal 1.315; representasi heksa-nya 0529h,
memerlukan 2 byte atau 1 word memori yang terdiri dari high-order (most significant)
byte, 05, dan low-order (least significant) byte, 29. Sistem menyimpannya dalam
memori dengan urutan terbalik: low-order byte disimpan pada alamat memori bawah
dan high-order byte pada alamat memori atas.
/ $%/ # $/ %/ #$$/ $!/ $/ %/ # !# $$ #/
!/ / %/ */ %/ * #/ #$%#$/ #/ %/ # -
!# $$ #/ !/ $/ $/ $#/ % / %/ '$#/ +$/ */ #/ )/
% / , / # / %/ ,/ !#/ % / %/ $ #%/ $/ */ #/
)/
'/ $ /
,/ % / %/ ! $%/ ! ,$/ / $!/ # $/ /
#/ / / %#/ #$$/ $!/ %#,/ '%/ / #/
%/ #$$/ $!/ #/ $/ $!#%/ / #%/ # / %/ * #/
#$%#/ #/
PENGALAMATAN (ADDRESSING)
%$/ %/ / $#/
! $%/
/ %/ / / '#/ ! $%/
'+ *&+ '"+ + + $+ ##+ + + #$+ + "+ "+
%#+ + # "$#+ $(+ ( %+ #+ + %"+ + ( $+ #+
#+ + %* + " &$"+
&"+ #$ #$"+ %#+ %+ # + ( *+ + "#+ #+ (+ $+
#+ ( %+ + #+ ("+ "+ #+ + )#+ "+ ' +
("+ &#"#+ + + %+ + & + $"+ + *+ "%& "+ )+ %+
/ / / #$$/ $/ / % / / %/ $/ *%/ $/ /%%/
+ "+ + *+ "+ + &###+ "+ + &+ "+ "+ + &"+ &#%+ %
#+ *+
/ /#$$/ / / # !'%#/'$%/ /'"'/ / +.
! "%& "+ $+ + + "#+ "##+ # + + '+ ' "&#+ &##+
(!$/ / / */ / #$$$/ / %/ #$$/ $!/ #/ %/
&/ ,/ / +/ '#/ / * #/ #$%#$/ #/ '$',/ .
#+ %#+ + + &#+ "+ $ " "*+ "+ " $+ #%" + +
%/ ,/ / #/ ,/ / $/ %%#/
% + + "" #+ "+ %*+ + $+ *&+ &$+ "+ &$ &$+ $+ $+ " +
("+ Don Lancaster, “Machine Language Programming Cookbook” © 2010
by Synergetics Press.
) !) ) ) !) !) ) ) # ) !) ') ))
!) ) ) $) ) !) ) ) ) )
) ) ) %) % ) ) ) ! !) ) ") ) ) # #)
!#) ) ) ') ) ) ) ) ) ) ")
) ) ) ) )
• Untuk menyimpan sebuah nilai, kita perlu menemukan lokasi memori yang tersedia berikutnya. Demi
kejelasan, anggaplah lokasi memori tersedia berikutnya adalah 0x00000000h. Kita bisa menulisnya ke memori
berturutan dengan nilai2 (per byte) ditulis dari atas ke bawah (yakni most significant byte pada alamat
memori terendah dan least significant byte pada alamat memori tertinggi). Ini dinamakan urutan byte Big-
Endian, yakni “big end” (penghujung besar) disimpan dulu.
• Sebaliknya jika nilai2 (per byte) ditulis dari bawah ke atas, dinamakan urutan byte Little-Endian, yakni “little
end” (penghujung kecil) disimpan lebih dulu.
Alamat Memori Data Alamat Memori Data
• Intel x86 dan x86-64 menggunakan urutan Little-Endian. 0x00000000 78
0x00000000 12
Prosesor Motorola seri 68xx[x], IBM Z series,
menggunakan urutan Big-Endian. Beberapa prosesor 0x00000008 34 0x00000008 56
mampu menggunakan keduanya yang sering 0x00000010 56 0x00000010 34
dinamakan bi-endian, misalkan Sun SPARC, ARM dan 0x00000018 12
0x00000018 78
PowerPC.
Big-Endian Byte Order Little-Endian Byte Order
SHUIRUPLQJ RSHUDWLRQV RQ GDWD D SODFH PXVW H[LVW IRU WKH SURFHVVRU WR VWRUH
QGDGGUHVVHV:HSUHYLRXVO\H[SODLQHGWKDWLQWKHPHPRU\KLHUDUFK\WKHIDUWKHU
WKH PHPRU\ H[LVWV WKH VORZHU GDWD DFFHVV EHFRPHV ,Q RUGHU IRU WKH &38 WR
VTXLFNO\DVSRVVLEOHLWKDVWREHDEOHWRDFFHVVDQGVWRUHLQVWUXFWLRQVDQGGDWD
H7KXVWKHORFDWLRQRILQVWUXFWLRQVDQGGDWDQHHGVWREHDVFORVHWRWKH$/8DQG
RVH SUR[LPLW\ PHPRU\ ZKLFK LV DFWXDOO\ RQ WKH &38 GLH DORQJ ZLWK WKH ORJLF
V FDFKH :KLOH FDFKH FDQ EH YLHZHG LQ WHUPV RI WKH DIRUHPHQWLRQHG PHPRU\
Cache
KDVDKLHUDUFK\RILWVRZQ
VVRUVFDFKHW\SLFDOO\LVGLYLGHGLQWRWKUHHWLHUVOHYHO / OHYHO / DQG
• Prosesor modern dilengkapi dengan cache yang umumnya terbagi tiga tingkat (three tiers): level 1 (L1), level
FKHKLHUDUFK\IROORZVWKHVDPHSULQFLSOHVDVWKHPHPRU\KLHUDUFK\7KHIDUWKHU
RZHUODUJHUDQGFKHDSHULWEHFRPHV%RWK/DQG/FDFKHDUHYHU\FORVHWRWKH
2 (L2) dan level 3 (L3). Hirarkinya mengikuti prinsip2 yang sama dengan hirarki memori: makin jauh dari
VOLJKWO\ IDUWKHUALU,
DZD\makin
DQG ODUJHU LQ FDSDFLW\
lambat, makin/ FDFKH
besar KDVdan
EHFRPH W\SLFDO
makin RQ
murah. Baik cache L1 dan L2 sangat dekat dengan ALU, dimana
UV / DQG / FDFKH DUH SUHVHQW IRU HDFK FRUH ZKLOH WKH / FDFKH LV VKDUHG
L2 sedikit lebih jauh tetapi lebih besar kapasitasnya. Cache L3 diakses oleh semua core sebagai lapisan akhir
VVKRZQLQ)LJXUH/FDFKHSURYLGHVWKHODVWOD\HURIVWDWLFPHPRU\EHIRUH
5$0IRUVWRUDJH memori statik sebelum data dikirim ke RAM untuk penyimpanan.
WKHFDFKHKLHUDUFK\LVWKH,QWHO&RUHLSURFHVVRU7KH&RUHLKDVDQ/FDFKHRI
• Contoh hirarki cache adalah prosesor Intel Core i7 yang memiliki L1 cache
E IRU LQVWUXFWLRQV DQG NE IRU GDWD 7KH / FDFKH LVsebesar
NE SHU64kb
FRUH 7KH
per/core (32 kb untuk instruksi dan 32kb untuk data). L2 cache
PEWRPEVKDUHGDPRQJVWWKHFRUHVGHSHQGLQJRQKRZPXFK\RXZDQWWRSD\
sebesar 256kb per core. L3 cache mulai dari 4mb sampai 24mb dipakai
bersama antara core2.
• Programmer tidak dapat mengakses atau memanipulasi cache dengan
”mengacak2” keotomatisan kerjanya cache walaupun ada beberapa instruksi
cache. Cache diabstraksi dari programmer karena cache2 dikelola oleh
algoritma yang rumit untuk menjamin data yang diperlukan tersedia secepat
mungkin. Misalkan kode program merujuk suatu variable tertentu beberapa
kali, maka prosesor sepertinya (likely) menganggap potongan data itu penting,
maka data itu sepertinya (likely) di-prefetch dan ditaruh dalam cache untuk
quick retrieval oleh operasi2 berikutnya. Hal ini terjadi secara dinamis
sepanjang eksekusi program.
• Akan tetapi ada lokasi memori dalam prosesor yang mudah diakses yakni
)LJXUH&38FDFKH
Register2, sebuah lokasi memori tercepat dalam prosesor. Register2 ada pada
puncak hirarki memori, lebih kecil dan lebih cepat daripada cache. Register2
PPHUV GR QRW DFFHVV RU PDQLSXODWH FDFKH ZLWK FRGH adalah
LQ D QRQDXWRPDWLF
daerahZD\ penyimpanan kecil terdekat ke ALU yang dipakai untuk
QVWUXFWLRQV GR H[LVW &DFKH DFFHVVHV DUH DEVWUDFWHG IURP SURJUDPPHUV EHFDXVH
memegang operand2, alama2 dan hasil2 selama eksekusi instruksi2.
JHGE\FRPSOH[DOJRULWKPVWKDWHQVXUHWKHGDWDZHQHHGLVDYDLODEOHDVTXLFNO\DV
OH LI RXU FRGH UHIHUHQFHV D FHUWDLQ YDULDEOH PXOWLSOH WLPHV WKH SURFHVVRU ZLOO
HFHRIGDWDLVLPSRUWDQW7KHGDWDLVOLNHO\WREHSUHIHWFKHGDQGNHSWLQFDFKHIRU
XUHRSHUDWLRQV6XFKEHKDYLRUKDSSHQVG\QDPLFDOO\WKURXJKRXWWKHH[HFXWLRQRID
U\ ORFDWLRQV GR H[LVW RQ WKH SURFHVVRU WKDW ZH FDQ HDVLO\ DFFHVV LQ FRGH 7KH
Peningkatan Akses Memori
• Seperti sudah diketahui bahwa akses ke main memory (RAM) lebih lambat dibanding membaca
dari register2 karena proximity (jarak atau jauh dekat) ke ALU dan proses menghendaki membaca
nilai2 dari memori. Sepanjang waktu, banyak perbaikan2 untuk meningkatkan akses instruksi dan
data telah dibuat.
• Cache memory membantu memulihkan speed akses2 memori. Jika instruksi atau data sedang
dijemput belum sampai di cache, terjadi cache hit. Jika tidak ditemukan, terjadi cache miss.
Instruksi2 juga dapat dipindahkan dalam rencengan (bulk) ke dan dari cache.
• Algoritma2 Pre fetching menguji pola akses memori dengan maksud mengisi cache dan prefetch
buffers dengan instruksi2 dan data yang sepertinya (likely) segera diperlukan. Kebanyakan CPU
modern juga memiliki predecoding sebagai bagian dari pipeline.
• Integrated memory controllers menghilangkan CPU to RAM hops lewat front-side bus
(Northbridge) dengan mengintegrasikan memori ke dalam CPU die.
• Sistem multi-core/multi-processor menyebabkan beban kerja (workload) mengeksekusi instruksi2
jadi tersebar.
REGISTER 8086 • Karena register terletak di dalam
CPU, maka ia jauh lebih cepat
dibanding memori.1)
• Mengakses memori memerlukan
system bus sehingga menjadi
lebih lama.
• Register dipakai untuk
Flag Register mengontrol instruksi2 yang
sedang dieksekusi, menangani
pengalamatan memori, dan
menyediakan kemampuan
aritmetika.
General-Purpose Register Special-Function Register Segment Register
AX – the accumulator register (terbagi atas AH / AL) IP – Instruction Pointer
BX – the base address register (terbagi atas BH / BL) CS – code segment
CX – the count register (terbagi atas CH / CL)
DS – data segment
DX – the data register (terbagi atas DH DL)
SI – source index register SS – stack segment 1) Dalam ilmu Organisasi dan Arsitektur
ES – extra segment Komputer, dikatakan hampir tidak ada latensi
DI – destination index register antara CPU dan Register. Berbeda halnya
BP – base pointer dengan CPU dan memori.
SP – stack pointer
REGISTER 80386 (Untuk Referensi Saja)
REGISTER2 x86 DAN x86_64
64-bit 32-bit 16-bit 64-bit 32-bit 16-bit
RAX EAX AX CS CS
RBX EBX BX DS DS
RCX ECX CX ES ES
Segment Registers N/A
General RDX EDX DX SS SS
Purposer RSI ESI SI FS
Registers RDI EDI DI GS
RBP EBP BP Instruction Pointer RIP EIP IP
RSP ESP SP Flags Register RFLAGS EFLAGS FLAGS
R8 – R15
RFLAGS
)LJXUH:ULWLQJ$;GHVWUR\V($;
,Q )LJXUH \RX VHH WKDW ZKHQ D YDOXH ZDV FRSLHG WR D[ WKH ORZHU
RYHUZULWWHQGHVWUR\LQJWKHRULJLQDOYDOXHLQHD[$JDLQWKHWZRUHJLVWHUVVKDUHP
Registers Overlapping (Tumpang Tindih) DOOUHJLVWHUVVKDUHVSDFHZLWKVXEUHJLVWHUVDQGHYHQWKHRQHVWKDWGRPD\VKDUHDG
VSDFH7KHIRXUJHQHUDOSXUSRVHELWUHJLVWHUVUD[UG[KDYHDVKDULQJUHODWLRQVKLS
ELWDQGELWFRXQWHUSDUWVDVVKRZQLQ7DEOH7DEOH OLVWV WKH UHPDLQLQJ
UHJLVWHUVUVLUGLUESDQGUVSZKLFKRQO\KDYHDVKDULQJUHODWLRQVKLSZLWKWKHLU
FRXQWHUSDUWV
7DEOH5HJLVWHURYHUODSSLQJIRU5$;5%;5&;DQG5';
)LJXUH5HJLVWHUDGGUHVVLQJ
7DEOH5HJLVWHURYHUODSSLQJIRU56,5',5%3DQG563
)LJXUH:ULWLQJ$;GHVWUR\V($;
$OWKRXJK
,Q )LJXUH \RX VHH WKDW ZKHQ D YDOXH ZDV FRSLHG WR D[ WKH ORZHU ELWV RI HD[ ZHUH \RX DUH DEOH WR XVH DOO RI WKH DIRUHPHQWLRQHG UHJLVWHUV LQ \RXU SURJU
RYHUZULWWHQGHVWUR\LQJWKHRULJLQDOYDOXHLQHD[$JDLQWKHWZRUHJLVWHUVVKDUHPHPRU\VSDFH1RW UHJLVWHUVKDYHVSHFLDOSXUSRVHVRIQRWH<RXFDQVWRUHGDWDLQDUHJLVWHUVXFKDVUD[
DOOUHJLVWHUVVKDUHVSDFHZLWKVXEUHJLVWHUVDQGHYHQWKHRQHVWKDWGRPD\VKDUHDGLIIHUHQWDPRXQWRI LWRYHUZULWWHQ SHUKDSVXQNQRZLQJO\ DIWHUWKHQH[WRSHUDWLRQ+HUHZHOLVWVRPHR
VSDFH7KHIRXUJHQHUDOSXUSRVHELWUHJLVWHUVUD[UG[KDYHDVKDULQJUHODWLRQVKLSZLWKWKHLUELW RIELWDQGELWUHJLVWHUVVR\RXFDQDYRLGHUURUVZKHQSURJUDPPLQJ
ELWDQGELWFRXQWHUSDUWVDVVKRZQLQ 7DEOH7DEOH OLVWV WKH UHPDLQLQJ JHQHUDO SXUSRVH UD[HD[LVFRPPRQO\XVHGDVWKHGHIDXOWDFFXPXODWRUUHJLVWHU2SHUDWLRQVVXF
UHJLVWHUVUVLUGLUESDQGUVSZKLFKRQO\KDYHDVKDULQJUHODWLRQVKLSZLWKWKHLUELW DQGELW PXOWLSOLFDWLRQZLOODXWRPDWLFDOO\SODFHSDUWRIWKHUHVXOWLQUD[HD[)XQFWLRQ
FRXQWHUSDUWV IRUWKHUHWXUQYDOXH'RQRWXVHUD[HD[IRUGDWDVWRUDJHZKHQSHUIRUPLQJVXF
UF[HF[LVXVHGWRKROGWKHORRSFRXQWHUYDOXHIRUH[HFXWLQJORRSV6RDYRLG
7DEOH5HJLVWHURYHUODSSLQJIRU5$;5%;5&;DQG5'; KROGGDWDLQVLGHRIORRSV
Mikroprosesor 8086 memiliki beragam jenis register yang dapat dikelompokkan sesuai instruksi2 sebagai
berikut :
• General purpose registers: CPU 8086 memiliki 8 general purpose registers (GPR) 16-bit dan setiap
register memiliki nama seperti dalam Gambar yakni AX, BX, CX, DX, SI, DI, BP, SP. Empat word registers
(AX, BX, CX dan DX) dapat dipecah menjadi high dan low byte registers (AH, AL, BH, BL, CH, CL, DH dan
DL). Register BP, SI dan DI tergolong general purpose tetapi tidak dapat dipecah menjadi byte. SP juga
general purpose, tetapi lebih khusus sebagai stack pointer. Prosesor 386 dan selanjutnya masih
mendukung register2 general-purpose ditambah versi Extended 32-bit masing2: EAX, EBX, ECX, dan EDX.
• Special function registers: CPU 8086 memiliki 2 special function registers (SFR) yakni register IP dan
register flag (Terj. Ind. Bendera). Register IP (Instruction Pointer) dipakai untuk menunjuk instruksi yang
sedang eksekusi dan selalu bekerja bersama segment register CS (CS:IP). Fungsi utama register flag
adalah untuk memodifikasi operasi2 CPU setelah fungsi2 mekanik selesai dan menariknya kita tidak
dapat mengakses langsung register ini.
• Segment registers: CPU 8086 CPU memiliki 4 segment registers dengan panjang 16 bit yakni CS, DS, ES, SS
yang bertugas selain mungkin untuk menyimpan data, tetapi khususnya untuk rujukan atau referensi
mengakses blok memori atau segment atau paragraph boundary. Alamat segment selalu digeser ke
kanan sebanyak 4 bit bernilai 0 (atau dikali dengan desimal 16 atau heksa 10h).
Register CS. Berisi alamat awal segment kode program. Alamat segment ditambah nilai offset dalam Register IP
(instruction pointer) menunjukkan alamat instruksi yang akan dijemput (fetched) untuk dieksekusi. Untuk kondisi
pemrograman normal, Anda tidak perlu merujuk Register CS dalam program.
Register DS. Berisi alamat awal dari segment data program. Instruksi2 menggunakan alamat ini untuk menemukan data:
Alamat ini ditambah nilai offset dalam instruksi, menghasilkan referensi ke lokasi byte tertentu dalam segment data.
Register SS. Memampukan implementasi stack dalam memori dimana program menggunakan penyimpanan temporer
untuk alamat2 dan data. Sistem menyimpan alamat awal dari segment stack program dalam register ini. Alamat segment
ditambah nilai offset dalam Register SP (stack pointer) menunjukkan word terkini dalam stack yang akan dipakai. Dalam
pemrograman normal, Anda tidak perlu merujuk Register SS dalam program.
Register ES. Dipakai oleh beberapa operasi string (data karakter) untuk menangani pengalamatan memori. Dalam konteks
ini, Register ES (extra segment) diasosiasikan dengan Register DI (index). Program yang memerlukan Register ES perlu
menginisialisasikannya dengan alamat segment yang sesuai.
Pengalamatan (Addressing) dengan segmentasi
• Intel 8086 16-bit dirancang kompatibel dengan mikroprosesor Intel 8080 8-bit. Mesin2 ini
memiliki ruang alamat 64 kilobytes diwakili oleh dua byte atau seluruh 16 bit. Artinya ruang
alamat yang bisa diakses adalah 216 atau 64 KiB.
• Akan tetapi Intel® memilih pendekatan yang berbeda yakni memanfaatkan segmentasi. Program2
akan jalan dalam satu segment. Setiap segment maksimal 64 kilobytes dan ada lebih dari satu
segment dalam memori. Dalam segment2 ini, maka program2 dimungkinkan memperlakukan
mesin seolah-olah hanya punya ruang alamat hanya 64 kilobytes. 1)
• Ini membuat transport program2 ke mesin2 8-bit jadi lebih mudah. Lebih jauh lagi, dua program
berbeda dapat memanfaatkan bersama ruang dalam memori.
• Intel memilih paragraph sebagai satuan dasar ruang segment. Dengan mengubah segment
pointer dari 0700H ke 0701H akan menaikkan segment sejauh 16 byte (satu paragraph) dalam
memori. Akibatnya alamat segment yang 16-bit digeser 4 bit ke kiri (atau dikalikan 16) menjadi
seolah-olah field 20-bit. Dengan demikian 8086 mampu mengalamatkan secara langsung 20 bit,
atau satu megabyte memori. Dari satu megabyte ini, 320 kilobyte teratas dipakai oleh Vendor
(misal IBM) untuk hal-hal seperti system ROM, cartridge ROM dan display memory. Itulah
sebabnya jumlah memori yang bisa dipakai untuk program hanya 640 kilobytes.
• Ada empat jenis segment dalam mesin. Yang pertama adalah code segment ditampung oleh CS.
Segment ini tempat dimana kode dieksekusi. Yang kedua adalah data segment, DS. Saat program
mencoba membaca dari memori sebagai data dan tidak ada segment tertentu yang ditunjuk,
prosesor akan melihat data segment. Yang ketiga adalah stack segment, SS. Operasi2 stack PUSH
dan POP dilakukan dalam segment ini. Yang terakhir adalah auxiliary segment, ES. Ini tergolong
sebagai general purpose segment register diserahkan pada programmer.
1) Jika program lebih dari 64 KiB, Anda dapat gunakan 32-bit protected mode yang ada pada mesin modern untuk mengatasi keterbatasan segment dalam DOS 16-
bit. Atau memanfaatkan fitur compiler large model. Anda cukup increment pointer2 dan dapat memakai array lebih besar dari 64 KiB; compiler yang atur.
Pointer Register (IP, SP dan BP)
• Register Instruction Pointer (IP). Register 16-bit berisi offset dari instruksi berikutnya yang akan
dieksekusi. IP terasosiasi dengan Register CS dimana IP menunjuk pada instruksi terkini dalam
code segment yang saat ini sedang eksekusi. Dalam kondisi normal, Anda tidak perlu merujuk ke
Register IP dalam program, tetapi Anda dapat mengubahnya menggunakan DEBUG.COM saat
menguji program. Prosesor 80386 dan selanjutnya memiliki Extended 32-bit IP yang dinamakan
EIP.
Alamat Segment dalam CS 39840h
Tambah alamat offset dalam IP + 514h
Alamat instruksi berikutnya 3A054h
Register SP (stack pointer) dan BP (base pointer) terasosiasi dengan Register SS dan mengijinkan
sistem mengakses data dalam stack segment.
• Register Stack Pointer (SP). Register 16-bit menyediakan nilai offset; saat terasosiasi dengan
Register SS, merujuk pada word terkini yang sedang diproses dalam stack. 80386 dan selanjutnya
memiliki Extended 32-bit stack pointer, Register ESP. Sistem menangani register2 ini secara
otomatis.
Alamat Segment dalam SS 4BB30h
Tambah offset dalam SP + 412h
Alamat dalam stack 4BF42h
• Register Base Pointer (BP). Register 16-bit memfasilitasi parameter2 perujukan (referensi)
dimana data dan alamat2 yang program lewati dalam stack. Prosesor menggabungkan alamat
dalam SS dan offset dalam BP. Prosesor 80386 dan selanjutnya memiliki Extended 32-bit BP ang
dinamakan Register EBP.
*(3 %3 '+%3 %3 *-((')+3 '#() *'%*3 %3 '+)3 "' 3 '()2
+ '%*3 +3 *3 -*-""13 *13 +'3 +)%*)3 + %*3 +/%3 +3 -#-"+')3
%3 +3 %03 ) *+)3 %3 . 3 .)*3
)*3 3 /'"3 "**3 '3 /')! %3 ) *,)*3 ++3 %3 *).3 +)3
%+%3 ')3 +3 -**3 (% %3 '%3 '/3 +13 )3 '&&+3
*3 /')! %3 ) *+)*3 )3 ""3 3
• Nilai dalam segment register (CS, DS, SS, ES) dinamakan ”segment”
• Nilai dalam General Purpose Register (BX, SI, DI, BP) dinamakan “offset”
• Saat DS berisi nilai 1234h dan SI berisi nilai 7890h maka dapat ditulis sebagai 1234:7890.
Alamat fisiknya menjadi 1234h * 10h + 7890h = 19BD0h
Memahami Jenis
Pengalamatan Memori
DOS
BIOS
Hardware / Devices
• Intel 8086 merupakan mikroprosesor dengan data bus internal dan eksternal 16-bit, artinya
semua register lebarnya 16 bit dan ada data bus 16-bit yang mengirim data masuk dan keluar
CPU.
• Sekalipun pengenalan 8086 menandai lompatan yang besar atas generasi mikroprosesor
sebelumnya, masih ada hambatan terutama pada penggunaan data bus eksternal 16-bit karena
pada saat itu semua peripheral dirancang sekitar mikroprosesor 8-bit. Ditambah lagi printed
circuit board (PCB) dengan data bus 16-bit sangat2 mahal. Oleh sebab itu Intel mengeluarkan
versi 8088. Ia identik dengan 8086 sejauh berkenaan dengan pemrograman, tetapi secara
eksternal ia memiliki data bus 8-bit bukan bus 16-bit. Ia juga memiliki kapasitas memori 1
megabyte.
• Pada tahun 1981, keberuntungan Intel berubah selamanya ketika IBM memilih 8088 sebagai
mikroprosesor pilihan dalam merancang IBM PC. IBM PC berbasis 8088 sukses besar, terutama
saat IBM dan Microsoft (pengembang sistem operasi MS-DOS) membuatnya sebagai sistem
terbuka, artinya seluruh dokumentasi dan spesifikasi hardware dan software dari PC terbuka
untukk publik. Ini menyebabkan banyak vendor lain mudah meng-clone hardware dan dengan
demikian terjadi perkembangan dahsyat baik hardware maupun software yang dirancang
berdasarkan IBM PC. Ini sangat berbeda dengan komputer Apple yang menganut sistem
tertutup, yang mencegah setiap coba2 meng-clone oleh pabrikan lain baik domestik maupun
luarnegeri.
MODUL I/O
• Pada komputer modern, prosesor berkomunikasi dengan piranti2 eksternal, seperti keyboard, monitor dan
network adapter, lewat modul I/O yang tersambung ke system bus.
• Selain sebagai perangkat buffered communication antara prosesor dan piranti I/O, modul I/O juga
menangani beberapa critical actions seperti data transfer, command decoding dan device status
interrogation.
• Seperti halnya prosesor perlu CU yang bertindak sebagai pengatur lalulintas untuk memastikan instruksi2
dieksekusi tanpa teraduk dengan operasi lain, modul I/O juga harus mengkoordinasikan komunikasi antara
komponen2 internal komputer dengan piranti eksternal yang terhubung ke modul.
• Karena letaknya paling jauh dari CPU, maka piranti eksternal adalah piranti paling lambat dalam ekosistem
komputasi. Karena perbedaan speed, modul I/O perlu berlaku sebagai data buffer agar memastikan baik
prosesor tidak diperlambat atau piranti eksternal ”kerja dipaksa” (overrun) dengan terlalu banyak data.
• Piranti2 eksternal berbeda sering bekerja pada speed yang berbeda (mis. menyimpan data pada CDRW vs.
USB thumb drive), sehingga modul I/O perlu sadar akan data rate piranti terpasang dan menyesuaikannya.
• Tugas kritis modul I/O yang lain adalah melakukan error detection untuk memastikan data terkirim ke
piranti eksternal adalah data yang sama diterima oleh piranti eksternal. Beragam metode error detection
bisa dipakai (mis. checksums, Cyclic Redundancy Checks atau CRC, Hamming Code dan parity bits),
tujuannya selalu sama: memastikan integritas data.
EXWLWFUHDWHVWKHPRVWRYHUKHDGWKXVPDNLQJLWWKHPRVWLQHIILFLHQWRIWKHFKRLFHV:KHQDSURFHVVRU
H[HFXWHVDQ,2RSHUDWLRQLQ3,2PRGHWKH&38VHQGVDFRPPDQGWRWKHVSHFLILHG,2PRGXOHDQG
ZDLWV7KH,2PRGXOHLVUHVSRQVLEOHIRUH[HFXWLQJWKHFRPPDQGDQGVHWWLQJWKHDSSURSULDWHELWVLQ
WKH ,2 VWDWXV UHJLVWHU WR VLJQLI\ WKH FRPSOHWLRQ RI WKH FRPPDQG 7KH SURFHVVRU PXVW SHULRGLFDOO\
FKHFNWKH,2VWDWXVUHJLVWHUWRVHHLIWKH,2PRGXOHKDVFRPSOHWHGWKHRSHUDWLRQ2YHUKHDGLVFDXVHG
E\WKHSHULRGLFFKHFNLQJHVSHFLDOO\LQWKHFDVHRIYHU\ORQJ,2RSHUDWLRQVZKHUHWKHSURFHVVRUPXVW
FKHFNPXOWLSOHWLPHV
OPERASI I/O 7KH SURFHVVRU FRXOG EH PXFK PRUH HIILFLHQW LI DIWHU VHQGLQJ D FRPPDQG WR DQ ,2 PRGXOH LW
FRXOG FRQWLQXH ZLWK RWKHU RSHUDWLRQV LQVWHDG RI ZDLWLQJ IRU WKH ,2 FRPPDQG WR ILQLVK 6XFK LV WKH
• Operasi2
FRQFHSWI/O yang dieksekusi
RI LQWHUUXSWGULYHQ oleh prosesor
,2 GHSLFWHG LQ )LJXUH umumnya ada
2QFH WKH empatKDV
SURFHVVRU cara: programmed
GHOLYHUHG D I/O (PIO), interrupt-
driven I/O, direct memory access (DMA) dan I/O channels.
FRPPDQGWRDQ,2PRGXOHLWPRYHVRQWRRWKHULQVWUXFWLRQVDQGRQO\UHWXUQVWRWKHH[WHUQDORSHUDWLRQ
• ZKHQWKH,2PRGXOHVHQGVDQLQWHUUXSW7KHLQWHUUXSWSDXVHVRWKHURSHUDWLRQVVRWKDWWKHSURFHVVRU
Programmed I/O (PIO) merupakan teknik paling sederhana implementasinya, tetapi paling tinggi
FDQILQLVKWKH,2RSHUDWLRQDWKDQG7KHSURFHVVRUFKHFNVIRULQWHUUXSWVDWWKHHQGRIHYHU\LQVWUXFWLRQ
overheadnya karena ia paling tidak efisien mengambil pilihan2. Saat prosesor mengeksekusi sebuah operasi
F\FOHVRWKH,2PRGXOHZLOOQHYHUKDYHWRZDLWORQJHUWKDQRQHIXOOLQVWUXFWLRQF\FOHDIWHUGHOLYHULQJ
I/O dalam mode PIO, CPU mengirim perintah dan mengeset bit2 yang sesuai pada I/O status register untuk
DQ LQWHUUXSW PHVVDJH IRU WKH WUDQVDFWLRQ WR FRPSOHWH $OWKRXJK LW VHHPV OLNH WKH SURFHVVRU LV
menandai selesainya perintah. Prosesor harus secara periodik mengecek I/O status register untuk melihat
FRPSOHWHO\KDQGVRIIGXULQJWKH,2PRGXOH¶VH[HFXWLRQRIDFRPPDQGWKHSURFHVVRUVWLOOKDVWREH
apabila modul I/O telah menyelesaikan operasi.
XVHGHDFKWLPHGDWDLVPRYHGWRIURPPDLQPHPRU\ 5$0 Overhead disebabkan oleh pengecekan secara periodik,
terutama pada saat operasi2 I/O sangat panjang dimana prosesor harus mengecek beberapa kali.
)LJXUH3URJUDPPHG,2
• Prosesor bisa
%RWK lebih efisien
3URJUDPPHG jika
,2 DQG setelah mengirim
LQWHUUXSWGULYHQ ,2 UHTXLUHperintah ke modul
FRQVWDQW LQYROYHPHQW RI I/O, ia lanjut dengan operasi lain bukan
WKH SURFHVVRU
menunggu perintah I/O selesai. Konsep demikian dinamakan interrupt-driven I/O. Saat prosesor mengirim
6LQFHPDQ\,2RSHUDWLRQVDUHVWUDLJKWIRUZDUGGDWDWUDQVIHUVEHWZHHQH[WHUQDOGHYLFHVDQG5$0WKH
satu SURFHVVRU
perintahLVke modul
ZDVWLQJ I/O,
FORFN ia bergerak
F\FOHV RQ PXQGDQHke instruksi
WDVNV lainnya
6XFK RYHUKHDG danD UHPHG\
QHHGV hanya WR kembali
IXUWKHU ke operasi eksternal ketika
modul I/O mengirim sebuah interrupt. Interrupt menyela
LQFUHDVHWKHHIILFLHQF\RIWKHSURFHVVRUDQGGLUHFWPHPRU\DFFHVV (pause) operasi2 lain sehingga prosesor dapat
'0$ GHSLFWHGLQ)LJXUHLV
menyelesaikan operasi
WKH DQVZHU 8VLQJ '0$I/O segera.
UHTXLUHV Prosesor
DQ DGGLWLRQDO mengecek
PRGXOH interrupt2
RQ WKH PRWKHUERDUG di akhir
VWULFWO\ setiap siklus instruksi, sehingga
IRU '0$
modulRSHUDWLRQV:KHQWKHSURFHVVRUQHHGVWRH[HFXWHDQ,2RSHUDWLRQWKH&38VHQGVWKHLQIRUPDWLRQWR
I/O tak akan pernah menunggu lebih lama dari satu siklus instruksi penuh setelah adanya interrupt
WKH'0$PRGXOHLQVWHDGRIGLUHFWO\WRWKHGHYLFH¶V,2P,QDVHQVHWKH'0$PRGXOHHPXODWHVWKH
message agar transaksi diselesaikan. Sekalipun kelihatannya prosesor menyerahkan sepenuhnya eksekusi
SURFHVVRUE\WDNLQJFRQWURORIWKH,2RSHUDWLRQE\SDXVLQJWKHSURFHVVRUIRURQHF\FOHDWDWLPHVR
perintah kepada modul I/O, prosesor masih harus diberdayakan setiap kali data dipindahkan ke/dari
WKH'0$PRGXOHFDQJDLQXQIHWWHUHGDFFHVVWRWKHV\VWHPEXV
memori utama (RAM). DSURFHVVFDOOHGF\FOHVWHDOLQJ :KHQ
WKH '0$ PRGXOH KDV FRPSOHWHG WKH ,2 RSHUDWLRQ LW VHQGV DQ LQWHUUXSW WR WKH SURFHVVRU WR VLJQLI\
FRPSOHWLRQ 7KH SURFHVVRU LV RQO\ UHVSRQVLEOH IRU QRQGDWD WUDQVIHU LQVWUXFWLRQV UHODWHG WR WKH ,2
RSHUDWLRQZKLFKVDYHVFORFNF\FOHVDQGPDNHVWKHFRPSXWHU¶VXVDJHRIWKHSURFHVVRUPRUHHIILFLHQW
)LJXUH,QWHUUXSWGULYHQ,2
)LJXUH,QWHUUXSWGULYHQ,2 )LJXUH'LUHFWPHPRU\DFFHVV
$OWKRXJK'0$DSSHDUVWRVROYHWKHSUREOHPRIWKH&38GHDOLQJZLWK,2RSHUDWLRQVWKH'
• Baik Programmed I/O maupun interrupt-driven PRGXOHI/O LWVHOI memerlukan keterlibatan
LV QRW D FRPSOHWH SURFHVVRU LW PXVWterus-menerus
VWHDO F\FOHV IURP WKHprosesor.
&38 WR DFFRPSOLVK '
Apabila banyak operasi I/O berupa data transfer antara piranti2 eksternal dan RAM, prosesor akan
WDVNV7KXVWKH&38LVVWLOOGRLQJPRUHZRUNWKDQLVRSWLPDO$VROXWLRQWRWKHF\FOHVWHDOLQJSURE
membuang banyak clock cycle untuk tugas2 LV WR KDYH D PRGXOH
biasa. Overhead GHGLFDWHG WR ,2 RSHUDWLRQV
demikian WKDW LV LQ IDFW
memerlukan solusiD UHDO SURFHVVRU 6XFK D WHFKQL
bagaimana
HOLPLQDWHV
meningkatkan efisiensi prosesor; jawabannya adalah direct memory access (DMA). Menggunakan WKH QHHG IRU D PRGXOH WR VWHDO F\FOHV IURP WKH &38 7KH VROXWLRQ
DMA LV DQ ,2 FKDQ
'LIIHUHQW,2FKDQQHOVH[LVWVRPHKDQGOH,2ZLWKRQHGHYLFHDWDWLPHDQGRWKHUVFDQPXOWLSOH[
memerlukan modul tambahan pada motherboard semata-mata untuk operasi2 DMA. Ketika prosesor
KDQGOH,2ZLWKPXOWLSOHGHYLFHVDWDWLPH :KHQ,2FKDQQHOVDUHSUHVHQWWKH&38LVUHOLHYH
mengeksekusi operasi I/O, CPU mengirim informasi ke modul DMA, bukan langsung ke piranti I/O. Seolah-
HYHU\,2LQVWUXFWLRQH[FHSWWKHYHU\ILUVWLQVWUXFWLRQWKDWWHOOVWKH,2FKDQQHOWRSHUIRUPDWDVN$
olah modul DMA)LJXUH'LUHFWPHPRU\DFFHVV
meng-emulasi prosesor mengambil kendali
WKH ILUVW LQVWUXFWLRQ WKH atas operasi
,2 FKDQQHO WDNHVI/O
RYHUdengan
DQG FRQWUROVmenyela prosesor
WKH ,2 PRGXOH FRPSOHWLQJ WKH
RSHUDWLRQZLWKRXWXVLQJDQ\PRUH&38F\FOHV
selama satu cycle pada satu waktu sehingga modul DMA bisa memperoleh akses bebas ke system bus
$OWKRXJK'0$DSSHDUVWRVROYHWKHSUREOHPRIWKH&38GHDOLQJZLWK,2RSHUDWLRQVWKH'0$
(proses
PRGXOH LWVHOI LV QRWini dinamakan
D FRPSOHWH SURFHVVRUcycle VWHDO F\FOHVKetika
stealing).
LW PXVW IURP WKHmodul DMA telah
&38 WR DFFRPSOLVK '0$menyelesaikan operasi I/O, ia mengirim
interrupt ke prosesor untuk menandai sudah6XPPDU\
WDVNV7KXVWKH&38LVVWLOOGRLQJPRUHZRUNWKDQLVRSWLPDO$VROXWLRQWRWKHF\FOHVWHDOLQJSUREOHP
selesai.Prosesor hanya bertanggung jawab untuk instruksi2
LV WR KDYH
nonD PRGXOH
dataGHGLFDWHG
transferWRterkait
,2 RSHUDWLRQV
dengan WKDW LV LQ IDFW DI/O
operasi2 UHDO yangmana
SURFHVVRU 6XFK D WHFKQLTXH
menghemat clock cycle dan membuat penggunaan
HOLPLQDWHV WKH QHHG IRU D PRGXOH WR VWHDO F\FOHV IURP WKH &38 7KH1RZ WKDW
VROXWLRQ \RX
LV KDYH
DQ ,2 ILQLVKHG
FKDQQHO WKLV FKDSWHU \RX VKRXOG KDYH D EDVLF XQGHUVWDQGLQJ RI SURFHVVRU
prosesor komputer menjadi lebih efisien. V\VWHPDUFKLWHFWXUH:HKDYHFRYHUHGLPSRUWDQWDVSHFWVRIDUFKLWHFWXUHWKDWDUHQHFHVVDU\IRUOHDU
'LIIHUHQW,2FKDQQHOVH[LVWVRPHKDQGOH,2ZLWKRQHGHYLFHDWDWLPHDQGRWKHUVFDQPXOWLSOH[ LH
RI$VVHPEO\SURJUDPPLQJLQFOXGLQJWKH&38PHPRU\LQVWUXFWLRQH[HFXWLRQDQG,2$OWKRXJK
KDQGOH,2ZLWKPXOWLSOHGHYLFHVDWDWLPH :KHQ,2FKDQQHOVDUHSUHVHQWWKH&38LVUHOLHYHGRI
$VVHPEO\FRGHZDVGLVFXVVHGLQWKLVFKDSWHUDOORIWKHFRQFHSWVDUHFUXFLDOIRUZKDW\RXZLOOOH
HYHU\,2LQVWUXFWLRQH[FHSWWKHYHU\ILUVWLQVWUXFWLRQWKDWWHOOVWKH,2FKDQQHOWRSHUIRUPDWDVN$IWHU
WKH ILUVW LQVWUXFWLRQ WKH ,2 FKDQQHO WDNHV RYHU DQG FRQWUROV WKH ,2LQ VXEVHTXHQW
PRGXOH FKDSWHUV
FRPSOHWLQJ WKH<RX
,2ZLOO ILQG \RXUVHOI UHIHUULQJ WR WKLV FKDSWHU VSHFLILFDOO\ WKH VHFWLRQV
RSHUDWLRQZLWKRXWXVLQJDQ\PRUH&38F\FOHV PHPRU\DQG&38UHJLVWHUVDV\RXUHDGIXWXUHFKDSWHUVDQGZULWH\RXUILUVW$VVHPEO\SURJUDPV
6XPPDU\ .H\7HUPV
DGGUHVVEXV RI SURFHVVRU DQG
1RZ WKDW \RX KDYH ILQLVKHG WKLV FKDSWHU \RX VKRXOG KDYH D EDVLF XQGHUVWDQGLQJ
• Walaupun DMA hadir menyelesaikan masalah CPU berkenaan dengan operasi2 I/O, modul DMA itu sendiri
bukanlah prosesor yang lengkap; ia harus “mencuri” cycle dari CPU untuk menyelesaikan tugas2 DMA.
Dengan demikian CPU masih melakukan kerja. Solusi untuk masalah cycle-stealing ini adalah memiliki satu
modul yang terdedikasi untuk operasi2 I/O yakni, sudah tentu, prosesor yang nyata. Teknik demikian
menghilangkan kebutuhan akan modul untuk mencuri cycle dari CPU. Solusi ini dinamakan I/O channel.
• Kanal2 I/O berbeda; beberapa menangani I/O dengan satu piranti pada satu waktu, yang lain bisa multiplex
(yakni menangani I/O dengan beberapa piranti pada satu waktu). Ketika ada beberapa I/O channel, CPU
terbebas dari setiap instruksi I/O kecuali instruksi yang pertama yang memberitahukan I/O channel untuk
melakukan sebuah tugas. Setelah instruksi pertama, I/O channel mengambil alih dan mengendalikan modul
I/O, menyelesaikan operasi I/O tanpa menggunakan CPU cycle lagi.
Sisi Perangkat Lunak
(Sistem Operasi, Proses Boot, Stack, Pengalamatan
Instruksi dan Data)
Sistem Operasi
• Sistem Operasi menyediakan akses umum (general), bebas-piranti (device-
independent) ke sumberdaya2 komputer seperti keyboard, layar dan disk
drive.
• “Device Independence” berarti Anda tidak perlu urus piranti habis2an
karena sistem akan menangani operasi2 I/O pada tingkat piranti, tidak
perlu bergantung pada program yang meminta operasi itu.
• Organisasi Sistem Operasi MS-DOS
Ada tiga komponen utama: IO.SYS, MSDOS.SYS dan COMMAND.COM
IO.SYS melakukan fungsi2 inisialisasi saat bootup dan juga berisi fungsi2 I/O penting
dan device drivers yang melengkapi (suplement) dukungan primitive I/O dalam ROM
BIOS. Komponen ini disimpan dalam disk sebagai system file tersembunyi dan dikenal
pada PC-DOS sebagai IBMBIO.COM.
MSDOS.SYS berlaku sebagai kernel sistem dan terkait dengan manajemen file,
manajemen memori dan I/O. Komponen ini disimpan dalam disk sebagai system file
tersembunyi dan dikenal pada PC-DOS sebagai IBMDOSCOM.
COMMAND.COM merupakan prosesor perintah atau shell yang bertindak sebagai
antarmuka antara user dan sistem operasi. Ia menampilkan user prompt, memonitor
keyboard dan memproses perintah2 user seperti menghapus sebuah file atau
mengangkat (loading) sebuah program untuk dieksekusi.
Proses Boot
• Ketika komputer pertama dihidupkan terjadilah “cold boot”. Prosesor masuk ke reset
state membersihkan semua lokasi memori menjadi zero atau NOL, melakukan parity
check dari memori, dan mengeset register CS ke alamat segment FFFFh dan register IP ke
offset zero. Oleh karena itu instruksi pertama yang siap dieksekusi akan berada di alamat
pasangan CS:IP yakni FFFF0h, sebuah titik entri ke BIOS dalam ROM.
• BIOS Routine yang mulai pada lokasi FFFF0h mengecek beragam port untuk identifikasi
dan inisialisasi piranti2 yang terhubung ke komputer lalu membangun dua data area:
1. Sebuah interrupt vector table, mulai dari memori rendah pada lokasi 0 dan berisi alamat2 untuk
interrupt bekerja.
2. Sebuah BIOS data area mulai lokasi 40(0)h, kebanyakan berkenaan dengan piranti2 terpasang.
• Lalu BIOS menentukan apakah disk yang berisi system files ada, dan jika ada ia
mengakses bootstrap loader dari disk. Program ini mengangkat (load) system files IO.SYS
dan MSDOS.SYS dari disk ke memori dan memindahkan kendali ke titik entri dari IO.SYS,
yamgmana berisi device drivers dan kode hardware-specific lainnya. IO.SYS merelokasi
dirinya sendiri dalam memori dan selanjutkan memindahkan kendali kepada MSDOS.SYS.
Modul ini menginisialisasi tabel2 internal DOS dan porsi DOS dalam tabel interrupt. Ia
juga membaca file CONFIG.SYS dan mengeksekusi perintah2. Akhirnya MSDOS.SYS
menyerahkan kendali kepada COMMAND.COM yang memproses file AUTOEXEC.BAT,
menampilkan prompt dan memonitor input dari keyboard.
• Pada titik ini, memori konvensional sebesar 640K sudah muncul seperti Gambar 2-1. Di
bawah manajemen memori, bagian dari sistem direlokasi ke memori atas.
Struktur Memori Setelah
Sistem Operasi Loading
Agar supaya program dapat dijalankan pada PC, DOS perlu
mengangkat (load) dulu ke dalam RAM. Dimanakah letaknya pada
RAM ? Pada saat merancang IBM PC yang berbasis 8088 dengan
kemampuan memori 1 megabyte (alamat 20-bit 00000 sd. FFFFFh)
membuat alokasi memori yang disebut memory map.
1. Alamat 00000-9FFFFh (640K byte) diperuntukkan untuk RAM
2. Alamat A0000h-BFFFFh (128K byte) dialokasikan untuk memori
video
3. Sisanya alamat C0000h-FFFFFh (256K byte) diperuntukkan untuk
ROM.
Mengenai RAM
Pada awal 1980-an kebanyakan PC hanya punya RAM 64K sampai 256K byte yang dianggap cukup
pada saat itu. User perlu membeli tambahan memory expansion board untuk mencapai 640K jika
memang diperlukan, biasanya tergantung dari versi DOS yang dipakai dan kebutuhan software
aplikasi. DOS mengalokasikan RAM yang tersedia untuk keperluan PC sendiri dan sisanya untuk
aplikasi misal word processor. Tugas mengelola memori RAM diserahkan kepada DOS mengingat
setiap versi DOS berbeda pemakaian memorinya dan komputer berbeda bisa memiliki jumlah RAM
berbeda, apalagi paket aplikasi juga berbeda2 kebutuhannya. Alasan itulah mengapa kita tidak
menetapkan (assign) nilai2 register CS, DS dan SS karena penetapan demikian berarti memastikan
alamat fisik dalam rentang 00000 – 9FFFFh dan ini di luar pengetahuan user. Alasan lainnya adalah
penetapan demikian bisa saja bekerja di satu PC, tetapi tidak di PC lain dengan versi DOS dan ukuran
RAM berbeda. Oleh karena itu manajemen memori adalah salah satu fungsi maha penting sistem
operasi DOS dan seharusnya memang diserahkan kepada DOS.
Ini penting diingat karena banyak contoh dalam Modul ini yang menyangkut nilai2 register CS, DS
dan SS akan Anda temukan berbeda pada PC Anda.
Video RAM
Dari alamat A0000h sampai dengan BFFFFh diperuntukkan video. Jumlah yang dipakai dan lokasinya
beragam tergantung dari video board terpasang pada PC.
Lebih Jauh tentang ROM
Dari C0000h sampai FFFFFh diperuntukkan ROM. Tidak semuanya digunakan oleh PC ROM. Dari
256K byte, hanya 64K byte dari lokasi F0000h – FFFFFh dipakai oleh BIOS (basic input/output) ROM.
Sebagian ruang sisanya digunakan oleh beragam adapter card (mis. card2 untuk hard disk), sisanya
bebas. DOS terakhir2 memiliki kemampuan manajemen memori bagus dan mampu menggunakan
ruang memori lebih dari 640K. Ruang memori dari 00000 sampai 9FFFFh dinamakan conventional
memory, kemudian sejumlah 384K byte dari A0000h sampai FFFFh dinamakan UMB (upper memory
block) seperti tertulis dalam dokumentasi DOS 5.
Interrupt BIOS lebih cepat dibanding interrupt DOS tetapi implementasinya sangat bergantung pada
hardware (hardware specific). Penggunaan interupt DOS biasanya mudah. Pemilihan interrupt tergantung
pada karakteristik yang akan kita berikan pada program: SPEED à BIOS, PORTABILITY à DOS.
Interrupt yang sering digunakan:
• INT 21h (DOS) adalah interrupt DOS yang paling banyak digunakan untuk banyak fungsi
• INT 10h (BIOS) Video I/O
• INT 16h (BIOS) Keyboard I/O
• INT 17h (BIOS) Printer I/O
Interrupts
Hardware Software
Interrupts Interrupts INT n
• Interrupt :
• Terus bergerak sampai diinterupsi oleh sensor
• Interrupt diterima lalu lakukan operasi yang telah didefinisikan
• Setelah menyelesaikan layanan interrupt, kembali ke operasi
normal, yakni kembali bergerak lagi.
Bagaimana Memperoleh Ketikan dari Keyboard ?
• Polling
CPU mengeksekusi sebuah program yang mengecek data tersedia. Jika tombol tuts ditekan
maka baca data, selain itu terus tunggu (waiting) atau ulang (looping).
• Interrupt
CPU mengeksekusi program lain, begitu ada tombol tuts ditekan, Keyboard membangkitkan
sebuah interrupt. CPU akan merespons ke interrupt membaca data. Setelah itu kembali ke
program sebelumnya. Sehingga dengan penggunaan interrupt yang tepat, CPU mampu
melayani banyak piranti2 pada waktu yang sama sekaligus.
• Keyboard controller hanya mampu menyimpan satu keystroke tunggal. Oleh
karena itu, keyboard controller harus “dibebaskan” sebelum keystroke berikutnya
tiba.
• Keystroke dikirim ke CPU dengan meletakkannya dalam keyboard buffer sehingga
keyboard controller dapat terus menjaga keyboard input ke CPU.
Sistem Berbasis Polling
Keystroke dikirim ke CPU
ada keystroke
SP berkurang 2 (menjadi 32h) dan simpan BX (04E3h) ke dalam stack sebagai E304h:
PUSH BX
Mengambil word dari lokasi yang ditunjuk SP dalam stack (E304h) masuk ke dalam register BX dan tambahkan SP
POP BX dengan 2 (menjadi 34h). Sekarang BX berisi 04E3h, dengan urutan byte2 terkoreksi. Sekarang stack menjadi :
Mengambil word dari lokasi yang ditunjuk SP dalam stack (6B02h) masuk ke dalam register AX dan tambahkan SP
POP AX dengan 2 (menjadi 36h). Sekarang AX berisi 026Bh dengan urutan byte2 terkoreksi.
POP AX Mengambil word dari lokasi yang ditunjuk SP dalam stack (6B02h) masuk ke dalam register AX dan tambahkan SP
dengan 2 (menjadi 36h). Sekarang AX berisi 026Bh dengan urutan byte2 terkoreksi. Sekarang stack terlihat
seperti :
• Perhatikan bahwa instruksi2 POP ditaruh dalam urutan terbalik dari instruksi2 PUSH; pada contoh
di atas PUSH register2 AX dan BX, tetapi POP BX dan AX (urutannya dibalik, seperti menaruh dan
mengambil nampan dari tumpukan)
• Perhatikan pula bahwa nilai2 yang telah ditaruh ke dalam stack masih terus ada, walaupun SP
sudah tidak lagi menunjuknya.
• Anda harus selalu memastikan program Anda konsisten memelihara urutan PUSH dan POP.
Walaupun terlihat sederhana, ini sering menyebabkan program crash.
• Bagi program .EXE, Anda perlu mendefinisikan ruang stack yang cukup besar untuk memegang
semua nilai yang akan di PUSH..
• Instruksi2 terkait dengan mendorong (push) nilai ke dalam stack dan mengambil (pop) kembali
adalah:
• PUSHF dan POPF: save dan restore status dari flags
• PUSHA dan POPA (untuk 80286 ke atas): save dan restore isi semua GPR.
Pengalamatan Instruksi dan Data
• Sebagai programmer Bahasa Assembly menulis program dalam kode
simbolik dan menggunakan Assembler untuk menerjemahkannya ke
kode mesin.
• Agar program bisa jalan, sistem mengangkat (load) hanya kode mesin
ke memori. Setiap instruksi berisi sedikitnya satu operasi, yakni move,
add, atau return. Bergantung operasinya, sebuah instruksi juga bisa
punya satu atau lebih operand yang merujuk data operasi untuk
diproses.
• Program .EXE menggunakan register CS untuk menyediakan alamat
awal code segment program, dan register DS menyediakan alamat
awal dari data segment. Code Segment berisi instruksi2 yang akan
dieksekusi, sedangkan Data Segment berisi data dimana instruksi2
merujuk. Register IP sebagai alamat offset dari instruksi terkini dalam
code segment yang akan dieksekusi. Operand instruksi menunjukkan
alamat offset dalam data segment yang dirujuk.
• Bayangkan sebuah contoh dimana program loader telah ditentukan untuk mengangkat (load)
program .EXE ke memori, mulai lokasi 05BE0h. Maka loader mengeset register CS dengan
alamat segment 05BEh. Program yang sudah siap dieksekusi, dan IP terkini berisi offset 0023h.
CS:IP bersama2 menentukan alamat dari instruksi berikutnya yang akan dieksekusi sebagai
berikut:
Alamat segment CS: 05BE0h
IP offset: +0023h
Alamat Instruksi: 5C03h
• Anggaplah instruksi mulai 05C03h menyalin isi dari sebuah byte dalam memori ke dalam
Lokasi register AL; byte tersebut ada di offset 0016h dalam data segment. Maka kode mesin dan kode
05C03h
simbolik operasi ini: Catatan:
A01600 MOV AL,[0016] A0 adalah kode mesin dari instruksi MOV
• Alamat memori 05C03h berisi byte pertama (A0) dari instruksi yang prosesor akan akses. Byte
kedua dan ketiga berisi nilai offset dalam urutan byte terbalik (0016 menjadi 1600).
• Katakanlah loader telah menginisialisasi register DS dengan alamat segment 05D1h. Untuk
mengakses data item, prosesor menentukan lokasinya dari alamat segment di register DS
tambah offset (0016h) dalam operand instruksi. Karena DS berisi 05D1h, lokasi aktual data
item yang dirujuk adalah:
Alamat segment DS: 05D10h
Segment offset: +0016h
Alamat data item: 5D26h
• Katakanlah pada alamat 05D26h berisi 4Ah. Prosesor lalu mengekstrak 4Ah pada alamat 05D26h,
menyalinnya ke register AL seperti Gambar 2-3.
• Saat prosesor menjemput setiap byte instruksi, ia menaikkan/tambah register IP dengan 1. Karena
asalnya IP adalah 23h dan kode mesin yang sedang eksekusi sebesar 3 byte, sekarang IP berisi
0026h, yakni offset untuk instruksi berikutnya. Prosesor sekarang siap untuk instruksi berikutnya,
yang lokasinya efektif dari alamat segment dalam CS (05BEh) tambah offset dalam IP (0026h) yakni
05C06h.
• Instruksi bisa mengakses lebih dari satu byte pada satu waktu. Misalkan, anggaplah sebuah
instruksi untuk menyimpan isi dari register AX (0248h) menjadi dua byte berturutan dalam data
segment mulai offset 0016h. Kode simbolik MOV [0016],AX. Operand [0016] dalam kurung kotak
(operator indeks) menunjukkan lokasi memori, untuk membedakannya dari nilai 16. Prosesor
menaruh dua byte ke dalam AX dalam urutan yang terbalik sebagai:
Isi Byte 48 02
Offset dalam Data Segment 0016 0017
• Instruksi lainnya MOV AX,[0016] mengambil byte2 ini dengan menyalinnya dari memori kembali ke
AX. Operasi membalik (dan mengkoreksi) byte2 dalam AX sebagai 02 48.
OPERAND2 INSTRUKSI
• Salah satu fitur dari operand2 instruksi yang perlu diperjelas adalah penggunaan
nama2, berupa nama2 dalam kurung kotak dan bilangan2. Dalam contoh berikut,
DW mendefinisikan WORDX sebagai sebuah word (2 byte):
WORDS DW 0 ;Define WORDX as word
…
MOV CX,WORDX ;Move contents of WORDX to CX
MOV CX,25 ;Move value 25 to CX
MOV CX,DX ;Move contents of DX to CX
MOV CX,[DX] ;Move contents of location addressed by DX
Untuk kemudahan pemahaman maka pelajaran menggunakan MASM 6.15 yang masih 16-bit dan simulator EMU8086 4.08.
Persiapan Software Assembler
• Pasang software MASM 6.15
• Download software dari https://winworldpc.com/home
• Ekstrak software ke dalam C:\>masm615
• Masukkan C:\>masm615\bin ke dalam Environment Variable
• Buka COMMAND.COM
• Pasang software EMU8086 4.08
• Download software dari
https://www.4shared.com/rar/wa8iHotqce/emu8086_408.html
• Ekstrak software ke dalam C:\>
• Klik ICON aplikasi EMU8086
Program .COM
-----------------------------------------------------------
• Program .COM1) hanya menggunakan 1 segment (ukuran maksimal data + program
adalah 64KiB) dengan struktur Assembly sbb: .MODEL SMALL
.CODE
ORG 100H
Label2 : +---------------------+
| TEMPAT PROGRAM |
+---------------------+
• .MODEL SMALL : tanda directive untuk memberitahukan kepada Assembler
bentuk memori yang akan digunakan oleh program kita. INT 20H
1. TINY – Jika program Anda hanya menggunakan 1 segment seperti program COM. END Label1
Model ini disediakan khusus untuk program COM. -----------------------------------------------------------
2. SMALL – Jika data dan kode yang digunakan oleh program kurang dari ukuran 1 segment atau 64 KiB.
3. MEDIUM – Jika data yang digunakan kurang dari 64 KiB, tetapi kode bisa lebih dari 64 KiB
4. COMPACT – Jika data yang digunakan bisa lebih besar dari 64 KiB tetapi kode kurang dari 64 KiB
5. LARGE – Jika data dan kode yang dipakai oleh program bisa lebih dari 64 KiB
6. HUGE – Jika data, kode maupun array yang digunakan bisa lebih dari 64 KiB.
• JMP tujuan : digunakan untuk melompat menuju tempat yang ditunjuk. Pada struktur di atas dimaksudkan agar melewati tempat
data program, karena jika tidak ada perintah JUMP ini maka data program akan ikut dieksekusi sehingga kemungkinan besar akan
menyebabkan program Anda menjadi Hang.
• INT 20h : perintah Interupsi bernomor 20h berfungsi untuk mengakhiri program, mengembalikan status register2 dan
menyerahkan kendali sepenuhnya kepada DOS. Pada program COM cara ini bukanlah satu2nya, tetapi cara inilah yang paling
efektif untuk digunakan. Jika tidak diterminasi, program tidak akan tahu kapan harus selesai, komputer bisa menjadi hang.
1) Sebaliknya program EXE bisa lebih dari 1 segment. Mungkin ada yang bertanya-tanya mengapa pada progam COM yang dibuat digunakan model SMALL bukan
TINY ? Hal ini disebabkan karena banyak dari compiler bahasa tingkat tinggi yang tidak berkomunikasi dengan model TINY, sehingga kita gunakan model SMALL
sebagai pemecahannya.
Program .EXE
• Program EXE tidak dibatasi oleh satu segment sehingga ukurannya bisa lebih dari 64 KiB.
Akan tetapi karena program EXE bisa mengakses segment lain, maka perintah CALL dan
JMP menggunakan jenis FAR (program COM berbentuk NEAR) karena memerlukan
informasi alamat dari segment (CS) selain offset (IP). -----------------------------------------------------------
.MODEL SMALL
----------------------------------------------------------
• Pada program EXE, register segment CS dan SS diinialisasi secara otomatis, tetapi
register segment DS dan ES tidaklah demikian. Register segment DS dan ES pada
awalnya menunjuk pada awal program, yaitu PSP. Karenanya register DS perlu kita
inialisasi secara manual agar menunjuk pada segment data melalui perintah:
MOV AX, @DATA
MOV DS, AX
• Pada program EXE, kita perlu mendefinisikan tempat untuk stack. Pendefinisian tempat
untuk stack digunakan tanda directive: .STACK yang diikuti dengan banyaknya stack
yang didefinisikan untuk program. Pada model yang kita gunakan didefinisikan tempat
untuk stack sebanyak 200h Word yang tentunya sudah lebih dari cukup untuk
digunakan oleh program-program pada umumya.
• Berbeda dengan program COM, yang selalu kita akhiri dengan interupsi 20h, pada
program EXE interupsi 20h tidak bisa digunakan. Pada program EXE digunakan interupsi
21h fungsi 4Ch dengan register AL berisi kode return. Interupsi 21h fungsi 4Ch ini lebih
fleksibel untuk digunakan, karena selain kontrol akan dikembalikan kepada DOS, file-file
yang terbuka juga akan ditutup oleh fungsi ini. Fungsi ini juga akan mengembalikan
vektor interupsi default 22h, 23h dan 24h. Anda juga bisa mengakhiri program COM
dengan fungsi ini.
Menjalankan Program
Ketika Anda meminta sistem mengangkat (load) sebuah program .EXE dari disk ke
dalam memori untuk eksekusi, loader melakukan langkah2 berikut:
1. Mengakses program .EXE dari disk
2. Membangun program segment prefix (PSP) sebesar 256 byte (100h) pada
paragraph boundary (atau segment) yang tersedia dalam internal memori.
3. Menyimpan (store) program dalam memori berturutan langsung setelah PSP.
4. Mengangkat (load) alamat dari PSP dalam register2 DS dan ES.
5. Mengangkat (load) alamat dari code segment dalam register CS dan mengeset
register IP ke offset dari instruksi pertama (biasanya NOL) dalam code segment.
6. Mengangkat (load) alamat dari stack dalam register SS dan mengeset register
SP ke ukuran dari stack.
7. Mengalihakan kendali ke program untuk eksekusi, mulai (biasanya) dengan
instruksi pertama dalam code segment.
Terlihat bahwa program loader dengan benar menginisialisasi register2 CS:IP dan
SS:SP. Tetapi perhatikan bahwa program loader menaruh alamat PSP baik pada
register DS maupun ES, walaupun biasanya program Anda perlu alamat dari data
segment dalam register2 ini. Konsekuensinya, program .EXE Anda harus
menginisialisasi DS dengan mendefinisikan secara manual alamat data segment
dalam program.
Program Loading
Program2 diangkat (loaded) dengan utilitas bernama program loader. Setelah program diangkat, CPU
(IP/EIP/RIP) menunjuk ke titik masuk (entry point) program (yakni: main, start). Di sinilah umumnya disebut
sebagai langkah awal pogram, yaitu apa yang terjadi saat kita buka sebuah program (mis. dengan klik dua
kali)
1. OS mengambil (retrieve) informasi program seperti ukuran file dan lokasi fisik dalam disk.
2. OS menentukan lokasi yang tepat dalam memori, mengalokasikan ruang, dan menempatkan informasi
yang perlu dalam tabel descriptor.
3. OS memulai eksekusi instruksi pertama (entry point), lalu menjadi sebuah proses, yang diberikan
sebuah ID.
4. Proses berjalan bebas atau independen, dan OS merespons request2 proses untuk sumberdaya.
5. Ketika proses berakhir, memori dilepaskan.
5 Langkah Proses Pembuatan Program
1. Desain Algoritma
• Penetapan masalah
• Pengusulan solusi yang terbaik
• Pembuatan diagram skematik yang digunakan agar usulan solusi lebih baik à
flowchart Untuk membuat program dalam Bahasa Assembly tersedia dua
2. Pengkodean Algoritma opsi:
• Penulisan program dalam bahasa 1. Menggunakan Assembler (Microsoft Assembler MASM,
pemrograman tertentu (dalam Borland Turbo Assembler TASM, Netwide Assembler
hal ini Bahasa Assembly) NASM, GNU Assembler GAS, dst)
3. Penerjemahan ke Bahasa Mesin 2. Debugger
• Pembuatan program obyek, atau dengan kata lain program ditulis dalam suatu
deret/urutan 0 dan 1 yang dapat diinterpretasikan oleh prosesor.
4. Test Program
• Eksekusi program pada mesin komputer
5. Mengeliminasi Kesalahan Yang Terdeteksi
• Koreksi kesalahan umumnya memerlukan pengulangan seluruh langkah2 dari
Langkah 1 atau 2.
Compiling, Linking and Executing Programs
loop: lw $t3, 0($t0)
lw $t4, 4($t0)
1 EDITING add $t2, $t3, $t4 Assembly program (text file)
sw $t2, 8($t0)
hello.asm addi
addi
$t0,
$t1,
$t0, 4
$t1, -1
source code
bgtz $t1, loop
Misal: VIDEO_IO.ASM
hello.asm 2 COMPILING
c:\>ml /c hello.asm
Mikroprosesor atau mikrokontroler hanya mengenal Bahasa Mesin berupa 0 dan 1 sehingga Assembler
perlu mengkonversi Bahasa Assembly menjadi bahasa biner dan mengangkatnya (loading) atau
menyimpannya dalam memori sebelum program bisa dijalankan (eksekusi).
Relocatable vs Running Machine Language
Apa maksudnya “relocatable” machine language ?
• Ketika kode Assembly di-compile atau di-assemble menjadi object code, kode itu
dalam bentuk generik dimana instruksi pertama selalu mulai dari alamat 0x0h
dan alamat2 instruksi berikutnya adalah offset dari instruksi2 yang
mendahuluinya dalam ukuran byte.
• Ketika program diangkat (load) ke memori, instruksi pertama akan memiliki
alamat yang sah (legitimate address) dimana alamat instruksi2 berikutnya
merujuk berdasarkan offset dari situ.
Relocatable machine language Running machine language
_main: main:
00000000 b80a000000 movl $0xa, %eax 0x1fac <+0>: movl $0xa, %eax
00000005 48 decl %eax 0x1fb1 <+5>: decl %eax
00000006 bb05000000 movl $0x5, %ebx 0x1fb2 <+6>: movl $0x5, %ebx
0000000b c3 retl 0x1fb7 <+11>: retl
Format2 dari file objek menurut platform OS
Windows macOS Linux
COFF, PE, Win32, Win64 Mach-o ELF, a.out (deprecated)
Melihat Bentuk Assembly dari
Bahasa Tingkat Tinggi
• Gunakan C IDE dari CodeBlocks (http://www.codeblocks.org/downloads/26). Ambil
versi yang menyertakan GCC/G++ compiler dan GDB debugger dari TDM-GCC, mis.
codeblocks-17.12mingw-setup.exe
• Masukkan C:\Program Files\CodeBlocks\MinGW\bin dalam Environment Variable PATH.
• Buat program Bahasa Tingkat Tinggi: .file
.version
“ctest.c”
“01.01”
gcc2_compiled.:
• Lakukan kompilasi: #include <stdio.h>
.LC0:
.section .rodata
int main()
C:\>gcc –o ctest ctest.c { .text
.string “Hello, world!\n”
.align 16
C:\>dir printf(“Hello, world!\n”); .globl main
exit(0); .type main,@function
ctest.exe } main:
pushl %ebp
C:\>ctest movl %esp, %ebp
subl $8, %esp
C:\>Hello, world! relocatable machine language subl $12, %esp
pushl $.LC0
C:\>gcc –S ctest.c call
addl
printf
$16, %esp
C:\>type ctest.s subl
pushl
$12, %esp
$0
call exit
.Lfe1:
.size main,.Lfe1-main
.ident “GCC: (GNU) 2.96 20000731 (Linux-Mandrake 8.0 2.96-0.48mdk)”
$
GNU Debugger gdb
• Selain DEBUG.COM bawaan Microsoft Windows, GNU debugger gdb juga dapat
digunakan untuk melacak program. Agar bisa didebug, executable file harus dikompilasi
dengan opsi –gstabs agar mengikutkan informasi penting dalam executable file sehingga
debugger mengetahui dimana dalam letak instruksi2 dalam kode sumber.
$ gcc -gstabs -o ctest ctest.c
$ gdb ctest Perintah Penjelasan
GNU gdb 5.0mdk-11mdk Linux-Mandrake 8.0
Copyright 2001 Free Software Foundation, Inc. break set breakpoint dalam kode sumber untuk menghentikan eksekusi
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions. set watchpoint untuk menghentikan eksekusi saat variabel
Type “show copying” to see the conditions. watch
There is absolutely no warranty for GDB. Type “show warranty” for details. mencapai nilai tertentu
This GDB was configured as “i386-mandrake-linux”... Mengamati elemen2 sistem yakni register2, stack dan memori
(gdb) info
(gdb) list
1 #include <stdio.h> x menguji lokasi memori
2
3 int main()
4 { print menampilkan nilai2 variabel
5 printf(“Hello, world!\n”);
6 exit(0);
run memulai eksekusi program dalam debugger
7 }
(gdb) break main
Breakpoint 1 at 0x8048496: file ctest.c, line 5. list mendaftar fungsi2 atau baris2 tertentu
(gdb) run
Starting program: /home/rich/palp/ctest
next melangkah ke instruksi berikutnya dalam program
Breakpoint 1, main () at ctest.c:5
5 printf(“Hello, world!\n”); melangkah ke instruksi berikutnya dalam program
(gdb) next step
Hello, world!
6 exit(0); cont melanjutkan eksekusi program dari titik berhenti
(gdb) next
Program exited normally. until jalankan program sampai ia mencapai baris kode sumber tertentu
(gdb)quit (atau lebih besar)
$
Program GNU Objdump
• GNU Objdump dibutuhkan agar programmer mampu melihat kode2 instruksi yang
dibangkitkan oleh compiler dalam file kode objek. Objdump bukan hanya menampilkan
kode bahasa assembly, tetapi kode2 instruksi raw (mentah) yang dibangkitkan.
• Agar compiler dapat membangkitkan file objek sehingga bisa di-dump, gunakan opsi –c:
$ gcc -c ctest.c
$ objdump -d ctest.o
00000000 <main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: 83 ec 0c sub $0xc,%esp
9: 68 00 00 00 00 push $0x0
e: e8 fc ff ff ff call f <main+0xf>
13: 83 c4 10 add $0x10,%esp
16: 83 ec 0c sub $0xc,%esp
19: 6a 00 push $0x0
1b: e8 fc ff ff ff call 1c <main+0x1c>
$
Program GNU Profiler
• Program GNU profiler (gprof) dipakai untuk menganalisa eksekusi program dan mementukan dimana “hot
spots” (titik2 panas) dalam aplikasi. Titik2 panas aplikasi adalah fungsi2 yang memerlukan jumlah waktu
pemrosesan paling banyak saat program berjalan. Seringkali ini berupa fungsi2 intensif matematis, tetapi
tidak selalu. Fungsi2 yang intensif I/O juga meningkatkan waktu pemrosesan.
• Agar aplikasi gprof bisa digunakan, Anda perlu memastikan fungsi2 yang akan dimonitor dikompilasi
menggunakan parameter –pg. Parameter ini mengompilasi source code, memasukkan sebuah call ke
subrutin mcount bagi setiap fungsi dalam program. Saat aplikasi berjalan, subrutin mcount membuat
sebuah call graph profile file bernama gmon.out, yang berisi informasi timing setiap fungsi dalam aplikasi.
#include <stdio.h> % cumulative self self total
$ gcc -o demo demo.c -pg
void function1()
time seconds seconds calls us/call us/call name
{
$ ./demo 67.17 168.81 168.81 50000 3376.20 5023.11 function2
int i, j; $ 32.83 251.32 82.51 50100 1646.91 1646.91 function1
for(i=0; i <100000; i++)
j += i;
$ ls -al gmon.out
} -rw-r--r-- 1 rich rich 426 Jul 7 12:39 gmon.out
void function2()
{ $ gprof demo > gprof.txt
int i, j; $
function1();
for(i=0; i < 200000; i++) index % time self children called name
j = i; <spontaneous>
} [1] 100.0 0.00 251.32 main [1]
168.81 82.35 50000/50000 function2 [2]
int main() 0.16 0.00 100/50100 function1 [3]
{ -----------------------------------------------
int i, j; 168.81 82.35 50000/50000 main [1]
for (i = 0; i <100; i++) [2] 99.9 168.81 82.35 50000 function2 [2]
function1(); 82.35 0.00 50000/50100 function1 [3]
-----------------------------------------------
for(i = 0; i<50000; i++) 0.16 0.00 100/50100 main [1]
function2(); 82.35 0.00 50000/50100 function2 [2]
return 0; [3] 32.8 82.51 0.00 50100 function1 [3]
} -----------------------------------------------
Anda sudah siap berpetualang Bahasa Assembly !
Bahan dapat diakses di: http://bit.ly/2pGn6Cl