SlideShare a Scribd company logo
1 of 100
Memahami Bahasa Assembly
lewat Arsitektur Komputer
Tan Arman
tanarman@yahoo.com
Versi 1.01, 21 Oktober 2019
Pengantar
1. Kita memulai dengan Sejarah Mikroprosesor dan Mikroprosesor Intel.
2. Mengapa belajar Bahasa Assembly dan apa saja yang akan dipelajari ?
3. Memahami alur penerjemahan Bahasa Tingkat Tinggi ke Bahasa Mesin, bahasa alami perangkat keras.
4. Memahami lapisan ISA sebuah antarmuka antara hardware dan software yang mendorong adanya
Arsitektur CISC vs RISC.
5. Sisi perangkat keras komputer: CPU, Memory (Register, Cache dan RAM), peralatan Input-Output.
Arsitektur CPU menjelaskan tentang proses pengolahan instruksi dan data, bagaimana Register menjadi
sarana penyimpanan dan pengolahan oleh CPU dalam melakukan tugas2 nya yakkni aritmetika, logic dan
kontrol.
Yang berkaitan dengan memori adalah memori yang berada dalam CPU (Register), dalam IC bersama CPU
(Cache) dan di luar CPU (RAM dan ROM). Topik utama memori adalah pengalamatan (addessing) yakni
bagaimana mengambil dan menyimpan instruksi dan data (per byte) dari dan ke memori.
Peralatan Input-Output memanfaatkan teknik Intterupt untuk mendapatkan perhatian dari CPU.
6. Sisi perangkat lunak mempelajari bagaimana memori diduduki oleh sistem operasi dan cara2
mengaksesnya dari aplikasi. Konsep tentang Interrupt diperjelas lagi lebih lengkap, begitu pula tentang
stack. Di sini Anda akan dipersiapkan dengan tools untuk mulai bekerja. Anda akan melihat bagaimana
Bahasa Tingkat Tinggi, Bahasa Assembly dan Bahasa Mesin bersambungan sehingga selanjutnya Anda akan
percaya diri bermain dengan Bahasa Assembly.
• Jantung komputer adalah mikroprosesor (µP) yang menangani kebutuhan komputer atas aritmetika, logic dan
kontrol. Mikroprosesor bermuara di tahun 1960-an1) ketika para perancang peneliti memanfaatkan rangkaian
terpadu atau integrated circuit (IC) dengan menggabungkan beragam komponen elektronik menjadi satu
komponen tunggal dalam sebuah emping silikon (silicon chip). Pabrikan membuatnya seperti piranti
menyerupai kelabang dan IC2 disambung2 menjadi sebuah sistem yang berfungsi. Pada April 1972, Intel®
memperkenalkan chip 8008, generasi pertama mikroprosesor 8-bit.
• Pada tahun 1974, 8008 berkembang menjadi 8080, mikroprosesor generasi kedua yang begitu populer
pemanfaatannya sebagai general-purpose. Pada tahun 1978 keluar generasi ketiga prosesor 8086 yang
kompatibel dengan 8080 dan desainnya jauh ke depan.
• Berikutnya Intel® mengembangkan 80882), suatu variasi dari 8086 yang memiliki desain lebih sederhana dan
kompatibel terutama bagian perangkat input/output. 8088 inilah yang dipilih IBM® pada tahun 1981 sebagai
jantung personal computer IBM PC.
• Versi lanjutan 8088 adalah 80188; lanjutan 8086 adalah 80186, 80286, 80386, 80486, Pentium (atau 586),
PentiumPro (atau 6x86) masing2 dengan tambahan operasi2 dan processing power.
• Setiap keluarga prosesor memiliki kelompok instruksi sendiri2 yang unik yang dipakai untuk memerintah
operasi2nya, seperti menerima input dari keyboard, menampilkan data di layar, dan melakukan aritmetika.
Kelompok instruksi ini dikenal sebagai Bahasa Mesin sistem, yangmana cukup rumit dan agak kabur untuk
mengembangkan software. Itulah sebabnya Penyedia Software membuat Bahasa Assembly untuk tiap
keluarga prosesor yang mewakili beragam instruksi dalam kode simbolik yang lebih mudah dipahami.
• Bahasa Tingkat Tinggi seperti C dan BASIC dirancang untuk menghilangkan kesulitan teknis terkait keterikatan
dengan komputer tertentu (cross-platform), sedangkan Bahasa Assembly Tingkat-Rendah memang dirancang
untuk keluarga prosesor tertentu atau spesifik (platform-dependent).
2) 8080 adalah µP 8-bit, sedangkan 8086 adalah µP 16-bit. 8088 adalah variasi dari 8086 (16-bit) tetapi I/O nya kompatibel dengan 8080 atau 8-bit. Ini
menyebabkan ia mampu terhubung dengan piranti2 8-bit terutama memori yang pada saat itu harganya masih sangat mahal mendominasi harga PC.
1) Teknologi CPU elektronik dimulai tahun 1940-an menggunakan tabung vakum. Tabung vakum itu gendut dan menghabiskan banyak listrik. Misalkan,
komputer digital pertama, ENIAC, memerlukan 130.000 watt daya dan menduduki 140 meter persegi. Penemuan transistor pada tahun 1947 mengubah
semuanya, sehingga komputer digital generasi kedua lahir pada tahun 1950-an ditandai dengan produk skala besar IBM 7070, DEC PDP-1, PDP-6, PDP-7 dst.
Latar Belakang Mengapa Belajar Assembly
• Bahasa Assembly merupakan Bahasa pemrograman tertua dari semua
bahasa pemrograman, yang memiliki kesesuaian paling alami dengan
Bahasa Mesin. Untuk berinteraksi dengan Bahasa Mesin digunakan
bentuk perantara numerik berupa heksadesimal mengingat sulitnya
bermain dengan biner.
• Bahasa Assembly memberi akses langsung ke hardware komputer
sehingga Anda mampu memahami lebih dalam arsitektur dan sistem
operasi komputer.
Bahasa Assembly Bahasa Biner Mesin
SUB AX, BX 001010111000011
MOV CX, AX 100010111001000
MOV DX, 0 10111010000000000000000
APA YANG AKAN KITA PELAJARI
• Pelajaran diambil dari arsitektur terkemuka dalam pasar komputasi (x86 dan x86_64)
yang disediakan oleh Intel® dan AMD®. Dengan pengetahuan ini dapat mudah
mempelajari arsitektur yang lain.
• Pelajaran dimulai dengan pemahaman beberapa teori dasar yakni arsitektur hardware
(prosesor, memori, register, pengalamatan), pengenalan sistem operasi DOS, konversi
antar bilangan (desimal – heksadesimal – biner), dilanjutkan dengan akses ke hardware
lewat DEBUG.COM dan Bahasa Mesin. Itulah sebabnya perlu mengerti heksadesimal.
• Semakin rumit aplikasi, maka diperlukan bahasa yang tingkatannya lebih tinggi yakni
Bahasa Assembly. Dalam kerangka membangun aplikasi fenomenal (pada jamannya)
DskPatch1), pemahaman mengenai arsitektur komputer dibangun secara alami karena
aplikasi perlu mengakses aritmetika CPU, akses memori (untuk data, program dan stack)
dan akses Input/Output (layar, keyboard, floppy disk).
• Pemahaman pemanfaatan sumberdaya komputer lewat INT (Interrupt) ke DOS maupun
BIOS sehingga kita tidak perlu membangun semua prosedur dari ground-up juga
diperkenalkan secara bertahap. Kita dapat merasakan kealamian membangun sebuah
software. Sumberdaya itu dinamakan fungsi untuk membedakan dengan prosedur
buatan sendiri (dipanggil lewat instruksi !"##).
• Untuk kemudahan pemahaman maka pelajaran menggunakan MASM 6.15 yang masih
16-bit dan simulator EMU8086 4.08.
Sumber:
https://winworldpc.com/home
https://www.4shared.com/rar/wa8iHotqce/emu8086_408.html
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++:
• 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).
English-likeness C++
if	(this	is	true)	{
peform this	series	of	actions
}
else	{
perform	this	series	of	actions
}
56 (7 == 9) {
:;<= << “@ ABC D AEF =ℎF HAIF”;
}
FLHF {
:;<= << “@ ABC D AEF C566FEFB=”;
}
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
diterjemahkan ke dalam tingkat yang lebih rendah.
• 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-
to-many dengan Bahasa Mesin; artinya satu statement bahasa tingkat-tinggi
berpasangan dengan beberapa instruksi Assembly dan Mesin.
• Assembly merupakan bentuk intermediasi (perantara) dalam translation
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
diterjemahkan menjadi Bahasa Mesin disebut encoding; proses kebalikannya
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
hardware, yang kita sebut digital logic.
High-Level
Language
Assembly
Language
Machine
Language
Digital Logic
encodingdecoding
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)
Tingkat Bahasa Kode
Bahasa
Tingkat Tinggi
C++ sum = 5;
Bahasa
Assembly
GNU Assembler, AT&T syntax movl $0x5, -0x8(%ebp)
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.
Contoh Instruksi Assembly di-encode menjadi bahasa mesin Intel 32-bit
• 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.
Mikroprosesor RISC IBM PowerPC 601
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
Intel 8086 CPU die image
Arsitektur Prosesor Intel®
• Keluarga CPU Intel® dikelompokkan sebagai mesin berarsitektur Von Neumann.1)
• CPU berbicara dengan memori dan piranti I/O dengan menaruh nilai numerik pada
address bus untuk memilih sebuah lokasi memori atau lokasi device port, masing2
punya address numerik yang unik. Lalu CPU, memori, dan piranti2 I/O melalukan
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).
• Terdiri dari 3 blok pembangun: central processing unit
(CPU), memori, dan piranti I/O.
• Ketiga komponen tersambung menggunakan system bus
(terdiri dari address bus, data bus, dan control bus).
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.
2
8086 Assembler Tutorial for Beginners (Part 1)
This tutorial is intended for those who are not familiar with assembler at all, or have a very distant idea about it. Of
course if you have knowledge of some other programming language (Basic, C/C++, Pascal...) that may help you a
lot. But even if you are familiar with assembler, it is still a good idea to look through this document in order to
study Emu8086 syntax.
It is assumed that you have some knowledge about number representation (HEX/BIN), if not it is highly
recommended to study Numbering Systems Tutorial before you proceed.
What is an assembly language?
Assembly language is a low level programming language. You need to get some knowledge about computer
structure in order to understand anything. The simple computer model as I see it:
The system bus (shown in yellow) connects the various components of a computer.
The CPU is the heart of the computer, most of computations occur inside the CPU.
RAM is a place to where the programs are loaded in order to be executed.
Inside the CPU
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).
(Untuk Referensi Saja)
Intel A80386DX-20 CPU die image
Tentang Prosesor
• Bayangkan CPU atau prosesor sebagai otak komputer. CPU
merupakan komponen yang menangani operasi2 aritmetika dan
logika. Empat komponen utama CPU adalah: Arithmetic Logic Unit
(ALU), Control Unit (CU), CPU clock dan memori
(cache dan register2).
• ALU adalah sub komponen matematis CPU yang melakukan
operasi2 aritmetika dan logika atas operand2 integer (Operand2
integer adalah kunci pembeda; masih ada komponen lain yang
bertanggung jawab atas operasi2 pada operand2 floating-point).
• CU bertanggung jawab mengarahkan aliran data dalam CPU, memastikan semua sub
komponen lain dari CPU menerima data yang benar pada waktu yang benar dan bertindak
yang sesuai.
• Instruksi2 CPU yang bergantung atas banyak sub-tasks agar dapat berjalan yang sesuai,
mengikuti Instruction Execution Cycle yang dikomandoi oleh CU. CPU clock, berbeda dengan
system clock, merupakan clock dari CPU itu sendiri yang menjaga waktu bagi operasi2 CPU.
• Kecepatan dari CPU clock dinamakan frekuensi yang diukur dalam Hertz.
Sederhananya jika sebuah prosesor punya frekuensi 1 Hertz (Hz), artinya clock
berdentang satu kali per detik. Dentang atau ticking adalah satu osilasi penuh
(sebuah up-tick dan down-tick).
• Prosesor modern diukur dalam megahert (MHz) atau gigahertz (GHz), yang
berarti masing2 1 juta tick per detik dan 1 milyar tick per detik. Untuk
membayangkannya dalam terminologi clock cycle (diukur dalam satuan waktu),
bukan frekuensi prosesor, kita bisa ambil kebalikan dari frekuensi. Maka fekuensi
1 GHz sama dengan durasi setiap clock cycle sepermilyar detik.
• Hal lain yang perlu diperhatikan adalah kecepatan dimana CPU clock berdentang
(ticking) bisa merupakan kelipatan kecepatan system clock yang ditentukan oleh
multiplier. Misalkan system clock berjalan pada 800MHz dan multipliernya 4,
maka frekuensi CPU
menjadi 3.2GHz. CPU
clock berjalan empat
kali lebih cepat
daripada system clock
dan mampu melakukan
empat kali jumlah operasi dalam waktu yang sama.
Eksekusi Instruksi
• Agar sebuah instruksi dieksekusi (mis. ADD), urutan langkah2 yang dikenal sebagai instruction
execution cycle perlu diikuti. Bagi programmer instruksi ADD seperti proses satu-langkah, tetapi
prosesor membaginya menjadi sub-tasks, atau stages (atau tahapan), yang berisi eksekusi instruksi.
Jumlah stages beragam dari sedikitnya tiga stages pada level abstrak sampai 20 atau lebih ditemukan
dalam prosesor high-end modern. Jadi ketika programmer menulis instruksi ADD untuk
menjumlahkan dua bilangan, ada 20 langkah terjadi di belakang layar yang bergerak sesuai execution
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).
• Pada tahapan Decode, CPU menentukan instruksi apa itu dan data apa yang ia operasikan. Selama
tahapan ini, CPU melihat bit2 instruksi (0 dan 1) dan mampu menentukan jenis operasi (yakni ADD,
SUB, MOV) dan apakah perlu tidaknya operasi menyertakan operand2. Jika operasi memerlukan
operand2, CPU juga perlu menjemputnya (fetch) juga.
• Setelah seluruh data yang diperlukan dijemput (fetched) dan di-decode, CPU dapat Execute instruksi.
Apabila ada hasil, seperti halnya instruksi ADD dan SUB, CPU akan menyimpan (store) hasil pada
tempat yang sesuai (yakni Register, Memori).
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.
• Superpipeline adalah pipeline sampai 20 tahapan. CPU mampu bekerja dengan 20 langkah berbeda
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
mampu mengurangi clock cycle sampai 29, suatu peningkatan kinerja 690%.
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.
Peta Fisik dari Memori Dasar PC 8086
Dari satu megabyte memori, 640K pertama
adalah RAM dasar, kebanyakan tersedia
untuk Anda pakai
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
power-on self-test, pola titik (dot pattern) dari
grafis, dan disk self-loader. Saat Anda tekan tombol
power, ROM melakukan beragam cek dan
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”.
• Memori dapat dibayangkan sebagai kue lapis yang
masing-masing lapis memiliki label atau alamat lokasi.
• Memori menyimpan dalam satuan satu byte per label
lokasi. Artinya untuk nilai yang lebih besar dari satu
byte, 8086 menggunakan lokasi memori berikutnya.
• Data satu word memerlukan dua lokasi memori; data
dua word memerlukan empat lokasi memori.
efficient to align 2-byte objects on even addresses. You can efficiently access
single-byte objects at any address. You’ll see how to set the alignment of
memory objects in Section 3.4.
Figure 1-9: Byte, word, and double-word storage in memory
Before leaving this discussion of memory objects, it’s important to
understand the correspondence between memory and HLA variables. One
of the nice things about using an assembler/compiler like HLA is that you
don’t have to worry about numeric memory addresses. All you need to do is
declare a variable in HLA, and HLA takes care of associating that variable
with some unique set of memory addresses. For example, if you have the
following declaration section:
static
i8 :int8;
i16 :int16;
i32 :int32;
HLA will find some unused 8-bit byte in memory and associate it with the i8
variable; it will find a pair of consecutive unused bytes and associate i16 with
them; finally, HLA will find 4 consecutive unused bytes and associate the
value of i32 with those 4 bytes (32 bits). You’ll always refer to these variables
195
194
193
192
191
190
189
188
187
Double Word at
Address 192
Word at
Address 188
Address
Byte at
Address 186 186
Figure 1-7: Memory write operation
To execute the equivalent of CPU := Memory [125]; the CPU places the
address 125 on the address bus, asserts the read line (because the CPU is
reading data from memory), and then reads the resulting data from the data
bus (see Figure 1-8).
CPU
MemoryAddress = 125
Data = 0
Write = 0
Location
125
CPU
MemoryAddress = 125
Data = Memory[125]
Read = 0
Location
125
age 12 Thursday, February 18, 2010 12:49 PM
Operasi Memory Write
Misal :
Memory[125]:=0;
CPU menaruh nilai 0 pada data bus, alamat
125 pada address bus, kemudian memaksa
(assert) write line pada control bus (biasanya
dengan mengeset line menjadi 0).
Figure 1-7: Memory write operation
To execute the equivalent of CPU := Memory [125]; the CPU places the
address 125 on the address bus, asserts the read line (because the CPU is
reading data from memory), and then reads the resulting data from the data
bus (see Figure 1-8).
Figure 1-8: Memory read operation
This discussion applies only when accessing a single byte in memory. So
what happens when the processor accesses a word or a double word? Because
memory consists of an array of bytes, how can we possibly deal with values
larger than a single byte? Easy—to store larger values, the 80x86 uses a
CPU
MemoryAddress = 125
Data = 0
Write = 0
Location
125
CPU
MemoryAddress = 125
Data = Memory[125]
Read = 0
Location
125
AAL2E_03.book Page 12 Thursday, February 18, 2010 12:49 PM
Operasi Memory Read
Misal :
:=Memory[125];
CPU menaruh alamat 125 pada
address bus, memaksa (assert) read
line pada control bus (biasanya
dengan mengeset line menjadi 0)
lalu membaca data dari data bus.
• Prosesor2 80x86 modern tidak lagi langsung terhubung ke memori. Ada memory buffer khusus pada CPU
yang dikenal sebagai cache (dibaca “cash”) yang berlaku sebagai perantara berkecepatan tinggi antara CPU
dan memori utama.
• Walaupun cache menangani detil2nya otomotasi bagi Anda, kenyataannya Anda perlu tahu bahwa mengakses
objek2 data dalam memori lebih efisien jika alamat objek merupakan kelipatan ukuran objek.
• Oleh karena itu ide yang baik untuk mengarahkan objek2
4-byte (double word) pada alamat2 yang kelipatan 4.
Begitu pula objek2 2-byte pada alamat2 genap.
Tentunya cukup efisien mengakses objek2
satu byte pada alamat mana saja.
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.
05 29
29 05
register
memory
address	7612,
least	significant	byte
address	7613,
most	significant	byte
• Saat prosesor mengambil (retrieve) satu
word dari memori, ia kembali membalik
byte, sehingga tersimpan dengan benar di
register sebagai heksa 05 29.
• Sekalipun fitur ini otomatis, programmer
harus paham ini terutama ketika melakukan
debugging.
Cara Pengalamatan ini terkait dengan arsitektur Little
yang dianut prosesor2 Intel …… lihat Big-Endian vs
Little-Endian
PENGALAMATAN (ADDRESSING)
Don Lancaster, “Machine Language Programming Cookbook” © 2010 by Synergetics Press.
Big-Endian vs Little-Endian
• Saat berinteraksi dengan memori, programmer perlu sadar metode penyimpanan. Komputer menyimpan data
ke memori dalam potongan2 (chunks) yang spesifik sesuai arsitekturnya (arsitektur x86 menggunakan 32 bit,
x86_64 menggunakan 64 bit) sedangkan nilai disusun dalam byte2. Jika
kita simpan nilai heksa 32-bit 12345678h ke memori komputer, nilai 32-bit
ini dipecah menjadi potongan berukuran byte.
• 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.
• Intel x86 dan x86-64 menggunakan urutan Little-Endian.
Prosesor Motorola seri 68xx[x], IBM Z series,
menggunakan urutan Big-Endian. Beberapa prosesor
mampu menggunakan keduanya yang sering
dinamakan bi-endian, misalkan Sun SPARC, ARM dan
PowerPC.
Byte 1 Byte 2 Byte 3 Byte 4
12 34 56 78
Alamat Memori Data
0x00000000 12
0x00000008 34
0x00000010 56
0x00000018 78
Alamat Memori Data
0x00000000 78
0x00000008 56
0x00000010 34
0x00000018 12
Big-Endian Byte Order Little-Endian Byte Order
Cache
• Prosesor modern dilengkapi dengan cache yang umumnya terbagi tiga tingkat (three tiers): level 1 (L1), level
2 (L2) dan level 3 (L3). Hirarkinya mengikuti prinsip2 yang sama dengan hirarki memori: makin jauh dari
ALU, makin lambat, makin besar dan makin murah. Baik cache L1 dan L2 sangat dekat dengan ALU, dimana
L2 sedikit lebih jauh tetapi lebih besar kapasitasnya. Cache L3 diakses oleh semua core sebagai lapisan akhir
memori statik sebelum data dikirim ke RAM untuk penyimpanan.
• Contoh hirarki cache adalah prosesor Intel Core i7 yang memiliki L1 cache
sebesar 64kb per core (32 kb untuk instruksi dan 32kb untuk data). L2 cache
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
Register2, sebuah lokasi memori tercepat dalam prosesor. Register2 ada pada
puncak hirarki memori, lebih kecil dan lebih cepat daripada cache. Register2
adalah daerah penyimpanan kecil terdekat ke ALU yang dipakai untuk
memegang operand2, alama2 dan hasil2 selama eksekusi instruksi2.
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
The system bus (shown in yellow) connects the various components of a computer.
The CPU is the heart of the computer, most of computations occur inside the CPU.
RAM is a place to where the programs are loaded in order to be executed.
Inside the CPU
AX – the accumulator register (terbagi atas AH / AL)
BX – the base address register (terbagi atas BH / BL)
CX – the count register (terbagi atas CH / CL)
DX – the data register (terbagi atas DH DL)
SI – source index register
DI – destination index register
BP – base pointer
SP – stack pointer
IP – Instruction Pointer
CS – code segment
DS – data segment
SS – stack segment
ES – extra segment
• 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
mengontrol instruksi2 yang
sedang dieksekusi, menangani
pengalamatan memori, dan
menyediakan kemampuan
aritmetika.
Flag Register
General-Purpose Register Special-Function Register Segment Register
1) Dalam ilmu Organisasi dan Arsitektur
Komputer, dikatakan hampir tidak ada latensi
antara CPU dan Register. Berbeda halnya
dengan CPU dan memori.
REGISTER 80386 (Untuk Referensi Saja)
REGISTER2 x86 DAN x86_64
64-bit 32-bit 16-bit
General
Purposer
Registers
RAX EAX AX
RBX EBX BX
RCX ECX CX
RDX EDX DX
RSI ESI SI
RDI EDI DI
RBP EBP BP
RSP ESP SP
R8 – R15
64-bit 32-bit 16-bit
Segment Registers N/A
CS CS
DS DS
ES ES
SS SS
FS
GS
Instruction Pointer RIP EIP IP
Flags Register RFLAGS EFLAGS FLAGS
RFLAGS
Registers Overlapping (Tumpang Tindih)
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.
• Pointer Register dipakai untuk menunjukkan lokasi dimana data
diambil dari atau disimpan ke.
Secara default, register2
BX, SI, DI bekerja dengan
segment register DS. BP
dan SP bekerja dengan
segment register SS.
• 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
4000H
Memahami Jenis
Pengalamatan Memori
Catatan: Untuk Referensi Saja
Prosesor 80286 ke atas menggunakan sejenis
tabel tambahan ( aka. Descriptor Table) untuk
pengalamatan sehingga mampu menangani
memori > 1024 Byte. [Protected Mode
Memory Addressing]
Pengalamatan (Addressing) dalam Gambar
Overlapping Segments
• Ketika menghitung physical address, sangat mungkin dua segment
tumpang tindih, yang juga seringkali memang diinginkan atau sengaja.
• Pada gambar di bawah ini, tumpang tindih digunakan pada file2 COM.
Register Index
Register SI dan DI tersedia untuk pengalamatan berindeks terutama
untuk digunakan dalam penjumlahan dan pengurangan.
• Register SI. Register Source Index 16-bit ini diperlukan untuk
beberapa operasi string (karakter). Dalam konteks ini, SI
terasosiasikan dengan Register DS. Prosesor 80386 dan selanjutnya
mendukung 32-bit extended register, ESI.
• Register DI. Register Destination Index 16-bit juga diperlukan untuk
beberapa operasi string. Dalam konteks ini, DI diasosiasikan dengan
Register ES. Prosesor 80386 dan selanjutnya mendukung 32-bit
extended register, EDI.
Register Flags
• Ada sembilan dari 16 bit Register Flags tersedia umum ke semua prosesor
keluarga 8086 untuk menunjukkan status terkini komputer dan hasil2
pemrosesan. Banyak instuksi2 yang melibatkan komparasi (perbandingan dan
logic aritmetika yang mengubah status flags, yangmana beberapa instruksi perlu
mengeceknya untuk menentukan aksi berikutnya.
• Flag-Flag yang tersedia umum (common flag bits) adalah :
• OF (overflow): sebagai indikasi overflow (tumpah) dari high-order bit (paling kiri) atas
aritmetika yang terjadi.
• DF (direction): menentukan arah kiri atau kanan untuk menggeser atau membandingkan data
string (karakter).
• IF (interrupt): sebagai indikasi seluruh interrupt eksternal, seperti entri keyboard, sudah siap
diproses atau diabaikan.
• TF (trap): mengijinkan operasi prosesor dalam mode single-step (satu langkah). Program2
debugger seperti DEBUG.COM mengeset trap flag sehingga Anda dapat selangkah
mengeksekusi satu instruksi tunggal pada stu waktu untuk menguji efeknya atas Register dan
Memori.
• SF (sign): berisi tanda hasil operasi aritmetika (0 = positif dan 1 = negatif)
• ZF (zero): sebagai indikasi hasil dari sebuah operasi aritmetika atau komparasi (0 = nonzero
dan 1 = hasil zero).
• AF (auxiliary carry): berisi carry out dari bit 3 atas data 8-bit, ini untuk aritmetika khusus saja.
• PF (parity): sebagai indikasi paritas genap atau ganjil atas operasi data 8-bit ordo rendah (low
order) atau paling kanan.
• CF (carry): berisi carry dari bit ordo atas (high-order) atau paling kiri akibat operasi aritmetika
sebelumnya; juga memuat isi dari bit terakhir atas operasi shift (geser) atau rotate (putar).
• Flag2 yang paling relevan dengan pemrograman Bahasa Assembly
adalah OF, SF, ZF dan CF untuk operasi2 komparasi dan aritmetika,
dan DF untuk arah operasi string.
• Prosesor 80286 dan selanjutnya memiliki 32-bit extended flags
register yang dikenal sebagai Eflags.
• Anda tak perlu mengingat lokasi2 berikut:
INPUT-OUTPUT INTERFACE
• BIOS berisi kumpulan routine2 dalam ROM untuk mendukung piranti. BIOS
mengetes dan inisialisasi piranti2 terpasang dan menyediakan layanan2 yang
diperlukan untuk membaca dari dan menulis ke piranti. Satu task dari DOS adalah
menjembatani dengan BIOS jika ada keperluan untuk mengakses fasilitas2 ini.
• Saat program user memerlukan layanan I/O dari OS, ia mengalihkan permintaan
ke BIOS, yangmana seterusnya mengakses piranti yang dikehendaki. Akan tetapi
kadang2 program membuat permintaan langsung ke BIOS, khususnya untuk
layanan2 keyboard dan layar. Lebih serius lagi, bisa juga program mengakses
piranti secara langsung.
User Program
Hardware / Devices
DOS
BIOS
• 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.
OPERASI I/O
• Operasi2 I/O yang dieksekusi oleh prosesor umumnya ada empat cara: programmed I/O (PIO), interrupt-
driven I/O, direct memory access (DMA) dan I/O channels.
• Programmed I/O (PIO) merupakan teknik paling sederhana implementasinya, tetapi paling tinggi
overheadnya karena ia paling tidak efisien mengambil pilihan2. Saat prosesor mengeksekusi sebuah operasi
I/O dalam mode PIO, CPU mengirim perintah dan mengeset bit2 yang sesuai pada I/O status register untuk
menandai selesainya perintah. Prosesor harus secara periodik mengecek I/O status register untuk melihat
apabila modul I/O telah menyelesaikan operasi. Overhead disebabkan oleh pengecekan secara periodik,
terutama pada saat operasi2 I/O sangat panjang dimana prosesor harus mengecek beberapa kali.
• Prosesor bisa lebih efisien jika setelah mengirim perintah ke modul I/O, ia lanjut dengan operasi lain bukan
menunggu perintah I/O selesai. Konsep demikian dinamakan interrupt-driven I/O. Saat prosesor mengirim
satu perintah ke modul I/O, ia bergerak ke instruksi lainnya dan hanya kembali ke operasi eksternal ketika
modul I/O mengirim sebuah interrupt. Interrupt menyela (pause) operasi2 lain sehingga prosesor dapat
menyelesaikan operasi I/O segera. Prosesor mengecek interrupt2 di akhir setiap siklus instruksi, sehingga
modul I/O tak akan pernah menunggu lebih lama dari satu siklus instruksi penuh setelah adanya interrupt
message agar transaksi diselesaikan. Sekalipun kelihatannya prosesor menyerahkan sepenuhnya eksekusi
perintah kepada modul I/O, prosesor masih harus diberdayakan setiap kali data dipindahkan ke/dari
memori utama (RAM).
• Baik Programmed I/O maupun interrupt-driven I/O memerlukan keterlibatan terus-menerus prosesor.
Apabila banyak operasi I/O berupa data transfer antara piranti2 eksternal dan RAM, prosesor akan
membuang banyak clock cycle untuk tugas2 biasa. Overhead demikian memerlukan solusi bagaimana
meningkatkan efisiensi prosesor; jawabannya adalah direct memory access (DMA). Menggunakan DMA
memerlukan modul tambahan pada motherboard semata-mata untuk operasi2 DMA. Ketika prosesor
mengeksekusi operasi I/O, CPU mengirim informasi ke modul DMA, bukan langsung ke piranti I/O. Seolah-
olah modul DMA meng-emulasi prosesor mengambil kendali atas operasi I/O dengan menyela prosesor
selama satu cycle pada satu waktu sehingga modul DMA bisa memperoleh akses bebas ke system bus
(proses ini dinamakan cycle stealing). Ketika modul DMA telah menyelesaikan operasi I/O, ia mengirim
interrupt ke prosesor untuk menandai sudah selesai.Prosesor hanya bertanggung jawab untuk instruksi2
non data transfer terkait dengan operasi2 I/O yangmana menghemat clock cycle dan membuat penggunaan
prosesor komputer menjadi lebih efisien.
• 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.
Fungsi BIOS ROM
Karena CPU hanya mengeksekusi program2 yang telah tersimpan dalam memori, maka harus ada
sebagian memori permanen (volatile) untuk memegang program2 yang memberitahu CPU apa yang
perlu dilakukan ketika komputer pertama menyala (power on). Kumpulan program ini dipegang oleh
ROM yang sering disebut BIOS dalam literatur2 komputer. BIOS, singkatan dari basic input-output
system, berisi program2 untuk mengetes RAM dan komponen lain yang terhubung ke CPU. Ia juga
berisi program2 agar DOS dapat berkomunikasi dengan piranti2 peripheral seperti keyboard, video,
printer dan disk. Adalah fungsi BIOS mengetes jika ada error. Contoh, jika keyboard terlepas dari PC
sebelum komputer nyala, BIOS akan melaporkan error pada layar, mengindikasikan kondisi itu.
Adalah hanya setelah pengetesan dan pengesetan (set up) peripheral2 oleh BIOS maka DOS
diangkat (load) ke dalam RAM dan menyerahterimakan (hand over) kendali PC ke DOS. Walaupun
ada kalanya ketika DOS maupun program aplikasi perlu menggunakan program2 dalam BIOS ROM,
DOS selalu mengendalikan PC setelah ia diangkat (loaded).
INTERRUPT• INT <Destination_Operand> adalah instruksi bahasa assembly pada prosesor x86 yang membangkitkan
interupsi atau exception handler software yang memanggil (CALL) fungsi yang sesuai dengan operandnya.
Interrupt itu sendiri bukan hanya berupa instruksi bahasa assembly, tetapi juga hardware. Interrupt adalah
cara bagaimana mendapat perhatian dari prosesor.1)
• Destination Operand memerinci bilangan vektor interrupt dari 0 sampai 255 (INT 00 sampai INT 0FFh), yang
disandikan sebagai 8-bit unsigned immediate value.
• 0 – 4 terdedikasi
• 5 – 31 direservasi buat penggunaan sistem
• 08h – 0Fh : 8259A
• 10h – 1Fh : BIOS
• 32– 255 direservasi untuk user
• 20h – 3Fh : DOS
• 40h – FFh : terbuka (open)
• Interrupt vector menunjuk alamat masuk
(entrance address) dari interrupt service
routine (ISR) yang sesuai. Interrupt Vector
Table (IVT) diletakkan pada 1KiB (1024)
pertama dalam memori RAM.
1) Cara lain mendapat perhatian dari prosesor adalah polling.
Interrupt Vector Table (IVT)
Jenis-jenis Interrupt:
1. Internal HW Interrupts
• dibangkitkan oleh peristiwa atau event tertentu yang terjadi
pada waktu / selama eksekusi program.
• diatur oleh HW dan tidak mungkin diubah
• contoh: interrupt untuk counter clock internal; HW call
interrupt ini untuk menjaga “time to date”.
2. External HW Interrupts
• dibangkitkan oleh piranti peripheral yakni keyboard, printer
dsb.
• biasa juga dibangkitkan oleh Co-Processor
• tidak mungkin di-non-aktifkan (deactivate)
• tidak dikirim langsung ke CPU, melainkan ke IC yang
memiliki fungsi untuk menangani secara eksklusif interrupts
ini (IC PIC8259A yang dikendalikan oleh CPU dengan
menggunakan urutan komunikasi atau path control)
3. Software Interrupts
• diaktifkan langsung oleh Assembler melalui sejumlah
interrupt dengan instruksi INT.
• ada dua jenis: interrupt DOS dan interrupt BIOS.
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
Langkah-langkah yang terlibat dalam pemrosesan
instruksi interrupt oleh prosesor:
1. Eksekusi instruksi interrupt
2. JMP ke Interrupt Vector Table
3. Ambil CS dan IP dari IVT
4. PUSH CS dan IP yang ada ke dalam stack
5. LOAD CS dan IP yang baru
6. JMP ke Interrupt Service Routine
7. Eksekusi Interrupt Service Routine
8. Kembali dan lanjutkan Main Program
Interrupts
Hardware
Interrupts
Nonmaskable
Interrupts
Programmer dapat
memilih untuk mask
interrupt2 tertentu
dan re-enable nanti
Maskable
Interrupts
Programmer tidak dapat
mengendalikan saat non-
maskable interrupt dilayani
Prosesor harus menghentikan
main program agar mengeksekusi
NMI Service Routine.
Software
Interrupts INT n
256 jenis Software
Interrupts INT 00 sampai
INT 0FFh
Vijay Kumar K., Dept. of ECE INTUACEK, “Interrupts on 8086 Microprocessor”,
https://www.slideshare.net/VijayKumar486/interrupts-on-8086-microprocessor-by-vijay-kumark,
accessed on Oct 21, 2019.
RESET sebagai Non-maskable Interrupts
Urutan proses dalam prosesor :
1. selesaikan instruksi terkini yang sedang dikerjakan
2. PUSH nilai2 Flag Register ke dalam stack
3. PUSH nilai CS dan IP untuk alamat return ke dalam stack
4. LOAD IP dari isi word di lokasi 00008h
5. LOAD CS dari isi word di lokasi 0000Ah
6. Interrupt Flag dan Trap Flag di-reset ke 0
Non-Maskable
Interrupts
digunakan
saat power
failure
digunakan saat
critical response
times
digunakan saat non-
recoverable hardware
errors
digunakan sebagai Watchdog
Interrupt
digunakan saat Memory Parity
errors
Software Interrupts
digunakan oleh Sistem Operasi
sebagai "pengait" ke beragam fungsi2
digunakan sebagai mekanisme
komunikasi antar bagian
berbeda dari sebuah program
Hardware Interrupts
digunakan untuk menangani perangkat keras
peripheral yakni keyboard, mouse, hard disk, floppy
disk, DVD drive dan printer
Tanpa interrupt, sistem akan sangat sederhana.
Semua arsitektur mikroprosesor memiliki
kemampuan layanan interrupt bawaan (in-built
interrupt service)
Polling vs Interrupt (Untuk Referensi Saja)
• Untuk mendapatkan perhatian dari prosesor dapat digunakan polling atau interrupt.
• Untuk memahami perbedaan keduanya, dipakai contoh pengendalian robot menggunakan Polling
dan Interrupt.
• Polling :
• Bergerak maju dalam satuan yang sudah didefinisikan (predefined)
• Cek pembacaan sensor
• Jika tidak ada gangguan jalan terus atau belok jika ada halangan
• Ulang kembali dan bergerak maju lagi.
• 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
Tak ada Keystroke dikirim ke CPU
Sistem Berbasis Interrupt
Sistem Berbasis Polling
tak ada keystroke
setelah 20ms, wait
atau loop
ada keystroke
Sistem Berbasis Interrupt
Apakah STACK dan Mengapa Diperlukan ?
• Stack adalah bagian dari read/write memory (RAM) yang digunakan CPU untuk
menyimpan informasi temporer. CPU perlu area penyimpanan ini karena
terbatasnya jumlah register. Oleh karena itu harus ada suatu tempat agar CPU
dapat menyimpan informasi dengan aman dan temporer.
• Pertanyaannya adalah mengapa tidak merancang CPU dengan banyak register.
Alasan tentang desain CPU adalah setiap transistor itu ad harganya dan tidak akan
cukup untuk membangun ratusan register. Lagi pula seberapa banyak register
yang CPU bisa puaskan setiap program atau aplikasi? Semua aplikasi dan teknik
pemrograman tidak ada yang sama.
• Kekurangan utama dari stack adalah waktu aksesnya (access time). Karena stack
berada dalam RAM, butuh waktu lebih lama mengakses dibanding register. Apa
lagi register berada dalam CPU, RAM di luar. Inilah alasan beberapa komputer
super (tentunya mahal) tidak punya stack; CPU memiliki sejumlah register yang
banyak untuk kerja.
Stack
• Baik program .COM maupun .EXE memerlukan sebuah area dalam program
yang dicadangkan sebagai stack. Gunanya adalah sebagai ruang untuk
penyimpanan temporer dari alamat2 dan data.
• Program loader secara otomatis mendefinisikan stack untuk program
.COM, tetapi Anda harus secara eksplisit mendefinisikannya untuk program
.EXE.
• Setiap data item dalam stack berukuran 1 word (2 byte).
• Register SS, yang di-inisialisasi oleh loader, beris alamat dari awal stack.
Awalnya register SP berisi ukuran dari stack, nilai yang menunjukkan byte
di penghujung akhir stack. Stack berbeda dari segment lain dalam hal cara
menyimpan data. Ia mulai menyimpan data pada lokasi teratas dalam
segment dan menyimpan data turun ke bawah sepanjang memori.
• Instruksi PUSH dan POP dipakai untuk menyimpan data dalam stack dan
mengambilnya kembali. Ini mirip seperti tumpukan nampan di restoran.
Ketika PUSH dieksekusi, nilai SP berkurang 2 ke storage word lebih rendah
berikutnya dalam stack dan menyimpan (atau mendorong, pushing)
nilainya di situ. Sebaliknya POP mengambil nilai dari stack dan menaikkan
SP sebanyak 2 merujuk ke storage word yang lebih atas berikutnya.
ILUSTRASI PUSH DAN POP REGISTER AX DAN BX
Anggaplah AX berisi heksa 026Bh, BX berisi 04E3h dan SP berisi 36h. Alamat segment dalam SS tidak
diperhatikan.
PUSH AX
PUSH BX
POP BX
POP AX
Awalnya, stack masih kosong, dan terlihat seperti ini:
SP berkurang 2 (menjadi 34h) dan isi AX (026Bh) ke dalam stack.
Perhatikan operasi membalik urutan byte tersimpan sehingga 026Bh menjadi 6B02h:
SP berkurang 2 (menjadi 32h) dan simpan BX (04E3h) ke dalam stack sebagai E304h:
Mengambil word dari lokasi yang ditunjuk SP dalam stack (E304h) masuk ke dalam register BX dan tambahkan SP
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
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
register AL; byte tersebut ada di offset 0016h dalam data segment. Maka kode mesin dan kode
simbolik operasi ini:
A01600 MOV AL,[0016]
• 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
Lokasi
05C03h
Catatan:
A0 adalah kode mesin dari instruksi MOV
• 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
• MOV pertama memindahkan data antara memori dan register.
• MOV kedua memindahkan immediate data ke register.
• MOV ketiga memindahkan data antar register.
• Kurung kotak pada MOV keempat mendefinisikan index operator yang artinya:
Gunakan alamat offset dalam DX (digabungkan dengan alamat segment dalam
DS, DS:DX) untuk menemukan sebuah word dalam memori dan memindahkan
isinta ke CX. Bandingkan efek instruksi ini dengan MOV ketiga yang hanya
memindahkan isi DX ke CX.
• Akses ke register pada 8086 tidak seluruhnya bebas. Misalkan kita
dapat isikan immediate values seperti angka ke GPR mana saja, tetapi
tidak ke segment register.
• Kita dapat taruh angka 6 ke BX dalam satu instruksi:
!"# $%, 6
• Menaruh 6 ke DS memerlukan
dua instruksi karena segment
register hanya bisa diubah
lewat GPR, bukan konstanta
atau segment register lain. 1)
MOV	BX,	6
MOV	DS,	BX
1) ini dinamakan mode pengalamatan register indirect.
……. lihat Addressing Mode dalam 8086
ADDRESSING MODE DALAM 8086
Mode2 pengalamatan adalah kunci atas operasi2 canggih dalam komputer. 8086 menyediakan
beberapa: immediate, memory indirect dan register indirect.
• Immediate. Nilai2 langsung ditulis, seperti bilangan2.
Contoh: MOV				BX,6
• Memory Indirect. Nilai2 yang berada pada suatu lokasi dalam data segment. Misal:
MOV				BX,	FOO
.
.
FOO				DW				6
Ini akan “memindahkan” (sebenarnya menyalin) nilai 6 yaitu apapun isi variabel FOO, ke dalam
BX.
• Register Indirect. Ada dua jenis register untuk operasi ini: Base Register (BX dan BP) dan Index
Register. (SI dan DI). Pada mode ini, register berisi alamat dalam data segment dimana
informasi yang dikehendaki tersimpan. Misal:
MOV	AX,	0F000h
MOV	ES,	AX
MOV	SI,	0FFFEh
MOV	DL,	BYTE	PTR	ES:[SI]
Kode di atas akan membaca machine ID pada lokasi F000:FFFE menggunakan indirect mode
lewat register SI. Sebuah register indirect reference bisa memiliki sedikitnya satu Register Index
dan satu Register Base. Ini menjadi cara mudah mengindeks dalam array / larik, atau struktur
data.
Mode2 pengalamatan dapat dikombinasi sesuka Anda.
Bahasa Assembly
Program Bahasa Assembly 8086
Pemrogaman Bahasa Assembly 8086 punya beberapa aturan seperti :
• Kode harus ditulis dalam huruf besar
• Label2 harus diikuti dengan titik dua, misalkan:
!"#$!:
• Seluruh label dan simbol harus mulai dengan huruf
• Seluruh komentar diketik dalam huruf kecil
• Baris terakhir program harus diakhiri dengan END directive
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:>masm615bin	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 .COM hanya menggunakan 1 segment (ukuran maksimal data + program
adalah 64KiB)1) dengan struktur Assembly sbb:
• .MODEL	SMALL	:	tanda directive untuk memberitahukan kepada Assembler
bentuk memori yang akan digunakan oleh program kita.
1. TINY – Jika program Anda hanya menggunakan 1 segment seperti program COM.
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.
BAB VI
MEMBUAT PROGRAM COM
6.1. MODEL PROGRAM COM
Untuk membuat program .COM yang hanya menggunakan 1 segment, bisa
buat dengan model program seperti gambar 6.1. Bentuk yang digunakan d
adalah bentuk program yang dianjurkan(Ideal). Dipilihnya bentuk program
dalam buku ini dikarenakan pertimbangan dari berbagai keunggulan b
program ideal ini seperti, prosesnya lebih cepat dan lebih mudah digu
oleh berbagai bahasa tingkat tinggi yang terkenal(Turbo Pascal dan C).
-----------------------------------------------------------
.MODEL SMALL
.CODE
ORG 100H
Label1 : JMP Label2
+---------------------+
| TEMPAT DATA PROGRAM |
+---------------------+
Label2 : +---------------------+
| TEMPAT PROGRAM |
+---------------------+
INT 20H
END Label1
-----------------------------------------------------------
Gambar 6.1. Model Program COM
Supaya lebih jelas bentuk dari program ideal, marilah kita tel
lebih lanjut dari bentuk program ini.
6.1.1 .MODEL SMALL
Tanda directive ini digunakan untuk memberitahukan kepada asse
bentuk memory yang digunakan oleh program kita. Supaya lebih jelas model-
yang bisa digunakan adalah :
- TINY
Jika program anda hanya menggunakan 1 segment seperti program COM.
ini disediakan khusus untuk program COM.
- SMALL
Jika data dan code yang digunakan oleh program kurang dari uku
segment atau 64 KB.
- MEDIUM
Jika data yang digunakan oleh program kurang dari 64 KB tetapi code
digunakan bisa lebih dari 64 KB.
24
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).
• Pada program COM, tidak perlu mendefinisikan
tempat tertentu untuk segment DATA dan STACK
karena hanya menggunakan satu segment
bersama CODE. Di sini STACK akan menggunakan
akhir dari segment yang digunakan oleh
segment CODE. Berbeda pada program EXE
ketiganya perlu didefinisikan.
• Pada program EXE tidak perlu menggunakan
directive ORG 100h karena program EXE bisa
menempatkan dirinya pada alamat yang telah
ditentukan.
Catatan:
Pada program EXE, segala bentuk JUMP dan CALL digunak
FAR(Program COM berbentuk NEAR). Hal ini dikarenakan program EXE
mengakses segment lain, sehingga perintah JUMP dan CALL membutuhkan
alamat dari segment(CS) selain offset(IP).
26.2. MODEL PROGRAM EXE
Pada program COM, kita tidak perlu mendefinisikan tempat terte
segment DATA dan STACK karena program COM hanya menggunakan 1 segmen
demikian segment untuk DATA, STACK dan CODE pada program COM ada
stack akan menggunakan akhir dari segment yang digunakan oleh segment
Berbeda dengan program COM, pada program EXE anda harus mende
tempat untuk segment DATA, CODE dan STACK. Untuk membuat program EXE
bisa menggunakan model pada gambar 26.1.
-----------------------------------------------------------
.MODEL SMALL
.STACK 200h
.DATA
+--------------+
| Tempat |
| Data Program |
+--------------+
.CODE
Label1:
MOV AX,@DATA
MOV DS,AX
+---------------+
189
| |
| Tempat |
| Program |
| |
+---------------+
MOV AX,4C00h
INT 21h
END Label1
----------------------------------------------------------
Gambar 26.1. Model program EXE
Pada program EXE, kita tidak perlu menggunakan perintah:ORG 100
• 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
2. Pengkodean Algoritma
• Penulisan program dalam bahasa
pemrograman tertentu (dalam
hal ini Bahasa Assembly)
3. Penerjemahan ke Bahasa Mesin
• 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.
Untuk membuat program dalam Bahasa Assembly tersedia dua
opsi:
1. Menggunakan Assembler (Microsoft Assembler MASM,
Borland Turbo Assembler TASM, Netwide Assembler
NASM, GNU Assembler GAS, dst)
2. Debugger
Hardware
Registry, Memori, Device
Firmware
Assembler
Assembly program (text file)
source code
Misal: VIDEO_IO.ASM
Bisa berupa GAS, TASM,
MASM, FASM, NASM,
GOASM, YASM
Assembly language vs. machine code
Assembler translates assembly code to machine code
loop: lw $t3, 0($t0)
lw $t4, 4($t0)
add $t2, $t3, $t4
sw $t2, 8($t0)
addi $t0, $t0, 4
addi $t1, $t1, -1
bgtz $t1, loop
0x8d0b0000
0x8d0c0004
0x016c5020
0xad0a0008
0x21080004
0x2129ffff
0x1d20fff9
Assembler
Assembly program (text file)
source code
Machine code (binary)
object code
3 / 32
Assembly language vs. machine code
Assembler translates assembly code to machine code
loop: lw $t3, 0($t0)
lw $t4, 4($t0)
add $t2, $t3, $t4
sw $t2, 8($t0)
addi $t0, $t0, 4
addi $t1, $t1, -1
bgtz $t1, loop
0x8d0b0000
0x8d0c0004
0x016c5020
0xad0a0008
0x21080004
0x2129ffff
0x1d20fff9
Assembler
Assembly program (text file)
source code
Machine code (binary)
object code
3 / 32
Machine code (binary)
object code
Misal: VIDEO_IO.OBJ
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).
Compiling, Linking and Executing Programs
EDITING
hello.asm
COMPILING
c:>ml /c hello.asm
LINKING
c:>link hello.obj
EXECUTING/LOADING
c:>hello
hello.exe
hello.obj
hello.asm
1
2
3
4
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:
00000000 b80a000000 movl $0xa, %eax
00000005 48 decl %eax
00000006 bb05000000 movl $0x5, %ebx
0000000b c3 retl
main:
0x1fac <+0>: movl $0xa, %eax
0x1fb1 <+5>: decl %eax
0x1fb2 <+6>: movl $0x5, %ebx
0x1fb7 <+11>: retl
Windows macOS Linux
COFF, PE, Win32, Win64 Mach-o ELF, a.out (deprecated)
Format2 dari file objek menurut platform OS
01 memahami bahasa assembly
01 memahami bahasa assembly
01 memahami bahasa assembly
01 memahami bahasa assembly
01 memahami bahasa assembly
01 memahami bahasa assembly

More Related Content

What's hot

Matematika Diskrit - 09 graf - 06
Matematika Diskrit - 09 graf - 06Matematika Diskrit - 09 graf - 06
Matematika Diskrit - 09 graf - 06KuliahKita
 
Jenis dan proses interupsi
Jenis dan proses interupsiJenis dan proses interupsi
Jenis dan proses interupsilaurensius08
 
Penyederhanaan Fungsi Boolean
Penyederhanaan Fungsi BooleanPenyederhanaan Fungsi Boolean
Penyederhanaan Fungsi BooleanFahrul Razi
 
Penyederhanaan Karnaugh Map
Penyederhanaan Karnaugh MapPenyederhanaan Karnaugh Map
Penyederhanaan Karnaugh MapCheria Asyifa
 
Algoritma Pemrograman (Flowchart) - Logika dan Algoritma
Algoritma Pemrograman (Flowchart) - Logika dan AlgoritmaAlgoritma Pemrograman (Flowchart) - Logika dan Algoritma
Algoritma Pemrograman (Flowchart) - Logika dan AlgoritmaAri Septiawan
 
03 rangkaian kombinasional
03   rangkaian kombinasional03   rangkaian kombinasional
03 rangkaian kombinasionalopekdoank
 
Organisasi Komputer- representasi informasi
Organisasi Komputer- representasi informasiOrganisasi Komputer- representasi informasi
Organisasi Komputer- representasi informasidaru2501
 
Pertemuan 6 Penyederhanaan RL-Karnaugh Map
Pertemuan 6   Penyederhanaan RL-Karnaugh MapPertemuan 6   Penyederhanaan RL-Karnaugh Map
Pertemuan 6 Penyederhanaan RL-Karnaugh Mapahmad haidaroh
 
Pertemuan 9.1 pengalamatan juga
Pertemuan 9.1 pengalamatan jugaPertemuan 9.1 pengalamatan juga
Pertemuan 9.1 pengalamatan jugaBuhori Muslim
 
Ch 04 (Siklus Instruksi dan Interrupt)
Ch 04 (Siklus Instruksi dan Interrupt)Ch 04 (Siklus Instruksi dan Interrupt)
Ch 04 (Siklus Instruksi dan Interrupt)Tri Sugihartono
 
Matematika Diskrit - 07 teori bilangan - 05
Matematika Diskrit - 07 teori bilangan - 05Matematika Diskrit - 07 teori bilangan - 05
Matematika Diskrit - 07 teori bilangan - 05KuliahKita
 
Modul teknik-digital
Modul teknik-digitalModul teknik-digital
Modul teknik-digitalecko gmc
 
Penjelasan listing program
Penjelasan listing programPenjelasan listing program
Penjelasan listing programPenyiar Unpab
 
Analisis Algoritma - Notasi Asimptotik
Analisis Algoritma - Notasi AsimptotikAnalisis Algoritma - Notasi Asimptotik
Analisis Algoritma - Notasi AsimptotikAdam Mukharil Bachtiar
 
Materi 3 Finite State Automata
Materi 3   Finite State AutomataMateri 3   Finite State Automata
Materi 3 Finite State Automataahmad haidaroh
 
Makalah algoritma dan hubungannya dengan pemrograman
Makalah algoritma dan hubungannya dengan pemrogramanMakalah algoritma dan hubungannya dengan pemrograman
Makalah algoritma dan hubungannya dengan pemrogramanwanakuroyuri
 
Teori bahasa-dan-otomata
Teori bahasa-dan-otomataTeori bahasa-dan-otomata
Teori bahasa-dan-otomataBanta Cut
 

What's hot (20)

Matematika Diskrit - 09 graf - 06
Matematika Diskrit - 09 graf - 06Matematika Diskrit - 09 graf - 06
Matematika Diskrit - 09 graf - 06
 
Jenis dan proses interupsi
Jenis dan proses interupsiJenis dan proses interupsi
Jenis dan proses interupsi
 
Penyederhanaan Fungsi Boolean
Penyederhanaan Fungsi BooleanPenyederhanaan Fungsi Boolean
Penyederhanaan Fungsi Boolean
 
Penyederhanaan Karnaugh Map
Penyederhanaan Karnaugh MapPenyederhanaan Karnaugh Map
Penyederhanaan Karnaugh Map
 
Algoritma Pemrograman (Flowchart) - Logika dan Algoritma
Algoritma Pemrograman (Flowchart) - Logika dan AlgoritmaAlgoritma Pemrograman (Flowchart) - Logika dan Algoritma
Algoritma Pemrograman (Flowchart) - Logika dan Algoritma
 
03 rangkaian kombinasional
03   rangkaian kombinasional03   rangkaian kombinasional
03 rangkaian kombinasional
 
Bab 5 komputer sederhana sap-1
Bab 5   komputer sederhana sap-1Bab 5   komputer sederhana sap-1
Bab 5 komputer sederhana sap-1
 
Organisasi Komputer- representasi informasi
Organisasi Komputer- representasi informasiOrganisasi Komputer- representasi informasi
Organisasi Komputer- representasi informasi
 
Pertemuan 6 Penyederhanaan RL-Karnaugh Map
Pertemuan 6   Penyederhanaan RL-Karnaugh MapPertemuan 6   Penyederhanaan RL-Karnaugh Map
Pertemuan 6 Penyederhanaan RL-Karnaugh Map
 
Pertemuan 9.1 pengalamatan juga
Pertemuan 9.1 pengalamatan jugaPertemuan 9.1 pengalamatan juga
Pertemuan 9.1 pengalamatan juga
 
Ch 04 (Siklus Instruksi dan Interrupt)
Ch 04 (Siklus Instruksi dan Interrupt)Ch 04 (Siklus Instruksi dan Interrupt)
Ch 04 (Siklus Instruksi dan Interrupt)
 
Matematika Diskrit - 07 teori bilangan - 05
Matematika Diskrit - 07 teori bilangan - 05Matematika Diskrit - 07 teori bilangan - 05
Matematika Diskrit - 07 teori bilangan - 05
 
Modul teknik-digital
Modul teknik-digitalModul teknik-digital
Modul teknik-digital
 
Penjelasan listing program
Penjelasan listing programPenjelasan listing program
Penjelasan listing program
 
Modul pengenalan proteus
Modul pengenalan proteusModul pengenalan proteus
Modul pengenalan proteus
 
Analisis Algoritma - Notasi Asimptotik
Analisis Algoritma - Notasi AsimptotikAnalisis Algoritma - Notasi Asimptotik
Analisis Algoritma - Notasi Asimptotik
 
Materi 3 Finite State Automata
Materi 3   Finite State AutomataMateri 3   Finite State Automata
Materi 3 Finite State Automata
 
Makalah algoritma dan hubungannya dengan pemrograman
Makalah algoritma dan hubungannya dengan pemrogramanMakalah algoritma dan hubungannya dengan pemrograman
Makalah algoritma dan hubungannya dengan pemrograman
 
Teori bahasa-dan-otomata
Teori bahasa-dan-otomataTeori bahasa-dan-otomata
Teori bahasa-dan-otomata
 
Graf Pohon
Graf PohonGraf Pohon
Graf Pohon
 

Similar to 01 memahami bahasa assembly

Similar to 01 memahami bahasa assembly (20)

Sejarah Perkembangan Komputer
Sejarah Perkembangan KomputerSejarah Perkembangan Komputer
Sejarah Perkembangan Komputer
 
Kelompok 2 xtkj 2 smk ma'arif nu1 sunpiyuh...
Kelompok 2 xtkj 2 smk ma'arif nu1 sunpiyuh...Kelompok 2 xtkj 2 smk ma'arif nu1 sunpiyuh...
Kelompok 2 xtkj 2 smk ma'arif nu1 sunpiyuh...
 
Hakim
HakimHakim
Hakim
 
Hakim
HakimHakim
Hakim
 
PENGANTAR TI.pptx
PENGANTAR TI.pptxPENGANTAR TI.pptx
PENGANTAR TI.pptx
 
K1
K1K1
K1
 
Perkembangan Komputer dari Generasi ke generasi
Perkembangan Komputer dari Generasi ke generasi Perkembangan Komputer dari Generasi ke generasi
Perkembangan Komputer dari Generasi ke generasi
 
Komputer data base-komunikasi data
Komputer data base-komunikasi dataKomputer data base-komunikasi data
Komputer data base-komunikasi data
 
Komputer data base-komunikasi data
Komputer data base-komunikasi dataKomputer data base-komunikasi data
Komputer data base-komunikasi data
 
PPT TIK 2.pptx
PPT TIK 2.pptxPPT TIK 2.pptx
PPT TIK 2.pptx
 
PPT TIK 3.pptx
PPT TIK 3.pptxPPT TIK 3.pptx
PPT TIK 3.pptx
 
Bab 6
Bab 6 Bab 6
Bab 6
 
Bab 6
Bab 6 Bab 6
Bab 6
 
Ms Power Point 2007 Bab 6 Kelas IX
Ms Power Point 2007 Bab 6 Kelas IXMs Power Point 2007 Bab 6 Kelas IX
Ms Power Point 2007 Bab 6 Kelas IX
 
TIK BAB 6 Kelas 9
TIK BAB 6 Kelas 9TIK BAB 6 Kelas 9
TIK BAB 6 Kelas 9
 
Organisasi Komputer Materi 2 b
Organisasi Komputer Materi 2 bOrganisasi Komputer Materi 2 b
Organisasi Komputer Materi 2 b
 
Bab 1 pengantar
Bab 1 pengantarBab 1 pengantar
Bab 1 pengantar
 
sejarah komputer dan perangkat komputer
sejarah komputer dan perangkat komputer sejarah komputer dan perangkat komputer
sejarah komputer dan perangkat komputer
 
Sejarah komputer kelompok 5
Sejarah komputer kelompok 5Sejarah komputer kelompok 5
Sejarah komputer kelompok 5
 
Kelompok3 kelas X TKJ 2 Smk Ma'arif
Kelompok3 kelas X TKJ 2 Smk Ma'arifKelompok3 kelas X TKJ 2 Smk Ma'arif
Kelompok3 kelas X TKJ 2 Smk Ma'arif
 

01 memahami bahasa assembly

  • 1. Memahami Bahasa Assembly lewat Arsitektur Komputer Tan Arman tanarman@yahoo.com Versi 1.01, 21 Oktober 2019
  • 2. Pengantar 1. Kita memulai dengan Sejarah Mikroprosesor dan Mikroprosesor Intel. 2. Mengapa belajar Bahasa Assembly dan apa saja yang akan dipelajari ? 3. Memahami alur penerjemahan Bahasa Tingkat Tinggi ke Bahasa Mesin, bahasa alami perangkat keras. 4. Memahami lapisan ISA sebuah antarmuka antara hardware dan software yang mendorong adanya Arsitektur CISC vs RISC. 5. Sisi perangkat keras komputer: CPU, Memory (Register, Cache dan RAM), peralatan Input-Output. Arsitektur CPU menjelaskan tentang proses pengolahan instruksi dan data, bagaimana Register menjadi sarana penyimpanan dan pengolahan oleh CPU dalam melakukan tugas2 nya yakkni aritmetika, logic dan kontrol. Yang berkaitan dengan memori adalah memori yang berada dalam CPU (Register), dalam IC bersama CPU (Cache) dan di luar CPU (RAM dan ROM). Topik utama memori adalah pengalamatan (addessing) yakni bagaimana mengambil dan menyimpan instruksi dan data (per byte) dari dan ke memori. Peralatan Input-Output memanfaatkan teknik Intterupt untuk mendapatkan perhatian dari CPU. 6. Sisi perangkat lunak mempelajari bagaimana memori diduduki oleh sistem operasi dan cara2 mengaksesnya dari aplikasi. Konsep tentang Interrupt diperjelas lagi lebih lengkap, begitu pula tentang stack. Di sini Anda akan dipersiapkan dengan tools untuk mulai bekerja. Anda akan melihat bagaimana Bahasa Tingkat Tinggi, Bahasa Assembly dan Bahasa Mesin bersambungan sehingga selanjutnya Anda akan percaya diri bermain dengan Bahasa Assembly.
  • 3. • Jantung komputer adalah mikroprosesor (µP) yang menangani kebutuhan komputer atas aritmetika, logic dan kontrol. Mikroprosesor bermuara di tahun 1960-an1) ketika para perancang peneliti memanfaatkan rangkaian terpadu atau integrated circuit (IC) dengan menggabungkan beragam komponen elektronik menjadi satu komponen tunggal dalam sebuah emping silikon (silicon chip). Pabrikan membuatnya seperti piranti menyerupai kelabang dan IC2 disambung2 menjadi sebuah sistem yang berfungsi. Pada April 1972, Intel® memperkenalkan chip 8008, generasi pertama mikroprosesor 8-bit. • Pada tahun 1974, 8008 berkembang menjadi 8080, mikroprosesor generasi kedua yang begitu populer pemanfaatannya sebagai general-purpose. Pada tahun 1978 keluar generasi ketiga prosesor 8086 yang kompatibel dengan 8080 dan desainnya jauh ke depan. • Berikutnya Intel® mengembangkan 80882), suatu variasi dari 8086 yang memiliki desain lebih sederhana dan kompatibel terutama bagian perangkat input/output. 8088 inilah yang dipilih IBM® pada tahun 1981 sebagai jantung personal computer IBM PC. • Versi lanjutan 8088 adalah 80188; lanjutan 8086 adalah 80186, 80286, 80386, 80486, Pentium (atau 586), PentiumPro (atau 6x86) masing2 dengan tambahan operasi2 dan processing power. • Setiap keluarga prosesor memiliki kelompok instruksi sendiri2 yang unik yang dipakai untuk memerintah operasi2nya, seperti menerima input dari keyboard, menampilkan data di layar, dan melakukan aritmetika. Kelompok instruksi ini dikenal sebagai Bahasa Mesin sistem, yangmana cukup rumit dan agak kabur untuk mengembangkan software. Itulah sebabnya Penyedia Software membuat Bahasa Assembly untuk tiap keluarga prosesor yang mewakili beragam instruksi dalam kode simbolik yang lebih mudah dipahami. • Bahasa Tingkat Tinggi seperti C dan BASIC dirancang untuk menghilangkan kesulitan teknis terkait keterikatan dengan komputer tertentu (cross-platform), sedangkan Bahasa Assembly Tingkat-Rendah memang dirancang untuk keluarga prosesor tertentu atau spesifik (platform-dependent). 2) 8080 adalah µP 8-bit, sedangkan 8086 adalah µP 16-bit. 8088 adalah variasi dari 8086 (16-bit) tetapi I/O nya kompatibel dengan 8080 atau 8-bit. Ini menyebabkan ia mampu terhubung dengan piranti2 8-bit terutama memori yang pada saat itu harganya masih sangat mahal mendominasi harga PC. 1) Teknologi CPU elektronik dimulai tahun 1940-an menggunakan tabung vakum. Tabung vakum itu gendut dan menghabiskan banyak listrik. Misalkan, komputer digital pertama, ENIAC, memerlukan 130.000 watt daya dan menduduki 140 meter persegi. Penemuan transistor pada tahun 1947 mengubah semuanya, sehingga komputer digital generasi kedua lahir pada tahun 1950-an ditandai dengan produk skala besar IBM 7070, DEC PDP-1, PDP-6, PDP-7 dst.
  • 4. Latar Belakang Mengapa Belajar Assembly • Bahasa Assembly merupakan Bahasa pemrograman tertua dari semua bahasa pemrograman, yang memiliki kesesuaian paling alami dengan Bahasa Mesin. Untuk berinteraksi dengan Bahasa Mesin digunakan bentuk perantara numerik berupa heksadesimal mengingat sulitnya bermain dengan biner. • Bahasa Assembly memberi akses langsung ke hardware komputer sehingga Anda mampu memahami lebih dalam arsitektur dan sistem operasi komputer. Bahasa Assembly Bahasa Biner Mesin SUB AX, BX 001010111000011 MOV CX, AX 100010111001000 MOV DX, 0 10111010000000000000000
  • 5. APA YANG AKAN KITA PELAJARI • Pelajaran diambil dari arsitektur terkemuka dalam pasar komputasi (x86 dan x86_64) yang disediakan oleh Intel® dan AMD®. Dengan pengetahuan ini dapat mudah mempelajari arsitektur yang lain. • Pelajaran dimulai dengan pemahaman beberapa teori dasar yakni arsitektur hardware (prosesor, memori, register, pengalamatan), pengenalan sistem operasi DOS, konversi antar bilangan (desimal – heksadesimal – biner), dilanjutkan dengan akses ke hardware lewat DEBUG.COM dan Bahasa Mesin. Itulah sebabnya perlu mengerti heksadesimal. • Semakin rumit aplikasi, maka diperlukan bahasa yang tingkatannya lebih tinggi yakni Bahasa Assembly. Dalam kerangka membangun aplikasi fenomenal (pada jamannya) DskPatch1), pemahaman mengenai arsitektur komputer dibangun secara alami karena aplikasi perlu mengakses aritmetika CPU, akses memori (untuk data, program dan stack) dan akses Input/Output (layar, keyboard, floppy disk). • Pemahaman pemanfaatan sumberdaya komputer lewat INT (Interrupt) ke DOS maupun BIOS sehingga kita tidak perlu membangun semua prosedur dari ground-up juga diperkenalkan secara bertahap. Kita dapat merasakan kealamian membangun sebuah software. Sumberdaya itu dinamakan fungsi untuk membedakan dengan prosedur buatan sendiri (dipanggil lewat instruksi !"##). • Untuk kemudahan pemahaman maka pelajaran menggunakan MASM 6.15 yang masih 16-bit dan simulator EMU8086 4.08. Sumber: https://winworldpc.com/home https://www.4shared.com/rar/wa8iHotqce/emu8086_408.html 1) John Socha and Peter Norton ASSEMBY LANGUAGE FOR THE PC, Third Edition, Brady Publishing, ISBN 1-56686-106-5 (c) 1992
  • 6. 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.”
  • 7. Bahasa Tingkat Tinggi • Bahasa Tingkat Tinggi adalah bahasa yang statement nya menyerupai Bahasa Inggris. • Contoh dalam Bahasa Tingkat Tinggi C++: • 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). English-likeness C++ if (this is true) { peform this series of actions } else { perform this series of actions } 56 (7 == 9) { :;<= << “@ ABC D AEF =ℎF HAIF”; } FLHF { :;<= << “@ ABC D AEF C566FEFB=”; } 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
  • 8. Translation Pipeline • Program yang ditulis dalam Bahasa tingkat-tinggi harus ditranslasi atau diterjemahkan ke dalam tingkat yang lebih rendah. • 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- to-many dengan Bahasa Mesin; artinya satu statement bahasa tingkat-tinggi berpasangan dengan beberapa instruksi Assembly dan Mesin. • Assembly merupakan bentuk intermediasi (perantara) dalam translation 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 diterjemahkan menjadi Bahasa Mesin disebut encoding; proses kebalikannya 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 hardware, yang kita sebut digital logic. High-Level Language Assembly Language Machine Language Digital Logic encodingdecoding 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.
  • 9. 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.
  • 10. Proses Translasi (Penerjemahan) Tingkat Bahasa Kode Bahasa Tingkat Tinggi C++ sum = 5; Bahasa Assembly GNU Assembler, AT&T syntax movl $0x5, -0x8(%ebp) 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. Contoh Instruksi Assembly di-encode menjadi bahasa mesin Intel 32-bit
  • 11. • 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. Mikroprosesor RISC IBM PowerPC 601
  • 12. 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 Intel 8086 CPU die image
  • 13. Arsitektur Prosesor Intel® • Keluarga CPU Intel® dikelompokkan sebagai mesin berarsitektur Von Neumann.1) • CPU berbicara dengan memori dan piranti I/O dengan menaruh nilai numerik pada address bus untuk memilih sebuah lokasi memori atau lokasi device port, masing2 punya address numerik yang unik. Lalu CPU, memori, dan piranti2 I/O melalukan 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). • Terdiri dari 3 blok pembangun: central processing unit (CPU), memori, dan piranti I/O. • Ketiga komponen tersambung menggunakan system bus (terdiri dari address bus, data bus, dan control bus). 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. 2 8086 Assembler Tutorial for Beginners (Part 1) This tutorial is intended for those who are not familiar with assembler at all, or have a very distant idea about it. Of course if you have knowledge of some other programming language (Basic, C/C++, Pascal...) that may help you a lot. But even if you are familiar with assembler, it is still a good idea to look through this document in order to study Emu8086 syntax. It is assumed that you have some knowledge about number representation (HEX/BIN), if not it is highly recommended to study Numbering Systems Tutorial before you proceed. What is an assembly language? Assembly language is a low level programming language. You need to get some knowledge about computer structure in order to understand anything. The simple computer model as I see it: The system bus (shown in yellow) connects the various components of a computer. The CPU is the heart of the computer, most of computations occur inside the CPU. RAM is a place to where the programs are loaded in order to be executed. Inside the CPU
  • 14. 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.
  • 15. 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.
  • 16. 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.
  • 17. 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.
  • 18. • 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.
  • 19. 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).
  • 20. (Untuk Referensi Saja) Intel A80386DX-20 CPU die image
  • 21. Tentang Prosesor • Bayangkan CPU atau prosesor sebagai otak komputer. CPU merupakan komponen yang menangani operasi2 aritmetika dan logika. Empat komponen utama CPU adalah: Arithmetic Logic Unit (ALU), Control Unit (CU), CPU clock dan memori (cache dan register2). • ALU adalah sub komponen matematis CPU yang melakukan operasi2 aritmetika dan logika atas operand2 integer (Operand2 integer adalah kunci pembeda; masih ada komponen lain yang bertanggung jawab atas operasi2 pada operand2 floating-point). • CU bertanggung jawab mengarahkan aliran data dalam CPU, memastikan semua sub komponen lain dari CPU menerima data yang benar pada waktu yang benar dan bertindak yang sesuai. • Instruksi2 CPU yang bergantung atas banyak sub-tasks agar dapat berjalan yang sesuai, mengikuti Instruction Execution Cycle yang dikomandoi oleh CU. CPU clock, berbeda dengan system clock, merupakan clock dari CPU itu sendiri yang menjaga waktu bagi operasi2 CPU.
  • 22. • Kecepatan dari CPU clock dinamakan frekuensi yang diukur dalam Hertz. Sederhananya jika sebuah prosesor punya frekuensi 1 Hertz (Hz), artinya clock berdentang satu kali per detik. Dentang atau ticking adalah satu osilasi penuh (sebuah up-tick dan down-tick). • Prosesor modern diukur dalam megahert (MHz) atau gigahertz (GHz), yang berarti masing2 1 juta tick per detik dan 1 milyar tick per detik. Untuk membayangkannya dalam terminologi clock cycle (diukur dalam satuan waktu), bukan frekuensi prosesor, kita bisa ambil kebalikan dari frekuensi. Maka fekuensi 1 GHz sama dengan durasi setiap clock cycle sepermilyar detik. • Hal lain yang perlu diperhatikan adalah kecepatan dimana CPU clock berdentang (ticking) bisa merupakan kelipatan kecepatan system clock yang ditentukan oleh multiplier. Misalkan system clock berjalan pada 800MHz dan multipliernya 4, maka frekuensi CPU menjadi 3.2GHz. CPU clock berjalan empat kali lebih cepat daripada system clock dan mampu melakukan empat kali jumlah operasi dalam waktu yang sama.
  • 23. Eksekusi Instruksi • Agar sebuah instruksi dieksekusi (mis. ADD), urutan langkah2 yang dikenal sebagai instruction execution cycle perlu diikuti. Bagi programmer instruksi ADD seperti proses satu-langkah, tetapi prosesor membaginya menjadi sub-tasks, atau stages (atau tahapan), yang berisi eksekusi instruksi. Jumlah stages beragam dari sedikitnya tiga stages pada level abstrak sampai 20 atau lebih ditemukan dalam prosesor high-end modern. Jadi ketika programmer menulis instruksi ADD untuk menjumlahkan dua bilangan, ada 20 langkah terjadi di belakang layar yang bergerak sesuai execution 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). • Pada tahapan Decode, CPU menentukan instruksi apa itu dan data apa yang ia operasikan. Selama tahapan ini, CPU melihat bit2 instruksi (0 dan 1) dan mampu menentukan jenis operasi (yakni ADD, SUB, MOV) dan apakah perlu tidaknya operasi menyertakan operand2. Jika operasi memerlukan operand2, CPU juga perlu menjemputnya (fetch) juga. • Setelah seluruh data yang diperlukan dijemput (fetched) dan di-decode, CPU dapat Execute instruksi. Apabila ada hasil, seperti halnya instruksi ADD dan SUB, CPU akan menyimpan (store) hasil pada tempat yang sesuai (yakni Register, Memori).
  • 24. 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. • Superpipeline adalah pipeline sampai 20 tahapan. CPU mampu bekerja dengan 20 langkah berbeda 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 mampu mengurangi clock cycle sampai 29, suatu peningkatan kinerja 690%.
  • 25. 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.
  • 26. 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. Peta Fisik dari Memori Dasar PC 8086 Dari satu megabyte memori, 640K pertama adalah RAM dasar, kebanyakan tersedia untuk Anda pakai 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 power-on self-test, pola titik (dot pattern) dari grafis, dan disk self-loader. Saat Anda tekan tombol power, ROM melakukan beragam cek dan mengangkat (load) special system data dari disk ke RAM.
  • 27. 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”.
  • 28. • Memori dapat dibayangkan sebagai kue lapis yang masing-masing lapis memiliki label atau alamat lokasi. • Memori menyimpan dalam satuan satu byte per label lokasi. Artinya untuk nilai yang lebih besar dari satu byte, 8086 menggunakan lokasi memori berikutnya. • Data satu word memerlukan dua lokasi memori; data dua word memerlukan empat lokasi memori. efficient to align 2-byte objects on even addresses. You can efficiently access single-byte objects at any address. You’ll see how to set the alignment of memory objects in Section 3.4. Figure 1-9: Byte, word, and double-word storage in memory Before leaving this discussion of memory objects, it’s important to understand the correspondence between memory and HLA variables. One of the nice things about using an assembler/compiler like HLA is that you don’t have to worry about numeric memory addresses. All you need to do is declare a variable in HLA, and HLA takes care of associating that variable with some unique set of memory addresses. For example, if you have the following declaration section: static i8 :int8; i16 :int16; i32 :int32; HLA will find some unused 8-bit byte in memory and associate it with the i8 variable; it will find a pair of consecutive unused bytes and associate i16 with them; finally, HLA will find 4 consecutive unused bytes and associate the value of i32 with those 4 bytes (32 bits). You’ll always refer to these variables 195 194 193 192 191 190 189 188 187 Double Word at Address 192 Word at Address 188 Address Byte at Address 186 186 Figure 1-7: Memory write operation To execute the equivalent of CPU := Memory [125]; the CPU places the address 125 on the address bus, asserts the read line (because the CPU is reading data from memory), and then reads the resulting data from the data bus (see Figure 1-8). CPU MemoryAddress = 125 Data = 0 Write = 0 Location 125 CPU MemoryAddress = 125 Data = Memory[125] Read = 0 Location 125 age 12 Thursday, February 18, 2010 12:49 PM Operasi Memory Write Misal : Memory[125]:=0; CPU menaruh nilai 0 pada data bus, alamat 125 pada address bus, kemudian memaksa (assert) write line pada control bus (biasanya dengan mengeset line menjadi 0). Figure 1-7: Memory write operation To execute the equivalent of CPU := Memory [125]; the CPU places the address 125 on the address bus, asserts the read line (because the CPU is reading data from memory), and then reads the resulting data from the data bus (see Figure 1-8). Figure 1-8: Memory read operation This discussion applies only when accessing a single byte in memory. So what happens when the processor accesses a word or a double word? Because memory consists of an array of bytes, how can we possibly deal with values larger than a single byte? Easy—to store larger values, the 80x86 uses a CPU MemoryAddress = 125 Data = 0 Write = 0 Location 125 CPU MemoryAddress = 125 Data = Memory[125] Read = 0 Location 125 AAL2E_03.book Page 12 Thursday, February 18, 2010 12:49 PM Operasi Memory Read Misal : :=Memory[125]; CPU menaruh alamat 125 pada address bus, memaksa (assert) read line pada control bus (biasanya dengan mengeset line menjadi 0) lalu membaca data dari data bus.
  • 29. • Prosesor2 80x86 modern tidak lagi langsung terhubung ke memori. Ada memory buffer khusus pada CPU yang dikenal sebagai cache (dibaca “cash”) yang berlaku sebagai perantara berkecepatan tinggi antara CPU dan memori utama. • Walaupun cache menangani detil2nya otomotasi bagi Anda, kenyataannya Anda perlu tahu bahwa mengakses objek2 data dalam memori lebih efisien jika alamat objek merupakan kelipatan ukuran objek. • Oleh karena itu ide yang baik untuk mengarahkan objek2 4-byte (double word) pada alamat2 yang kelipatan 4. Begitu pula objek2 2-byte pada alamat2 genap. Tentunya cukup efisien mengakses objek2 satu byte pada alamat mana saja. Hirarki Memori
  • 30. 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. 05 29 29 05 register memory address 7612, least significant byte address 7613, most significant byte • Saat prosesor mengambil (retrieve) satu word dari memori, ia kembali membalik byte, sehingga tersimpan dengan benar di register sebagai heksa 05 29. • Sekalipun fitur ini otomatis, programmer harus paham ini terutama ketika melakukan debugging. Cara Pengalamatan ini terkait dengan arsitektur Little yang dianut prosesor2 Intel …… lihat Big-Endian vs Little-Endian
  • 31. PENGALAMATAN (ADDRESSING) Don Lancaster, “Machine Language Programming Cookbook” © 2010 by Synergetics Press.
  • 32. Big-Endian vs Little-Endian • Saat berinteraksi dengan memori, programmer perlu sadar metode penyimpanan. Komputer menyimpan data ke memori dalam potongan2 (chunks) yang spesifik sesuai arsitekturnya (arsitektur x86 menggunakan 32 bit, x86_64 menggunakan 64 bit) sedangkan nilai disusun dalam byte2. Jika kita simpan nilai heksa 32-bit 12345678h ke memori komputer, nilai 32-bit ini dipecah menjadi potongan berukuran byte. • 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. • Intel x86 dan x86-64 menggunakan urutan Little-Endian. Prosesor Motorola seri 68xx[x], IBM Z series, menggunakan urutan Big-Endian. Beberapa prosesor mampu menggunakan keduanya yang sering dinamakan bi-endian, misalkan Sun SPARC, ARM dan PowerPC. Byte 1 Byte 2 Byte 3 Byte 4 12 34 56 78 Alamat Memori Data 0x00000000 12 0x00000008 34 0x00000010 56 0x00000018 78 Alamat Memori Data 0x00000000 78 0x00000008 56 0x00000010 34 0x00000018 12 Big-Endian Byte Order Little-Endian Byte Order
  • 33. Cache • Prosesor modern dilengkapi dengan cache yang umumnya terbagi tiga tingkat (three tiers): level 1 (L1), level 2 (L2) dan level 3 (L3). Hirarkinya mengikuti prinsip2 yang sama dengan hirarki memori: makin jauh dari ALU, makin lambat, makin besar dan makin murah. Baik cache L1 dan L2 sangat dekat dengan ALU, dimana L2 sedikit lebih jauh tetapi lebih besar kapasitasnya. Cache L3 diakses oleh semua core sebagai lapisan akhir memori statik sebelum data dikirim ke RAM untuk penyimpanan. • Contoh hirarki cache adalah prosesor Intel Core i7 yang memiliki L1 cache sebesar 64kb per core (32 kb untuk instruksi dan 32kb untuk data). L2 cache 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 Register2, sebuah lokasi memori tercepat dalam prosesor. Register2 ada pada puncak hirarki memori, lebih kecil dan lebih cepat daripada cache. Register2 adalah daerah penyimpanan kecil terdekat ke ALU yang dipakai untuk memegang operand2, alama2 dan hasil2 selama eksekusi instruksi2.
  • 34. 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.
  • 35. REGISTER 8086 The system bus (shown in yellow) connects the various components of a computer. The CPU is the heart of the computer, most of computations occur inside the CPU. RAM is a place to where the programs are loaded in order to be executed. Inside the CPU AX – the accumulator register (terbagi atas AH / AL) BX – the base address register (terbagi atas BH / BL) CX – the count register (terbagi atas CH / CL) DX – the data register (terbagi atas DH DL) SI – source index register DI – destination index register BP – base pointer SP – stack pointer IP – Instruction Pointer CS – code segment DS – data segment SS – stack segment ES – extra segment • 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 mengontrol instruksi2 yang sedang dieksekusi, menangani pengalamatan memori, dan menyediakan kemampuan aritmetika. Flag Register General-Purpose Register Special-Function Register Segment Register 1) Dalam ilmu Organisasi dan Arsitektur Komputer, dikatakan hampir tidak ada latensi antara CPU dan Register. Berbeda halnya dengan CPU dan memori.
  • 36. REGISTER 80386 (Untuk Referensi Saja)
  • 37. REGISTER2 x86 DAN x86_64 64-bit 32-bit 16-bit General Purposer Registers RAX EAX AX RBX EBX BX RCX ECX CX RDX EDX DX RSI ESI SI RDI EDI DI RBP EBP BP RSP ESP SP R8 – R15 64-bit 32-bit 16-bit Segment Registers N/A CS CS DS DS ES ES SS SS FS GS Instruction Pointer RIP EIP IP Flags Register RFLAGS EFLAGS FLAGS RFLAGS
  • 39. 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.
  • 40. 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.
  • 41. 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.
  • 42. • Pointer Register dipakai untuk menunjukkan lokasi dimana data diambil dari atau disimpan ke.
  • 43. Secara default, register2 BX, SI, DI bekerja dengan segment register DS. BP dan SP bekerja dengan segment register SS. • 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 4000H
  • 44. Memahami Jenis Pengalamatan Memori Catatan: Untuk Referensi Saja Prosesor 80286 ke atas menggunakan sejenis tabel tambahan ( aka. Descriptor Table) untuk pengalamatan sehingga mampu menangani memori > 1024 Byte. [Protected Mode Memory Addressing]
  • 46.
  • 47. Overlapping Segments • Ketika menghitung physical address, sangat mungkin dua segment tumpang tindih, yang juga seringkali memang diinginkan atau sengaja. • Pada gambar di bawah ini, tumpang tindih digunakan pada file2 COM.
  • 48. Register Index Register SI dan DI tersedia untuk pengalamatan berindeks terutama untuk digunakan dalam penjumlahan dan pengurangan. • Register SI. Register Source Index 16-bit ini diperlukan untuk beberapa operasi string (karakter). Dalam konteks ini, SI terasosiasikan dengan Register DS. Prosesor 80386 dan selanjutnya mendukung 32-bit extended register, ESI. • Register DI. Register Destination Index 16-bit juga diperlukan untuk beberapa operasi string. Dalam konteks ini, DI diasosiasikan dengan Register ES. Prosesor 80386 dan selanjutnya mendukung 32-bit extended register, EDI.
  • 49. Register Flags • Ada sembilan dari 16 bit Register Flags tersedia umum ke semua prosesor keluarga 8086 untuk menunjukkan status terkini komputer dan hasil2 pemrosesan. Banyak instuksi2 yang melibatkan komparasi (perbandingan dan logic aritmetika yang mengubah status flags, yangmana beberapa instruksi perlu mengeceknya untuk menentukan aksi berikutnya. • Flag-Flag yang tersedia umum (common flag bits) adalah : • OF (overflow): sebagai indikasi overflow (tumpah) dari high-order bit (paling kiri) atas aritmetika yang terjadi. • DF (direction): menentukan arah kiri atau kanan untuk menggeser atau membandingkan data string (karakter). • IF (interrupt): sebagai indikasi seluruh interrupt eksternal, seperti entri keyboard, sudah siap diproses atau diabaikan. • TF (trap): mengijinkan operasi prosesor dalam mode single-step (satu langkah). Program2 debugger seperti DEBUG.COM mengeset trap flag sehingga Anda dapat selangkah mengeksekusi satu instruksi tunggal pada stu waktu untuk menguji efeknya atas Register dan Memori. • SF (sign): berisi tanda hasil operasi aritmetika (0 = positif dan 1 = negatif) • ZF (zero): sebagai indikasi hasil dari sebuah operasi aritmetika atau komparasi (0 = nonzero dan 1 = hasil zero). • AF (auxiliary carry): berisi carry out dari bit 3 atas data 8-bit, ini untuk aritmetika khusus saja. • PF (parity): sebagai indikasi paritas genap atau ganjil atas operasi data 8-bit ordo rendah (low order) atau paling kanan. • CF (carry): berisi carry dari bit ordo atas (high-order) atau paling kiri akibat operasi aritmetika sebelumnya; juga memuat isi dari bit terakhir atas operasi shift (geser) atau rotate (putar).
  • 50. • Flag2 yang paling relevan dengan pemrograman Bahasa Assembly adalah OF, SF, ZF dan CF untuk operasi2 komparasi dan aritmetika, dan DF untuk arah operasi string. • Prosesor 80286 dan selanjutnya memiliki 32-bit extended flags register yang dikenal sebagai Eflags. • Anda tak perlu mengingat lokasi2 berikut:
  • 51. INPUT-OUTPUT INTERFACE • BIOS berisi kumpulan routine2 dalam ROM untuk mendukung piranti. BIOS mengetes dan inisialisasi piranti2 terpasang dan menyediakan layanan2 yang diperlukan untuk membaca dari dan menulis ke piranti. Satu task dari DOS adalah menjembatani dengan BIOS jika ada keperluan untuk mengakses fasilitas2 ini. • Saat program user memerlukan layanan I/O dari OS, ia mengalihkan permintaan ke BIOS, yangmana seterusnya mengakses piranti yang dikehendaki. Akan tetapi kadang2 program membuat permintaan langsung ke BIOS, khususnya untuk layanan2 keyboard dan layar. Lebih serius lagi, bisa juga program mengakses piranti secara langsung. User Program Hardware / Devices DOS BIOS
  • 52. • 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.
  • 53. 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.
  • 54. OPERASI I/O • Operasi2 I/O yang dieksekusi oleh prosesor umumnya ada empat cara: programmed I/O (PIO), interrupt- driven I/O, direct memory access (DMA) dan I/O channels. • Programmed I/O (PIO) merupakan teknik paling sederhana implementasinya, tetapi paling tinggi overheadnya karena ia paling tidak efisien mengambil pilihan2. Saat prosesor mengeksekusi sebuah operasi I/O dalam mode PIO, CPU mengirim perintah dan mengeset bit2 yang sesuai pada I/O status register untuk menandai selesainya perintah. Prosesor harus secara periodik mengecek I/O status register untuk melihat apabila modul I/O telah menyelesaikan operasi. Overhead disebabkan oleh pengecekan secara periodik, terutama pada saat operasi2 I/O sangat panjang dimana prosesor harus mengecek beberapa kali. • Prosesor bisa lebih efisien jika setelah mengirim perintah ke modul I/O, ia lanjut dengan operasi lain bukan menunggu perintah I/O selesai. Konsep demikian dinamakan interrupt-driven I/O. Saat prosesor mengirim satu perintah ke modul I/O, ia bergerak ke instruksi lainnya dan hanya kembali ke operasi eksternal ketika modul I/O mengirim sebuah interrupt. Interrupt menyela (pause) operasi2 lain sehingga prosesor dapat menyelesaikan operasi I/O segera. Prosesor mengecek interrupt2 di akhir setiap siklus instruksi, sehingga modul I/O tak akan pernah menunggu lebih lama dari satu siklus instruksi penuh setelah adanya interrupt message agar transaksi diselesaikan. Sekalipun kelihatannya prosesor menyerahkan sepenuhnya eksekusi perintah kepada modul I/O, prosesor masih harus diberdayakan setiap kali data dipindahkan ke/dari memori utama (RAM).
  • 55. • Baik Programmed I/O maupun interrupt-driven I/O memerlukan keterlibatan terus-menerus prosesor. Apabila banyak operasi I/O berupa data transfer antara piranti2 eksternal dan RAM, prosesor akan membuang banyak clock cycle untuk tugas2 biasa. Overhead demikian memerlukan solusi bagaimana meningkatkan efisiensi prosesor; jawabannya adalah direct memory access (DMA). Menggunakan DMA memerlukan modul tambahan pada motherboard semata-mata untuk operasi2 DMA. Ketika prosesor mengeksekusi operasi I/O, CPU mengirim informasi ke modul DMA, bukan langsung ke piranti I/O. Seolah- olah modul DMA meng-emulasi prosesor mengambil kendali atas operasi I/O dengan menyela prosesor selama satu cycle pada satu waktu sehingga modul DMA bisa memperoleh akses bebas ke system bus (proses ini dinamakan cycle stealing). Ketika modul DMA telah menyelesaikan operasi I/O, ia mengirim interrupt ke prosesor untuk menandai sudah selesai.Prosesor hanya bertanggung jawab untuk instruksi2 non data transfer terkait dengan operasi2 I/O yangmana menghemat clock cycle dan membuat penggunaan prosesor komputer menjadi lebih efisien.
  • 56. • 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.
  • 57. Sisi Perangkat Lunak (Sistem Operasi, Proses Boot, Stack, Pengalamatan Instruksi dan Data)
  • 58. 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.
  • 59. 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.
  • 60. 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.
  • 61. 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.
  • 62. 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. Fungsi BIOS ROM Karena CPU hanya mengeksekusi program2 yang telah tersimpan dalam memori, maka harus ada sebagian memori permanen (volatile) untuk memegang program2 yang memberitahu CPU apa yang perlu dilakukan ketika komputer pertama menyala (power on). Kumpulan program ini dipegang oleh ROM yang sering disebut BIOS dalam literatur2 komputer. BIOS, singkatan dari basic input-output system, berisi program2 untuk mengetes RAM dan komponen lain yang terhubung ke CPU. Ia juga berisi program2 agar DOS dapat berkomunikasi dengan piranti2 peripheral seperti keyboard, video, printer dan disk. Adalah fungsi BIOS mengetes jika ada error. Contoh, jika keyboard terlepas dari PC sebelum komputer nyala, BIOS akan melaporkan error pada layar, mengindikasikan kondisi itu. Adalah hanya setelah pengetesan dan pengesetan (set up) peripheral2 oleh BIOS maka DOS diangkat (load) ke dalam RAM dan menyerahterimakan (hand over) kendali PC ke DOS. Walaupun ada kalanya ketika DOS maupun program aplikasi perlu menggunakan program2 dalam BIOS ROM, DOS selalu mengendalikan PC setelah ia diangkat (loaded).
  • 63. INTERRUPT• INT <Destination_Operand> adalah instruksi bahasa assembly pada prosesor x86 yang membangkitkan interupsi atau exception handler software yang memanggil (CALL) fungsi yang sesuai dengan operandnya. Interrupt itu sendiri bukan hanya berupa instruksi bahasa assembly, tetapi juga hardware. Interrupt adalah cara bagaimana mendapat perhatian dari prosesor.1) • Destination Operand memerinci bilangan vektor interrupt dari 0 sampai 255 (INT 00 sampai INT 0FFh), yang disandikan sebagai 8-bit unsigned immediate value. • 0 – 4 terdedikasi • 5 – 31 direservasi buat penggunaan sistem • 08h – 0Fh : 8259A • 10h – 1Fh : BIOS • 32– 255 direservasi untuk user • 20h – 3Fh : DOS • 40h – FFh : terbuka (open) • Interrupt vector menunjuk alamat masuk (entrance address) dari interrupt service routine (ISR) yang sesuai. Interrupt Vector Table (IVT) diletakkan pada 1KiB (1024) pertama dalam memori RAM. 1) Cara lain mendapat perhatian dari prosesor adalah polling.
  • 64. Interrupt Vector Table (IVT) Jenis-jenis Interrupt: 1. Internal HW Interrupts • dibangkitkan oleh peristiwa atau event tertentu yang terjadi pada waktu / selama eksekusi program. • diatur oleh HW dan tidak mungkin diubah • contoh: interrupt untuk counter clock internal; HW call interrupt ini untuk menjaga “time to date”. 2. External HW Interrupts • dibangkitkan oleh piranti peripheral yakni keyboard, printer dsb. • biasa juga dibangkitkan oleh Co-Processor • tidak mungkin di-non-aktifkan (deactivate) • tidak dikirim langsung ke CPU, melainkan ke IC yang memiliki fungsi untuk menangani secara eksklusif interrupts ini (IC PIC8259A yang dikendalikan oleh CPU dengan menggunakan urutan komunikasi atau path control) 3. Software Interrupts • diaktifkan langsung oleh Assembler melalui sejumlah interrupt dengan instruksi INT. • ada dua jenis: interrupt DOS dan interrupt BIOS.
  • 65. 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 Langkah-langkah yang terlibat dalam pemrosesan instruksi interrupt oleh prosesor: 1. Eksekusi instruksi interrupt 2. JMP ke Interrupt Vector Table 3. Ambil CS dan IP dari IVT 4. PUSH CS dan IP yang ada ke dalam stack 5. LOAD CS dan IP yang baru 6. JMP ke Interrupt Service Routine 7. Eksekusi Interrupt Service Routine 8. Kembali dan lanjutkan Main Program
  • 66. Interrupts Hardware Interrupts Nonmaskable Interrupts Programmer dapat memilih untuk mask interrupt2 tertentu dan re-enable nanti Maskable Interrupts Programmer tidak dapat mengendalikan saat non- maskable interrupt dilayani Prosesor harus menghentikan main program agar mengeksekusi NMI Service Routine. Software Interrupts INT n 256 jenis Software Interrupts INT 00 sampai INT 0FFh Vijay Kumar K., Dept. of ECE INTUACEK, “Interrupts on 8086 Microprocessor”, https://www.slideshare.net/VijayKumar486/interrupts-on-8086-microprocessor-by-vijay-kumark, accessed on Oct 21, 2019.
  • 67. RESET sebagai Non-maskable Interrupts Urutan proses dalam prosesor : 1. selesaikan instruksi terkini yang sedang dikerjakan 2. PUSH nilai2 Flag Register ke dalam stack 3. PUSH nilai CS dan IP untuk alamat return ke dalam stack 4. LOAD IP dari isi word di lokasi 00008h 5. LOAD CS dari isi word di lokasi 0000Ah 6. Interrupt Flag dan Trap Flag di-reset ke 0
  • 68. Non-Maskable Interrupts digunakan saat power failure digunakan saat critical response times digunakan saat non- recoverable hardware errors digunakan sebagai Watchdog Interrupt digunakan saat Memory Parity errors Software Interrupts digunakan oleh Sistem Operasi sebagai "pengait" ke beragam fungsi2 digunakan sebagai mekanisme komunikasi antar bagian berbeda dari sebuah program Hardware Interrupts digunakan untuk menangani perangkat keras peripheral yakni keyboard, mouse, hard disk, floppy disk, DVD drive dan printer Tanpa interrupt, sistem akan sangat sederhana. Semua arsitektur mikroprosesor memiliki kemampuan layanan interrupt bawaan (in-built interrupt service)
  • 69. Polling vs Interrupt (Untuk Referensi Saja) • Untuk mendapatkan perhatian dari prosesor dapat digunakan polling atau interrupt. • Untuk memahami perbedaan keduanya, dipakai contoh pengendalian robot menggunakan Polling dan Interrupt. • Polling : • Bergerak maju dalam satuan yang sudah didefinisikan (predefined) • Cek pembacaan sensor • Jika tidak ada gangguan jalan terus atau belok jika ada halangan • Ulang kembali dan bergerak maju lagi. • 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.
  • 70. 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.
  • 71. Sistem Berbasis Polling Keystroke dikirim ke CPU Tak ada Keystroke dikirim ke CPU Sistem Berbasis Interrupt
  • 72. Sistem Berbasis Polling tak ada keystroke setelah 20ms, wait atau loop ada keystroke Sistem Berbasis Interrupt
  • 73. Apakah STACK dan Mengapa Diperlukan ? • Stack adalah bagian dari read/write memory (RAM) yang digunakan CPU untuk menyimpan informasi temporer. CPU perlu area penyimpanan ini karena terbatasnya jumlah register. Oleh karena itu harus ada suatu tempat agar CPU dapat menyimpan informasi dengan aman dan temporer. • Pertanyaannya adalah mengapa tidak merancang CPU dengan banyak register. Alasan tentang desain CPU adalah setiap transistor itu ad harganya dan tidak akan cukup untuk membangun ratusan register. Lagi pula seberapa banyak register yang CPU bisa puaskan setiap program atau aplikasi? Semua aplikasi dan teknik pemrograman tidak ada yang sama. • Kekurangan utama dari stack adalah waktu aksesnya (access time). Karena stack berada dalam RAM, butuh waktu lebih lama mengakses dibanding register. Apa lagi register berada dalam CPU, RAM di luar. Inilah alasan beberapa komputer super (tentunya mahal) tidak punya stack; CPU memiliki sejumlah register yang banyak untuk kerja.
  • 74. Stack • Baik program .COM maupun .EXE memerlukan sebuah area dalam program yang dicadangkan sebagai stack. Gunanya adalah sebagai ruang untuk penyimpanan temporer dari alamat2 dan data. • Program loader secara otomatis mendefinisikan stack untuk program .COM, tetapi Anda harus secara eksplisit mendefinisikannya untuk program .EXE. • Setiap data item dalam stack berukuran 1 word (2 byte). • Register SS, yang di-inisialisasi oleh loader, beris alamat dari awal stack. Awalnya register SP berisi ukuran dari stack, nilai yang menunjukkan byte di penghujung akhir stack. Stack berbeda dari segment lain dalam hal cara menyimpan data. Ia mulai menyimpan data pada lokasi teratas dalam segment dan menyimpan data turun ke bawah sepanjang memori. • Instruksi PUSH dan POP dipakai untuk menyimpan data dalam stack dan mengambilnya kembali. Ini mirip seperti tumpukan nampan di restoran. Ketika PUSH dieksekusi, nilai SP berkurang 2 ke storage word lebih rendah berikutnya dalam stack dan menyimpan (atau mendorong, pushing) nilainya di situ. Sebaliknya POP mengambil nilai dari stack dan menaikkan SP sebanyak 2 merujuk ke storage word yang lebih atas berikutnya.
  • 75.
  • 76. ILUSTRASI PUSH DAN POP REGISTER AX DAN BX Anggaplah AX berisi heksa 026Bh, BX berisi 04E3h dan SP berisi 36h. Alamat segment dalam SS tidak diperhatikan. PUSH AX PUSH BX POP BX POP AX Awalnya, stack masih kosong, dan terlihat seperti ini: SP berkurang 2 (menjadi 34h) dan isi AX (026Bh) ke dalam stack. Perhatikan operasi membalik urutan byte tersimpan sehingga 026Bh menjadi 6B02h: SP berkurang 2 (menjadi 32h) dan simpan BX (04E3h) ke dalam stack sebagai E304h: Mengambil word dari lokasi yang ditunjuk SP dalam stack (E304h) masuk ke dalam register BX dan tambahkan SP 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 dengan 2 (menjadi 36h). Sekarang AX berisi 026Bh dengan urutan byte2 terkoreksi.
  • 77. 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.
  • 78. 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.
  • 79. • 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 register AL; byte tersebut ada di offset 0016h dalam data segment. Maka kode mesin dan kode simbolik operasi ini: A01600 MOV AL,[0016] • 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 Lokasi 05C03h Catatan: A0 adalah kode mesin dari instruksi MOV
  • 80. • 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.
  • 81. 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 • MOV pertama memindahkan data antara memori dan register. • MOV kedua memindahkan immediate data ke register. • MOV ketiga memindahkan data antar register. • Kurung kotak pada MOV keempat mendefinisikan index operator yang artinya: Gunakan alamat offset dalam DX (digabungkan dengan alamat segment dalam DS, DS:DX) untuk menemukan sebuah word dalam memori dan memindahkan isinta ke CX. Bandingkan efek instruksi ini dengan MOV ketiga yang hanya memindahkan isi DX ke CX.
  • 82. • Akses ke register pada 8086 tidak seluruhnya bebas. Misalkan kita dapat isikan immediate values seperti angka ke GPR mana saja, tetapi tidak ke segment register. • Kita dapat taruh angka 6 ke BX dalam satu instruksi: !"# $%, 6 • Menaruh 6 ke DS memerlukan dua instruksi karena segment register hanya bisa diubah lewat GPR, bukan konstanta atau segment register lain. 1) MOV BX, 6 MOV DS, BX 1) ini dinamakan mode pengalamatan register indirect. ……. lihat Addressing Mode dalam 8086
  • 83. ADDRESSING MODE DALAM 8086 Mode2 pengalamatan adalah kunci atas operasi2 canggih dalam komputer. 8086 menyediakan beberapa: immediate, memory indirect dan register indirect. • Immediate. Nilai2 langsung ditulis, seperti bilangan2. Contoh: MOV BX,6 • Memory Indirect. Nilai2 yang berada pada suatu lokasi dalam data segment. Misal: MOV BX, FOO . . FOO DW 6 Ini akan “memindahkan” (sebenarnya menyalin) nilai 6 yaitu apapun isi variabel FOO, ke dalam BX. • Register Indirect. Ada dua jenis register untuk operasi ini: Base Register (BX dan BP) dan Index Register. (SI dan DI). Pada mode ini, register berisi alamat dalam data segment dimana informasi yang dikehendaki tersimpan. Misal: MOV AX, 0F000h MOV ES, AX MOV SI, 0FFFEh MOV DL, BYTE PTR ES:[SI] Kode di atas akan membaca machine ID pada lokasi F000:FFFE menggunakan indirect mode lewat register SI. Sebuah register indirect reference bisa memiliki sedikitnya satu Register Index dan satu Register Base. Ini menjadi cara mudah mengindeks dalam array / larik, atau struktur data. Mode2 pengalamatan dapat dikombinasi sesuka Anda.
  • 85. Program Bahasa Assembly 8086 Pemrogaman Bahasa Assembly 8086 punya beberapa aturan seperti : • Kode harus ditulis dalam huruf besar • Label2 harus diikuti dengan titik dua, misalkan: !"#$!: • Seluruh label dan simbol harus mulai dengan huruf • Seluruh komentar diketik dalam huruf kecil • Baris terakhir program harus diakhiri dengan END directive Untuk kemudahan pemahaman maka pelajaran menggunakan MASM 6.15 yang masih 16-bit dan simulator EMU8086 4.08.
  • 86. Persiapan Software Assembler • Pasang software MASM 6.15 • Download software dari https://winworldpc.com/home • Ekstrak software ke dalam C:>masm615 • Masukkan C:>masm615bin 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
  • 87. Program .COM • Program .COM hanya menggunakan 1 segment (ukuran maksimal data + program adalah 64KiB)1) dengan struktur Assembly sbb: • .MODEL SMALL : tanda directive untuk memberitahukan kepada Assembler bentuk memori yang akan digunakan oleh program kita. 1. TINY – Jika program Anda hanya menggunakan 1 segment seperti program COM. 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. BAB VI MEMBUAT PROGRAM COM 6.1. MODEL PROGRAM COM Untuk membuat program .COM yang hanya menggunakan 1 segment, bisa buat dengan model program seperti gambar 6.1. Bentuk yang digunakan d adalah bentuk program yang dianjurkan(Ideal). Dipilihnya bentuk program dalam buku ini dikarenakan pertimbangan dari berbagai keunggulan b program ideal ini seperti, prosesnya lebih cepat dan lebih mudah digu oleh berbagai bahasa tingkat tinggi yang terkenal(Turbo Pascal dan C). ----------------------------------------------------------- .MODEL SMALL .CODE ORG 100H Label1 : JMP Label2 +---------------------+ | TEMPAT DATA PROGRAM | +---------------------+ Label2 : +---------------------+ | TEMPAT PROGRAM | +---------------------+ INT 20H END Label1 ----------------------------------------------------------- Gambar 6.1. Model Program COM Supaya lebih jelas bentuk dari program ideal, marilah kita tel lebih lanjut dari bentuk program ini. 6.1.1 .MODEL SMALL Tanda directive ini digunakan untuk memberitahukan kepada asse bentuk memory yang digunakan oleh program kita. Supaya lebih jelas model- yang bisa digunakan adalah : - TINY Jika program anda hanya menggunakan 1 segment seperti program COM. ini disediakan khusus untuk program COM. - SMALL Jika data dan code yang digunakan oleh program kurang dari uku segment atau 64 KB. - MEDIUM Jika data yang digunakan oleh program kurang dari 64 KB tetapi code digunakan bisa lebih dari 64 KB. 24
  • 88. 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). • Pada program COM, tidak perlu mendefinisikan tempat tertentu untuk segment DATA dan STACK karena hanya menggunakan satu segment bersama CODE. Di sini STACK akan menggunakan akhir dari segment yang digunakan oleh segment CODE. Berbeda pada program EXE ketiganya perlu didefinisikan. • Pada program EXE tidak perlu menggunakan directive ORG 100h karena program EXE bisa menempatkan dirinya pada alamat yang telah ditentukan. Catatan: Pada program EXE, segala bentuk JUMP dan CALL digunak FAR(Program COM berbentuk NEAR). Hal ini dikarenakan program EXE mengakses segment lain, sehingga perintah JUMP dan CALL membutuhkan alamat dari segment(CS) selain offset(IP). 26.2. MODEL PROGRAM EXE Pada program COM, kita tidak perlu mendefinisikan tempat terte segment DATA dan STACK karena program COM hanya menggunakan 1 segmen demikian segment untuk DATA, STACK dan CODE pada program COM ada stack akan menggunakan akhir dari segment yang digunakan oleh segment Berbeda dengan program COM, pada program EXE anda harus mende tempat untuk segment DATA, CODE dan STACK. Untuk membuat program EXE bisa menggunakan model pada gambar 26.1. ----------------------------------------------------------- .MODEL SMALL .STACK 200h .DATA +--------------+ | Tempat | | Data Program | +--------------+ .CODE Label1: MOV AX,@DATA MOV DS,AX +---------------+ 189 | | | Tempat | | Program | | | +---------------+ MOV AX,4C00h INT 21h END Label1 ---------------------------------------------------------- Gambar 26.1. Model program EXE Pada program EXE, kita tidak perlu menggunakan perintah:ORG 100
  • 89. • 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.
  • 90. 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.
  • 91. 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.
  • 92. 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 2. Pengkodean Algoritma • Penulisan program dalam bahasa pemrograman tertentu (dalam hal ini Bahasa Assembly) 3. Penerjemahan ke Bahasa Mesin • 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. Untuk membuat program dalam Bahasa Assembly tersedia dua opsi: 1. Menggunakan Assembler (Microsoft Assembler MASM, Borland Turbo Assembler TASM, Netwide Assembler NASM, GNU Assembler GAS, dst) 2. Debugger
  • 93. Hardware Registry, Memori, Device Firmware Assembler Assembly program (text file) source code Misal: VIDEO_IO.ASM Bisa berupa GAS, TASM, MASM, FASM, NASM, GOASM, YASM Assembly language vs. machine code Assembler translates assembly code to machine code loop: lw $t3, 0($t0) lw $t4, 4($t0) add $t2, $t3, $t4 sw $t2, 8($t0) addi $t0, $t0, 4 addi $t1, $t1, -1 bgtz $t1, loop 0x8d0b0000 0x8d0c0004 0x016c5020 0xad0a0008 0x21080004 0x2129ffff 0x1d20fff9 Assembler Assembly program (text file) source code Machine code (binary) object code 3 / 32 Assembly language vs. machine code Assembler translates assembly code to machine code loop: lw $t3, 0($t0) lw $t4, 4($t0) add $t2, $t3, $t4 sw $t2, 8($t0) addi $t0, $t0, 4 addi $t1, $t1, -1 bgtz $t1, loop 0x8d0b0000 0x8d0c0004 0x016c5020 0xad0a0008 0x21080004 0x2129ffff 0x1d20fff9 Assembler Assembly program (text file) source code Machine code (binary) object code 3 / 32 Machine code (binary) object code Misal: VIDEO_IO.OBJ 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). Compiling, Linking and Executing Programs EDITING hello.asm COMPILING c:>ml /c hello.asm LINKING c:>link hello.obj EXECUTING/LOADING c:>hello hello.exe hello.obj hello.asm 1 2 3 4
  • 94. 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: 00000000 b80a000000 movl $0xa, %eax 00000005 48 decl %eax 00000006 bb05000000 movl $0x5, %ebx 0000000b c3 retl main: 0x1fac <+0>: movl $0xa, %eax 0x1fb1 <+5>: decl %eax 0x1fb2 <+6>: movl $0x5, %ebx 0x1fb7 <+11>: retl Windows macOS Linux COFF, PE, Win32, Win64 Mach-o ELF, a.out (deprecated) Format2 dari file objek menurut platform OS