OLEH
1
TAHUN AJARAN 2019-2020
2
KATA PENGANTAR
Dengan rahmat-Nya, buku ajar “Metode elemen hingga dan Bahasa Pemrograman
Tingkat Rendah”, telah selesai disusun. Mudah-mudahan dapat membantu dalam memahami
dasar dasar elemen hingga dan pemrograman bahasa tingkat rendah dengan bahasa assembly.
Buku ajar ini berisi tentang sebagian materi Bahasa Pemrograman Tingkat Rendah yang
terdapat pada kurikulum jurusan Teknik Informatika STT Telkom, yang terdiri dari 10 bab
dengan masing-masing bab membahas :
PENULIS
i
DAFTAR ISI
KATA PENGANTAR
BAB 1.PENDAHULUAN
1.1.Formulasi integral.........................................................................................................2
1.2.1.Metode Variasonal................................................................................................6
1.2.2.Metode Subdomainr..............................................................................................8
1.2.3.Metode Galerkin...................................................................................................9
2.1.Elemen Linier...............................................................................................................14
3.1.Pendahuluan..................................................................................................................22
3.2.Represtasi Data..............................................................................................................26
3.5.Komponen Mikrokomputer...........................................................................................51
3.6.Aristektur Sistem..........................................................................................................57
3.8.3.Intruksi Aritmetik..................................................................................................99
3.8.5.1.Model Memori................................................................................................119
iii
i
BAB I
PENDAHULUAN
Metode elemen hingga adalah suatu prosedur numerik untuk memperoleh solusi terhadap
banyak permasalah yang sering di jumpai dalam analisis teknik. Secara garis besar di bagi
menjadi dua sub devisi yaitu pertama menjadi elemen-elemen diskrits untuk memperoleh
simpangan-simpangan dan gaya-gaya anggota dari struktur unsure. Ke.dua mennggunakan
elemen-elemen kontinum untuk memperoleh solusi terhadap permasalahan-permasalahan
perpindahan kalor, mekanika fluida dan benda padat.
Ada dua (2) karakteristik yang membedakan metode metode elemen hingga untuk
metode numerik antara lain, yaitu :
1
3. Bentuk lah sistim persamaan diatas dengan metode Galerkin, Variasional, formulasi
energi potensial, collocation, subdomain, dll. khusus untuk formulasi energi potensial,
energi potensial dari sist1m di tulis dalam bentuk persamaan dan kemudian
diminimalkan, dimana akan di beri satu persamaan setiap simpangan yang belum di
ketahui.
4. Selesaikan persamaan diatas.
5. Hitung besaran-besaran yang dicari. Besaran-besaran ini mempunyai komponen-
komponen tegangan, aliran panas atau kecepatan fluida.
1.1.Formulasi integral
Ada beberapa macam metoda untuk memformulasikan integral-integral fungsi tersebut
Metoda variasional
Pendekatan variasional melibatkan integral dari suatu persamaan yang
mempunyai harga-harga. setiap fungsi baru menghasilkan harga baru. Funsi tersebut
mempunyai nilai terkecil ini mempunyai sifat khusus yaitu memenuhi persamaan-
persamaan integral untuk mengklasifikasikan konsep ini, ambil integral berikut.
(1. 1 )
(1. 2 )
Dengan kondisi batas y (0) = y0 dan y (H) = yH . Tentu saja proses ini dapat di
defenisikan sebagai suatu persamaan diffrensial, jawab dapat di peroleh dengan
mensubsitusikan persamaan coba-coba ke dalam fungsional secara tepat. Fungsi coba-
coba yag memberikan harga II minimum adalah merupakan jawab pendekatan.
2
Metode variasional adalah merupakan basis dari banyak formulasi elemen hingga,
tetapi metode ini mempunyai kelemahan yaitu : tidak dapat diaplikasikan pada persamaan
diferensial yang mengandung derivatif pertama.
(1. 3)
(1. 4)
Fungsi residual R(x) dikalikan dengan fungsi pemberatan fungsi dari Wi(x) dan
integral dari dua funsi tersebut harus sama dengan nol. Jumlah fungsi pemberatan
persamaan dengan jumlah koefisiens-koefisien yang belum di ketahui dalam persamaan
dan beberapa pilihan untuk fungsi-fungsi pemberatan,beberapa metode tersebut adalah
1. Metoda Collocation
Fungsi-fungsi impuls Wi(x) = (x-Xi) dipilih sebagai fungsi pemberatan.
Fungsi-fungsi ini equivalen ini equivalen dengan fungsi-fungsi residual yang
digunakan untuk menghilangkan titik-titik tertentu( mereduksi persamaan). jumlah
3
titik-titik yang dipilih sama dengan jumlah koefisien-koefisien yang belum di
ketahui dalam jawaban pendekatan.
2. Metode subdomaint
Setiap fungsi pemberatan dipilih sama dengan Wi(x)=1, untuk daerah
tertentu. Ini equivalen dengan integral fungsi residual untuk menghasilkan
persamaan dari daerah tersebut. Jumlah interval-interval integrasi sama dengan
jumlah pemberatan yang belum di ketahui dalam jawaban pendekatan.
3. Metode Galerkin
Metode galerkin menggunakan fungsi-fungsi yang sama Wi (x) yang
digunakan dalam persamaan pendekatan. Pendekatan ini adalah dasar dari metode
elemen hingga untuk masalah-masalah yang menyangkut suku pertama
derivative. Metode ini akan memberikan hasil yang sama seperti metoda
variasional bila diterapkan untuk analisis “Field Problems” diantaranya mekanika
fluida yang digunakan untuk penampang tak silindris dan sebagainya.
(1. 5)
Contoh Ilustrasi
Untuk lebih jelasnya bagaimana metode-metode diatas dapat di gunakan untuk
memperoleh suatu jawaban pendekatan terhadap masalah fisik, maka disini akan di
4
berikan suatu contoh ilustrasi. Contoh tersebut adalah suatu beam di tumpu secara
sederhana mengalami momen terkonsentrasi pada masing-masing ujungnya seperti
diagram momen lengkung di tunjukan pada gambar 1.1
Gambar 1.1. sebuah beam di tumpu secara sederhana dengan momen dan konsentrasi
(1. 6)
(1. 8 )
Dengan A adalah suatu koefisien yang belum di ketahui. Jawab ini merupakan
kandidat yang dapat di terima, mengingat persamaan diatas memenuhi persyaratan kondisi-
kondisi batas Y(0) = Y(H) = 0 dan mempunyai pola menyerupai kurva defleksi yang di
harapkan. Jawab ekstrak persamaan diffrensial adalah :
5
(1. 9)
(1. 10 )
Harga A yang membuat (1.8) merupakan pendekatan terbaik untuk kurva defleksi
adalah harga yang membuat Π minimum. Untuk mengevaluasi A, Π harus di tulis
sebagai fungsi A dan kemudian di minimalkan terhadap A. Catatan bahwa
atau
(1. 11)
Minimalkan Π di peroleh
Dan
(1. 1 2)
6
Jawab pendekatan adalah
(1.13 )
Meode Collocation
Karena (1.14)
Disini hanya ada satu koefesien yang belum diketahui, Oleh karena itu (R(x)
disamakan dengan nol pada satu titik antara 0 dan H. pilih x = H/2 dari
kenyamanan, maka kita memperoleh
Dan
(1.15)
7
Jawab pendekatan adalah
(1.16)
Jika dipilih titik selain x = H/2, maka akan diperoleh jawaban yang berbeda dari
perkiraan yang telah diperoleh.
1.2.2.Metode SubdomainR
Integrasi menghasilkan
Atau
(1.17)
(1.18)
8
1.2.3.Metode Galerkin
Integrasi menghasilkan
Atau
(1.19)
(1.20)
Jawabannya ini adalah identik dengan jawaban yang diberikan oleh metode
variasional.
9
integrasi memberikan
(1.21)
(1.21)
Ini juga identik denga jawaban yang diberikan oleh metode variational
dan metode galerkin, (1.3), (1.20).
10
Gambar 1.2. Persamaan kesalahan untuk lima solusi
jawaban dari contoh beam ditumu sederhana
Solusi masalah-masalah mekanika yang solid yang meliputi dua dimensi dan tiga dimensi
seperti plat dan cangkang, dapat didekati dengan beberapa cara. Pendekatan klasik adalah
memformulasikan persamaan diferensial dan menjawab analitis. Ini mungin tidak bisa
berjalan, mengingat kesulitan menjelaskan secara matematik geometri struktur dan atau
kondisi batas.alternatif terhadap solusi klasik adalah prosedur numeric didasarkan pada
kejadian yang menyatakan bahwa simpangan pada posisi kesetimbangan terjadi
sedemikian sehingga energi potesial sistim stabil mempuyai harga minimum.
Energi potensial yang memberi sumbangan pada masalah mekanika solid adalah
energy regangan (strain energy) yang didenfinisikan sebagai energi tersimpan selama
proses deformasi. Energi ragangan adalah suatu integral volume yang melibatkan hasil
11
kali komponen-komponen tegangan dan regangan. Sebagai contoh tegangan pada suatu
batang yang mendapatkan gaya aksil adalah
(1.23)
Prinsip energi potensial dan energi regangan akan stabil di bab-bab dibelakang.
Yang jelas prinsip ini banyak digunakan untuk masalah-masalah struktur dan mekanika
solid.
12
BAB II
Dalam bab ini akan dibicarakan pembagian daerah satu dimensi ke dalam elemen-elemen linear
dan menjabarkan suatu persatuan elemen. Persamaan itu kemudian digeneralisasikan
sedemikian sehingga suatu persamaan “continuos piecewise smooth” dapat diterapkan didaerah
tersebut. Elemen linear digunakan untuk memperoleh jawab pendekatan terhadap persamaan
differensial berikut :
(2.1)
Persamaan elemen ini akan digunakan untuk menghitung perpindahan yang mengalami
pembebanan aksial.
Daerah satu dimensi adalah suatu segmen garis dan pembagian kedalam sub
bagian atau elemen cukup mudah dilakukan. Segmen garis dibagi menjadi menjadi
segmen garis pendek yang menggunakan nodal (Gambar 2.1). Nodal nodal diberi
penomoran secara berurutan dari kiri kekanan seperti pada penomoran nodal-nodal itu.
Ada beberapa aturan sebagai petunjuk untuk menentukan nodal-nodal yang kita
peroleh untuk mendapatkan jawab pendekatan yang akurat terhadap suatu persamaan
diferensial.
13
Aturan pertama mensyaratkan bahwa kita harus punya mengetahuan untuk mengetahui
kira-kira parameter yang belum diketehui bervariasi, ini menunjukkan dimana
pengetahuan ilmu tekik diperlukan dala proses sulosi. Aturan kedua juga perlu karna
integral-intergal yang melibatkan parameter D dan Q (2.1) harus dievaluasi. Integral
tersebut mudah dievaluasi jika tidak mempunyai koefesien-koefesien yang berubah
secara mendadak dakam interval intergrasi.
2.1.Elemen Linear
Gambar 2.2 menunjukkan elemen linear satu dimensi yaitu garis bagian dengan
sebuah panjang L dan dua nodal masing-masing pada ujung elemen. Nodal-nodal
dinotasikan dengan i dan j dan harga nodal ɸ i dan ɸj. system koordinat asal disebelah kiri
adalah nodal i.
Parameter ɸ bervariasi secara linear antara nodal, dan persamaan untuk ɸ adalah
(2.2)
14
(2.3)
(2.4)
(2.5)
(2.6)
15
Dimana Xj-Xi telah diganti dengan L
16
Persamaan (2.6) merupakan elemen hingga. Harga nodal-nodal dikalikan dengan fungsi
linear x, yang disebut dengan bentuk fungsi atau fungsi interpolasi. Fungsi-fungsi ini
diberi notasi N dengan subscript untuk memperoleh nodal dengan bentuk yang mana
fungsi interpolasi spesifik digunakan. Fungsi –fungsi dalam (2.6) dinotasikan Ni dan Nj
dengan
(2.7)
(2.8)
(2.9)
Dimana [N] = [Ni Nj] adalah vector baris fungsi interpolasi dan
Fungsi interpolasi mempunyai karekteristik yang unik. Dan yang lain berharga 1
pada nodal nya sendiri dan berharga nol pada nodal yang lain-lain dari fungsi interpolasi
adalah bahwa fungsi ini selalu mempunyai harga yang sama dengan persamaan
interpolasi asal. Persamaan (2.2) adalah persamaan linear, maka fungsi interpolasi ini
juga linear (2.7). karekteristik dalam persamaan penjumlahan derivative fungsi
interpolasi terhadap x adalah nol.
17
Gambar 2.3. fungsi interpolasi linear Ni dan Nj
18
Contoh Ilustrasi
Subtitusikan menghasilkan
19
Gradien temperatur adalah direvatif persamaan (2.6)
(2.10)
(2.11)
Dimana
(2.12)
Superskrip (e) menunjukkan suatu kuantitas elemen. Semua itu membutuhkan untuk
memberi harga-harga i, j dan e untuk setiap elemen yang lainnya. Nilai i dan j untuk e
tertentu diperoleh dari grid, dimana nodal i sebagai acuan untuk setiap elemen, misalnya
pemberian elemen pada grid dalam gambar 2.1 adalah
20
Persamaan untuk masing-masing elemen dalam gambar 2.1 adalah
(2.13)
Perlu diperhatikan bahwa N(1) dan N(2) merupakan persamaan differensial, jika
2 2
kedua melibatkan nodal 2. Persamaan-persamaan ini ini sebaga berikut
Ingat bahwa masing-masing persamaan (2.13) adalah untuk elemen tunggal dan
tidak dapat di-gunakan elemen lain, sehingga persaman pertama, misalnya, seharusnya
ditulis sebagai
Tetapi batas x dihilangkan dalam kebanyakan literatur elemen hinggga dan disini
juga demikian .
21
BAB III
(BPTR)
3. PENGENALAN
3.1. Pendahuluan
Bahasa assembly membuka rahasia perangkat keras dan perangkat lunak komputer.
Disini akan dipelajari bagaimana perangkat keras komputer dan sistem operasi
bekerjasama dan bagaimana program aplikasi berkomunikasi dengan sistem operasi.
Untuk memahami keseluruhan komputer dan sistem informasinya, seseorang perlu
memahami perangkat lunak pada berbagai level. Pertama level program aplikasi, dimana
program berinteraksi dengan DOS. Level bahasa tingkat tinggi, dimana
perintah/pernyataan yang handal diuraikan kedalam instruksi-instruksi mesin. Pada level
yang lebih rendah (lebih dekat dengan mesin), seseorang akan konsentrasi pada
instruksi-instruksi yang dikenali oleh CPU, sebagaimana program berkomunikasi dengan
DOS.
Secara singkat, bahasa assembly IBM-PC mengacu pada istruksi-instruksi yang dikenali
oleh keluargaa mikroprosesor Intel 8086-80486.
22
Apa itu assembler?
Bahasa assembly adalah kumpulan instruksi yang spesifik untuk sistem komputer
tertentu. Assembler adalah program yang menerjemahkan program yang ditulis dalam
bahasa assembly ke dalam bahasa mesin, yang dapat dieksekusi oleh komputer. Setiap
tipe komputer meiliki bahasa assembly yang berbeda, karena rancangan komputer
mempengaruhi instruksi yang dapat dieksekusi.
23
Bahasa assembly disebut bahasa level-bawah karena dalam struktur dan fungsi dekat
dengan bahasa mesin. Sebaliknya, bahasa tingkat tingggi seperti Pascal, Basic, Fortran
dan Cobol mempunyai perintah-perintah yang handal yang diterjemahkan ke dalam
berbagai instruksi mesin oleh kompiler.
Berbagai alasan mengapa kita mempelajari bahasa assembly. Salah satu alasan adalah
untuk mempelajari arsitektur komputer dan sistem operasi. Alasan lain adalah karena
kegunaan pemrograman tertentu sulit atau tidak mungkin dikerjakan oleh bahasa tingkat
tinggi. Contoh, kompunikasi langsung dengan sistem operasi komputer mungkin
deperlukan. Program grafik warna kecepatan tinggi mungkin harus ditulis menggunakan
memori minimum. Program khusus mungkin diperlukan sebagai penghubung antara
printer dengan komputer.
Sering juga perlu untuk menghilangkan keterbatasan bahasa tingkat tinggi, diluar
keperluan, menentukan aturan-aturan tentang apa yang dibolehkan dalam program.
Contoh, pascal tidak mengijinkan nilai karakter diberi nilai dalam variabel integerr.
Pemrogram yang berpengalaman akan menemukan cara untuk keluar dari batasan ini,
tapi dalam pelaksanaannya, membuat kode tidak dapat digunakan oleh sistem komputer
lain dan sulit dibaca. Bahasa assembly, sebaliknya, memiliki sangat sedikit batasan atau
aturan. Harga yang harus dibayar untuk keleluasaan itu adalah perlu menangani berbagai
kerumitan dalam pemrograman.
Biasanya ktia membuat subrutin dalam bahasa assembly dan memanggilnya dari
program bahasa tingkat tinggi. Keuntungan dapat diperoleh karena ketanya bahasa
tingkat tinggi, dengan menggunakan bahasa tingkat rendah dalam membuat aplikasi.
Subrutin bahasa assembly menangani operasi-operasi yang tidak tersedia dalam bahasa
tingkat tinggi. Misal kita menulis program aplikasi bisnis dalam Cobol untuk IBM-PC.
Kita memerlukan aplikasi untuk mengecek ruang bebas disk, membuat subdirektory,
menulis proteksi file, dan membuat window yang overlap, semuanya dalam satu
program.
Misal kompilator Cobol tidak dapat melakukan semuanya, maka kita dapat mebuat
subrutin bahasa assembly untuk menangani tugas-tugas tersebut.
Bahasa mesin
Sebelum lebih jauh secara rinci membahas bahasa assembly, mari kita lihat dalam
suatu prespektif. Komputer kenyataannya tidak mengerti bahasa assembly, dia hanya
mengikuti bahasa mesin. Bahasa mesin adalah bahasa yang dibangun oleh sejumlah
24
angka yang dapat diinterpretasikan oleh CPU komputer. CPU biasanya mempunyai
program kecil yang ditambahkan langsung ke dalam chip, disebut microcode.
Penerjemah microcode mengubah langsung instruksi-instruksi mesin ke dalam sinyal
perangkat keras.
25
1011000000000101
Deretan angka diatas ditulis dalam biner, sistem penomoran yang dibangun hanya
oleh angka 1 dan 0. Delapan bit pertama adalah kode operasi (opcode) yang
menunjukannya sebagai isntruksi yang memindahkan angka – 8 bit ke register AL.
Delapan bit kedua adalah operand. Instruksi secara keseluruhan memindahkan angka 5
ke dalam register AL.
Register adalah memori kecepatan tinggi yang berada di dalam CPU. Register
diidentifikasikan oleh nama 2 huruf, seperti AH, AL, atau AX.
Kumpulan instruksi (instruction set) CPU adalah sekumpulan instruksi mesin yang
dapat dieksekusi CPU. Untuk keluarga CPU intel, set instruksi adalah down-ward-
compatible, artinya bahwa instruksi yang bekerja pada prosesor level yang lebih rendah
akan bekerja juga pada prosesor yang lebih tinggi. Contoh instruksi MOV bekerja pada
8088 dan karena itu harus bekerja pula pada 80286. Tetapi terdapat instruksi yang lebih
maju dlam 80286 yang tidak dapat bekerja pada 8088.
Dulu, semua program ditulis dalam bahasa mesin. Hal ini sangat menyulitkan bagi
pemrogram baik dalam membacanya maupun menulisnya. Itulah sebabnya mengapa
dibuat assembler dan kompiler yang akan mengkonversi instruksi yang mudah dibaca,
dibuat dalam editor teks ke dalam bahasa mesin. Contoh instruksi diatas adalah : MOV
AL,5
Karena kita akan bersentuhan dengan komputer pada level mesin, kita perlu untuk
memeriksa isi memori dan register. Komputer yang ada saat ini adalah komputer biner
yang sistem bilangannya terdiri angka 1 dan 0 yang kita kenal dengan istilah logic
digital.
Bilangan biner
Komputer menyimpan semua instruksi dan data sebagai rangkaian digit biner, tanpa
perbedaan antara keduanya. Contoh, tiga huruf pertama alfabet akan disimpan dalam
IBM-PC sebagai :
010000010100001000011 = “ABC”
26
Pada saat yang sama, instruksi untuk menjumlahkan dua buah bilangan akan
disimpan di memori sebagai :
0000010000000101
Bit & Byte. Setiap digit dalam angka biner desebut bit. 8 buah bit desebut byte, yang
merupakan unit terkecil penyimpanan pada komputer saat ini. Setiap lokasi dalam
komputer menyimpan 1 byte, atau 8 bit. Tipe penyimpan yang lebih besar adalah word
yang panjangnya 16 bit (2 byte).
27
byte byte
10110101 1011010
word
Setiap sistem penuliasan angka mempunyai basis, yaitu jumlah maksimum nillai pada
suatu digit. Ini disebut radix atau basis.
Biner 2 01
Oktal 8 01234567
Desimal 10 0123456789
Heksadesimal 16 0123456789ABCDEF
Pada saat mengacu pada bilangan biner, oktal atau heksadesimal, sebuah huruf kecil
akan ditambahkan pada akhir setiap bilangan untuk menunjukan basisnya. Contoh
bilangan 45 heksadesimal akan ditulis sebagai 45h, 76 oktal akan ditulis 76o atau 76q,
dan biner 11010011 akan terlihat 11010011b.
Byte 8 0-225
Word 16 0-65,535
28
Double word 32 0-4,294,967,295
Karena berbagai keperluan mungkin kita perlu mengubah bilangan dari biner ke
desimal. Setiap posisi bit dalam bilangan biner adalah pangkat dari 2, seperti gambaran
berikut :
27 26 25 24 23 22 21 20
Nilai 128 64 32 16 8 4 2 1
Untuk mendapatkan nilai desimal dari sebuah bilangan biner, kita harus
menjumlahkan nilai setiap bit yang bernilai 1 dan memperoleh jumlah keseluruhannya.
Misalkan terdapat bilangan biner 00001001 :
29
0 0 0 0 1 0 0 1
Desimal 8 1 =9d
Bilangan heksadesimal
Bilangan biner yang banyak susah untuk dibaca, sehingga bilangan heksadsimal
biasanya sering digunakan untuk menggambarkan memori komputer atau instruksi.
Setiap digit bilangan heksadesimal mewakili 4 bit bilangan biner, dan 2 digit bilangan
heksadesimal mewakili satu byte. Pada contoh berikut terlihat bahwa bilangan biner
000101100000011110010100 digambarkan oleh bilangan heksadesimal 160794 :
1 6 0 7 9 4
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
30
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
31
Bilangan dapat dikonversi dari heksadesimal ke desimal dengan mengalikan masing-
masing digit dengan nilai posisinya. Misalnya bilangan 3BA4h, hasilnya
3 B A 4
Bilangan bertanda
Byte bertanda hanya menggunakan 7 bit untuk nilai sedangkan bit paling kiri
digunakan sebagai tanda. Bilangan mungkin positif atau negatif, jika tanda sama dengan
1 maka bilangan negatif sebaliknya jika tanda bernilai 0 maka bilangan positif :
Bit tanda
Ones complement. Untuk menghitung bilangan ones complement dari suatu bilangan
maka balikan seluruh nilai bitnya. Contoh, ones complement dari 11110000b adalah
00001111b.
32
Twos complement. Untuk menyimpan nilai negetif maka digunakan bilangan twos
complement. Twos complement diperoleh dengan menambah satu pada bilangan ones
complement.
11111010 -6
+ 1 tambah 1
00000110 +6
Nilai maksimum dan minimum. Karena nilai paling kiri pada bilangan bertanda
digunakan untuk tanda bilangan, maka ukuran bilangan akan berkurang, yang digunakan
hanya 7 bit sehingga nilai paling besar yang bisa dicapai adalah +127.
33
Tabel berikut menunjukan nilai maksimum dan minimum untuk byte, word dan double
word bertanda :
Penyimpan karakter
08 Ctrl – H BS Backspace
34
0C Ctrl – L FF Form feed
0F Ctrl – O SI Shift in
(substitusi)
35
1B Ctrl – [ ESC Escape
Standar kode ASCII hanya menggunakan 7-bit kode sedangkan nilai selebihnya yang
mungkin 7Fh. 8-bit lainya adalah pilihan, digunakan oleh IBM -PC untuk memperluas
kumpulan karakter. Nilai 80h – FFh menggambarkan simbol grafik dan karakter Yunani.
Nilai 0-1Fh adalah kode kendali untuk printer, komunikasi dan keluaran layar.
Semua karakter, termasuk bilangan dan huruf, dibuat unik pada kode ASCII.
Karakter A B C 1 2 3
Penyimpanan bilangan. Setiap huruf atau digit memerlukan 1 byte memori. Namun
ketika menyimpan bilangan, kita bisa lebih efisien, contoh, bilangan 123 dapat disimpan
dalam memoori sebagai satu byte yaitu 01111011b.
clc
36
inc ax
; hanya sebuah mnemonic
mov ax, bx
; operand tunggal
; dua operand
Setiap instruksi dapat diikuti oleh komentar, yang selalu diawali dengan titik koma
(;).
Operand, operand mungkin berupa register, variabel, lokasi memori atau nilai
immediate. Contoh :
10 (nilai immediate)
count (variabel)
AX (register)
[0200] (lokasi memori)
37
Contoh program
add ax, 20
; menambahkan nilai 20h terhadap register ax
mov sum, ax
; akhir program
Instruksi MOV memerintahkan CPU untuk memindahkan atau menyalin data, dari
operand sumber ke operand tujuan. Baris 1 memindahkan 5 ke dalam register AX. Baris
2 memindahkan 10 (hexa) ke dalam AX, membuatnya sama dengan 15. baris 3
menambahkan 20 ke AX, membuatnya sama dengan 35, dan baris 4 menyalin AX ke
dalam variabel dalam memori yang disebut SUM. Baris terakhir menghentikan program.
Perintah DEBUG untuk menyusun dan test program adalah sebagai berikut :
Perintah Komentar
Add ax, 10
Add ax, 20
38
(tekan Enter untuk mengakhiri assembly)
R Menampilkan register
Setelah isntruksi yang kedua akan diperoleh tampilan hasil sebagai berikut :
1. mov ax, 5 ax : 05
2. add ax, 10 ax : 10
3. add ax, 20 ax : 35
39
AX = 0015 BX = 0000 CX = 0000 DX = 0000 SP = FFEE
Konstanta
Konstanta adalah nilai yang diketahui dan dikalkulasikan pada saat penyusunan
program. Konstanta mungkin nomor atau karakter string. Dia tidak dapat diubah pada
saat program dijalankan.
Digit : 0-9
Karakter khusus :
40
?
_ , (koma)
$
“
:
&
.
%
[]
!
()
‘
<>
~
{}
|
+
/
-
=
/
#
*
^
41
Gambar 1.2. Kumpulan karakter assembly
Variabel, sebaliknya, adalah lokasi memori yang dapat berubah pada saat program
dijalankan. Contoh berikut adalah konstanta :
‘ABC’
2134
5*6
(1+2)/3
Integer. Integer dibangun oleh digit-digit angka tanpa titik desimal, diikuti oleh karakter
radix (d=desimal, h=hexa, q=octal, b=biner). Contoh :
Contoh Radix
11110000b Biner
200 Desimal
300d Desimal
4A6Bh Heksadesimal
2047q Oktal
2047o Oktal
Bilangan real : angka real mengandung digit, titik desimal tunggal, eksponent
(opsional) dan tanda awal (opsional). Sintaknya :
Contoh
2.3
42
+ 200.576 E +05
0.243526E –5
- 6.08 e3
Notasi sintak : dalam contoh sebelumnya dan pada contoh yang akan datang elemen
opsional akan ditutup dengan kurung siku. Tanda kurung besar mengidentifikasikan
pilihan yang diperlukan. Kata kunci yang diperlukan ditulis dalam huruf besar. Kata
huruf kecil miring adalah istilah-istilah yang telah didefinisikan sebelumnya seperti
identifier, operand dan register.
Karakter atau konstanta string : karakter ASCII tunggal atau string karakter yang
ditutup oleh tanda quotasi tunggal (‘’) atau ganda (“”), contoh :
“a”
‘B’
“Stack Overflow”
‘012#?%&’
43
Konsatanta karakter panjangnya 1 byte. Panjang sebuah string ditentukan oleh jumlah
karakter yang ada di dalamnya. Konstanta berikut panjangnya 5 byte :
‘ABCDE’
Apostrof (‘) ditutup diantara dua tanda quotasi (“”), atau tanda quotasi ganda (“”)
Pernyataan
[name][mnemonic][operand][; coment]
Kalimat harus ditulis pada baris tunggal dan tidak melebihi 128 kolom. Perintah, atau
pseudo op, adalah pernyataan yang berefek pada daftar program atau cara kode mesin
dibuat. Contoh, perintah DB memerintah assembler untuk membuat memori untuk
variabel bernama count dan memberi nilai awal 50.
Count DB 50
44
Isnturksi dieksekusi oleh mikroprosesor pada saat dijalankan. Instruksi dibagi ke
dalam tipe-tipe-tipe umum : kendali program, transfer data, aritmetik, logic dan I/O.
Instruksi-instruksi selalu diterjemahkan langsung ke dalam kode mesin oleh assembler.
Setiap satu instruksi bahasa assembly diterjemahkan langsung ke dalam satu instruksi
bahasa mesin.
Nama
Nama mengidentifikasikan label, variabel, simbol atau kata kunci. Nama mungkin
mengandung salah satu karakter berikut :
Karakter Penjelasan
A … Z, a … z Huruf
0…9 Angka
? Tanda tanya
_ Underscore
@ Tanda @
45
$ Tanda dollar
. Titik
Label. Jika nama tampil disamping instruksi program, ini disebut label. Label berfungsi
sebagai penanda kapan saja program mau meloncat atau looping dari satu lokasi ke
lokasi lain. Seperti contoh berikut dimana Label1 dan Label2 adalah label yang
mengidentifikasikan lokasi dalam program :
mov bx, 0
…
Label2 :
jmp label1
Kata kunci. Kata kunci atau reserved word selalu mempunyai arti yang sebelumnya
telah didefinisikan. Keyword mungkin instruksi atau direktif. Contohnya : MOV, PROC,
46
ADD, AX dan END. Kata kunci tidak dapat digunakan keluar dari konteknya atau
sebagai identifier, contoh penggunaan ADD sebagai label adalah tidak benar :
Kita lihat gambar 1.3. yang menampilkan pesan “Hello, world!” pada layar. Baris 1
mengandung perintah title; semua karakter sisanya pada baris 1 dianggap komentar,
sepreti pada baris 3.
Sebelum menyelesaikan lebih lanjut, kita jelaskan dulu segmen, yaitu bagian-bagian
yang membangun program.
47
Segmen code adalah bagian dimana instruksi program disimpan, segemen data adalah
bagian dimana variabel disimpan. Dan segmen stack dimana stack disimpan. Stack
adalah daftar dalam memori dimana program dijaga dalam variabel sementara, kembali
dari subrutin dan semacamnya.
Direktif dosseg menunjukan segmen standar untuk code, data dan segmen stack.
Perintah model small mengindikasikan bahwa program menggunakan microsoft
assembler memory “small”. Direktif stack menset 100 H (256) byte ruang stack untuk
program.
[2]
[4]
dosseg [5]
[8]
. data [9]
[11]
. code [12]
[16]
[20]
48
int 21h [22]
Direktif .code menandai awal segemen kode. Perintah .data menandai awal segmen
data, dimana variabel dideklarasikan.
Baris 14-15 menyalin alamat segmen data ke dalam reg DS. Instruksi MOV selalu
mempunyai 2 operand. Tujuan dan sumber.
49
Baris 17-19 menyebabkan string karakter dituliskan ke konsole. Mereka
melakukannya dengan memanggil fungsi DOS yang menampilkan string yang alamatnya
dalam register DX. Nomor fungsi diletakan dalam register AH.
Baris 21-22 adalah perintah untuk berhenti dan kembali ke DOS. Baris 23 adalah
akhir dari prosedur main dan baris 24 baris terakhir yang diassembly.
50
3.5. Komponen Mikrokomputer
Video Display
Kebanyakan PC yang dibuat sejak 1990 mempunya display warna VGA (Video
Graphic Array). Display VGA standar yang mempunyai resolusi 640 (horisontal) kali
480 (vertikal) piksel. Display VGA minimal memiliki 16 warna berbeda secara
bersamaan, dan ada juga sampai 256 warna.
Terdapat juga display Super VGA (800 x 600) dan Ectended-VGA (1024 x 800),
yang dapat meningkatkan pembacaan program yang berbasis grafik.
Display warna yang digunakan oleh PC terdahulu adalah CGA (Color Graphics
Adapter) dan EGA (Enhanced Graphic Adapter). Keduanya memiliki piksel yang lebih
sedikit pada setiap baris dan kolomnya. IBM-PC yang asli mempunyai tampilan
monokrom yang hanya dapat menampilkan karakter tekst ASCII (25 baris dan 80
kolom).
Keyboard
Drive disk
IBM-PC asli memiliki dua drive disk yaitu 5.25 inci berkapasitas 360 KB. Kemudian
IBM-AT membawa drive disk 1.2 MB yang dapat juga membaca HD 360 KB.
Kemudian drive disk 3.5 inci dikenalkan oleh komputer IBM seri PS/2, yang dapat
membaca dua format : 720 K dan 1.44 MB.
Unit sistem
51
mempunyai RAM 2 MB, 2 Floppy disk drive, 200 MB HD, 2 port parallel, 1 port serial
dan backup tape luar, modem internal dan mouse.
Board sistem (sering juga disebut motherboard) terhampar mendatar pada bagian
bawah unit sistem. Didalamnya terdapat banyak chip mikroprosesor, termasuk CPU,
RAM dan memory ROM, dan berbagai prosesor pendukung. Berikut ini adalah
komponen utama.
52
Prosesor pendukung, satu prosesor adalah chip pengendali interupt yang menangani
permintaan dari perangkat keras untuk mengintrupsi CPU. Chip pengendali DMA
menangani transfer data ke dan dari memori melalui bus data.
Bus mouse
controller
2400-baud processor
modem
200-watt
CP
U power
suplay
Intel 80387
math
32-bit coproscessor
memori
53
expansio
n
slot
Half-height
200-MB
HD
system board
Rom Bios. Ini disebut firmware (perangkat keras dengan program tambahan) bagian dari
sistem operasi PC. Biasanya ROM harus diganti karena untuk mendukung peripheral
baru.
RAM (Random Access Memory) : tempat meyimpan program dan data pada saat
program dijalankan. Khususnya, RAM disebut RAM dinamis karena isinya akan hilang
jika tidak menerima sinyal baru yang konstan dari CPU.
54
CMOS RAM. Informasi setup sistem disimpan disini, sehingga kita dapat
mengkonfigurasi komputer tanpa harus menggunakan switch mekanik
Slot tambahan. Terdapat beberapa tempat pada motherboard yang dapat digunakan
untuk menambah slot yang diperlukan seperti disk drive controller, tape drive
55
controller, video controller, network controller, I/O port, modem, mouse controller dll.
Power supply. Kotak besi yang menkonversi voltase 110 v AC dari sumber luar ke
dalam komputer.
Parallel port. Kebanyakan printer terhubung dengan komputer melalui port parallel.
Dengan parallel berarti 8 bit data dapat mengalir dari komputer ke printer secara
bersamaan.DOS mendukung 3 port parallel yaitu LPT1, LPT2 dan LPT3.
Serial port. Port serial digunakan untuk menghubungkan mouse, modem, atau
perangkat serial lainnya ke sistem komputer. Dengan tipe port seperti ini, data biner
dikirim satu per satu. DOS mendukung sampai 2 port serial yang disebut COM1 dan
COM2.
80186. 80186 merupakan pengembangan dari 8088, dengan 8 MHz clock dan instruksi
baru dengan tujuan untuk meningkatkan efesiensi prosesor.
80286. 80286 dikenalkan pertama kali pada komputer IBM-AT. RAM yang bisa diakses
sampai sebesar16 MB. Menggunakan 16-bit data dan mempunya kecepatan clock sampai
12-25 MHz.
80386. pada tahun 1985, Intel memperkenalkan prosesor 386 DX (dikenal sebagai
80386) yang mempunyai 32-register dan 32-bit bus data. Bersamaan dengannya
dikeluarkan juga co-prosesor matematika 80287 dan 80387.
80486. 80486 pada dasarnya sama dengan 80386 dengan tambahan co-prosesor
matematika built instruksi dan cache memori RAM kecepatan tinggi di dalamnya. Cache
56
RAM meningkatkan kinerja komputer dengan mengijinkan CPU untuk mengambil
instruksi dari memori kecepatan tinggi.
Kecocokan. Perlu dicatat bahwa setiap prosesor baru dikenalkan oleh Intel adalah akan
cocok dengan prosesor sebelumnya. Artinya perangkat lunak yang dibuat pada satu
prosesor akan bisa juga digunakan pada komputer yang lebih baru.
57
Mikrokomputer menggunakan CPU tunggal, seperti pada gambara 2.2. dalam
kenyataannya terdapat banyak chip yang mendukung PC, yang paling nampak adalah
80x87 co-prosesor matematika, tapi CPU masih menjadi pengatur utamanya. Tugas yang
paling mendasar yang ditangani oleh CPU adalah :
Mengeksekusi instruksi :
Register Data
Register Alamat
58
Bus Alamat Jalur keluaran
CPU dibagi menjadi dua bagian : Arithmeticl Logic Unit (ALU) dan Control Unit
(CU). ALU melaksanakan operasi aritmetik, logic, dan penggeseran, CU mengambil
data dan instruksi dan menerjemahkan kode (decode) alamat untuk ALU.
Seluruh sisi chip adalah pin yang ditancapkan ke dalam soket dalam board sistem,
menghubungkannya ke bagian sistem komputer yang lain. Register berada dalam CPU.
Ketika sesuatu diambil dari memori, alamatnya dihitung oleh unit kendali dan dikirm
melalui bus alamat. Nilai dari memori (baik instruksi atau data) dikirim balik ke CPU
melalui bus data. Clock melakukan sinkronisasi setiap operasi CPU.
Bus data. Bus adalah kabel parallel yang mengirimkan data antara berbagai bagian CPU.
Sinyal kendali dan bit data digunakan pada saat pengambilan word memori dan
menempatkannya dalam register. Bus dikatakan bidireksional jika data dapat ditransfer
dari dua arah.
Register. Berada dalam CPU yaitu area penyimpan kecepatan tinggi, yang langsung
terhubung ke unit kendali dan ALU. Karenanya, penggunaan register untuk eksekusi
lebih cepat daripada menggunakan memori konvensional. Kumpulan instruksi Intel
membutuhkan penggunaan setidaknya satu register untuk semua instruksi.
59
Clock. Setiap operasi yang dilakukan di CPU harus disinkronkan oleh clock. Unit waktu
paling dasar untuk instruksi mesin yang disebut siklus mesin (machine cycle). Instruksi
mesin dalam prosesor Intel umumnya dilaksanakan antara 3 dan 20 clock.
Register
Register adalah lingkungan kerja khusus dalam CPU, dirancang untuk diakses pada
kecepatan tinggi. Register memiliki panjang 16 bit. Pengaksesan 4 register data dibagi
dua bagian yaitu setengah bagian atasnya dan setengah bagian bawah.
Register data. Empat register, dinamai register data atau register tujuan umum,
digunakan untuk perhitungan aritmetik dan pemindahan data. Perhitungan setiap register
dapat dialamati sebagai nilai 16-bit atau 8 bit.
Contoh register AX adalah register 16-bit, 8 bit atasnya disebut AH dan 8 bit bawahnya
dinamai AL. Posisi bit selalu diberi nomor dari kanan ke kiri dimulai dari nol.
60
16-bit register AX
Register AH Register AL
Instruksi mungkin menunjuk 16 bit atau 18 bit register data dari daftar berikut :
AX BX CX DX
AH AL BH BL CH CL DH DL
61
Jika kita memindahkan 126Fh ke dalam AX maka AL akan berubah menjadi 6F h.
Tujuan Umum
AH AL
AX
Index
BH BL BP
BX
SP
62
SI
CH CL
CX
DI
Segmen
DH DL
CS
DX
SS
DS
Flag
ES
IP
63
AX (akumulator) : AX disebut register akumulator karena digunakan oleh CPU untuk
operasi aritemtik. Operasi-operasi lain juga sedkit lebih efisien dengan menggunakan
AX.
64
BX (basis). Seperti register tujuan umum lainnya, register BX dapat melaksanakan
operasi aritmetik dan perpindahan data dan BX memiliki kemampuan pengalamatan
khusus. Dia dapat menyimpan alamat memori yang menunjuk pada variabel lain.
Tiga register lain yang memiliki kemampuan ini adalah SI, DI dan BP.
Register segmen. CPU mengandung 4 register segmen, digunakan sebagai lokasi basis
untuk instruksi program, data dan stack. Register segmen sebagai berikut :
CS (code segment) : register CS menyimpan lokasi basis semua instruksi yang dapat
dieksekusi dalam program.
Istilah offset mengacu pada jarak variabel, label atau instruksi dari segmen basisnya.
Register index memprecepat pemrosesan string array dan struktur data lain yang
mengandung banyak elemen. Register-register index adalah :
SI (source index). Register ini mengambil nama dari instruksi epmindahan string,
yang mana string sumber ditunjuk oleh register SI. SI biasanya mengandung nilai
offset dari register DS.
65
IP (instruction pointer). Register IP selalu mengandung offset instruksi berikutnya
yang akan dieksekusi. CP dan IP digabung untuk melaksanakan alamat komplit
instruksi berikutnya yang akan dieksekusi.
SP (stack pointer). Register SP mengandung offset atau jarak dari awal stack ke
puncak stack. Register SS dan SP bersama melakukan alamat lengkap puncak stack.
Register tambahan 80386. prosesor 8038x/80486 mengandung register 32-bit (gb), yang
meningkatkan efisiensi program pada penggunaannya. Pada saat yang sama juga
80386/80486 dapat menggunakan register 16-bit yang sama seperti 8088.
66
Register flag . Register flag adalah register 16-bit khusus dengan posisi bit sendiri dibuat
untuk menunjukan status CPU atau hasil operasi aritmetik. Setiap posisi bit yang relevan
diberi nama, posisi lain tidak didefinisikan.
15 14 13 12 11 10 9 8 7 65 4 3 2 1 0
x x x x ODITSZxAxPxC
O = Overflow S = Sign
D = Directione Z = Zero
T = Trap P = Parity
Kita tidak harus mengingat setiap posisi flag karena terdapat instruksi khusus untuk
menguji dan manipulasi flag. Terdapat dua tipe dasar flag yaitu control flag dan status
flag.
31 ………………………….0
EBP
EAX
ESP
|-------AX -----|
31 ………………………….0 ESI
67
EDI
EBX
|-------BX -----|
31 ………………………….0
CS
SS
|-------CX -----|
DS
31 ………………………….0 ES
Data
EDX
FS
|-------DX -----| GS }
31 ………………………….0
EFLAG
|-----FLAG----|
68
31 ………………………….0
EIP
|------- IP ------|
Flag
Flag Kendali. Sebuah bit mungkin diset dalam flag oleh pemrogram untuk
mengendalikan operasi CPU. Terdapat flag Direction, Interrupt, dan Trap.
Flag Direction mengendalikan petunjuk asumsi yang digunakan oleh instruksi pemroses
string. Nilai flag 1 = up dan 0 = down. Pemrogram mengendalikan flag ini,
menggunakan instruksi STD dan CLD.
Flag Interrupt membuatnya mungkin untuk terjadinya interrupt dari eksternal. Interrupt
ini disebabkan oleh perangkat keras seperti keyboard, disk drive dan timer clock sistem.
Seringkali kita menonaktifkan interrupt pada saat melaksanakan operasi yang krritis
yang tidak dapat diinterrupt. Nilai flag 1 = aktif, dan 0 = tidak aktif. Flag ini
dikendalikan oleh perintah CLI dan STI.
Flag trap menentukan apakah CPU berhenti atau tidak setelah instruksi. Debugger telah
menset flag ini sehingga pemrogram dapat menelusuri setiap instruksi programnya satu
per satu. Nilai flag 1 = trap on dan 0 = trap off; flag dapat diset oleh instruksi INT 3.
Flag status. Bit-bit flag status menggambarkan keluaran operasi aritmetik dan logic
yang dilaksanakan oleh CPU. Terdapat flag Overflow, Sign, Zero, Auxiliary Carry,
Parity dan Carry.
Flag Carry diset ketika hasil operasi aritmetik tidak bertanda lebih besar dari ukuran
operand tujuan. Contoh, jika nilai 200 dan 56 dijumlahkan dan ditempatkan dalam
register 8-bit (seperti AL), hasilnya akan terlalu besar dan tidak muat ; maka flag Carry
akan diset. Nilai flag 1 = ada carry, 0 = tidak ada carry.
Flag Overflow diset pada saat hasil operasi aritmetik bertanda terlalu besar untuk
dimuat ke dalam operand tujuan. Nilai flag 1 = overflow dan 0 = tidak overflow.
69
Flag Sign diset ketika hasil operasi aritmetik dan logic menghasilkan nilai negatif.
Karena bilangan negatif selalu bernilai 1 pada bit posisi tertingginya, flag Sign selalu
merupakan salinan bit tanda operand tujuan. Nilai flag 1 = negatif, 0 = positif.
Flag Zero diset ketika hasil operasi aritmetik dan logic menghasilkan nilai 0. Flag
sering digunakan oleh instruksi jump dan loop, untuk dapat mencabang ke logasi bari
dalam program berdasarkkan perbandingan dua buah nilai. Nilai flag 1 = nol , 0 = bukan
nol.
Flag Auxiliary Carry diset ketika operasi menyebabkan carry dari bitn 3 ke bit 4 (atau
meminjam dari bit 4 ke bit 3) operand. Flag ini jarang digunakan oleh pemrogram, nilai
flag 1 = ada carry dan 0 = tidak ada carry.
Flag Parity menggambarkan jumlah bit dalam hasil operasi yang diset. Jika terdapat
bilangan genap maka Paritynya genap. Jika terdapat bilangan ganjil maka
70
paritinya ganjil. Flag ini digunakan oleh sistem operasi untuk memeriksa integritas
memori atau memeriksa kebenaran transmisi data oleh perangkat lunak komunikasi.
Stack
Stack adalah memori buffer khusus yang digunakan sebagai temporary yang
menyimpan alamat dan data. Stack terletak dalam segmen stack. Setiap lokasi 16-bit
pada stack ditunjuk oleh register SP, yang disebut stack pointer . Stack pointer
menyimpan alamat elemen data terakhir yang ditambahkan (di-push) ke dalam stack.
Nilai terkahir yang dimasukan ke dalam stack adalah nilai yang pertama diambil dari
stack pada saat di pop. Mekanisme ini diistilahkan dengan struktur LIFO (last in first
out), yang terakhir masuk keluar duluan.
Kita lihat stack program yang mengandung satu nilai, 0006, pada bagian sebelah kiri
ilustrasi dibawah ini. SP menunjuk pada nilai yang terakhir ditambahkan.
Sebelum Sesudah
0006 0006
SP
00A5
SP
71
(low memory) (low memory)
Push. Operasi PUSH menyalin nilai ke dalam stack. Ketika kita mendorong (push)
nilai ke dalam stack, seperti yang digambarkan oleh bagian kanan ilustrasi, SP dikurangi
nilainya sebelum nilai baru di push. Contoh berikut menggambarkan operasi push :
push ax
Instruksi tidak mengubah isi AX, tetapi hanya menyalinnya dan memasukannya ke
dalam stack.
72
Sejalan dengan penambahan nilai ke dalam stack maka stack semakin kearah bagian
bawah memori. Misalkan register BX dan CX bernilai 0001 dan 0002. instruksi berikut
menyalin nilainya ke dalam stack :
push bx
push cx
Sekarang nilai 0001 dan 0002 telah dimasukan ke dalam stack, akan terlihat sebagai
berikut :
Sesudah
(high memory)
0006
00A5
0001
SP
0002
(low memory) 73
Pop. Operasi POP mengeluarkan nilai dari stack dan menempatkannya dalam register
atau variabel. Sesudah nilai diambil dari stack, nilai stack pointer ditambah satu untuk
menunjuk pada nilai sebelumnya dalam stack. Misalkan kita akan mengeksekusi
instruksi berikut :
pop ax
Ilustrasi kondisi stack sebelum dan sesudah operasi ini adalah sebagai berikut :
Sebelum Sesudah
0006 0006
00A5 00A5
0001 0001 SP
74
Setelah operasi POP dilakukan, register AX mengandung nilai yang berasal dari
puncak stack (0002). Stack pointer pindah ke nilai stack sebelumnya yaitu 0001. Nilai
yang di ambil (0002) tidak lagi ada dalam stack.
1. Stack membuat daerah penyimpan sementara yang baik untuk register jika kita
ingin memelihara nilainya. Kita dapat menggunakan register dengan bebas dan
mengambil kembali nilainya dari stack setelah selesai operasinya.
2. Ketika subrutin dipanggil, program menyimpan nilai alamat kembali pada stack,
lokasi dimana program harus kembali setelah subrutin selesai.
3. Bahasa tingkat tinggi membuat darerah pada stack dalam subrutin yang disebut
frame stack. Ini berada pada daerah dimana variabel-variabel lokal dibuat pada
saat subrutin aktif.
75
Ketika CPU mengeksekusi instruksi untuk menambah nilai sebuah bilangan,
contohnya, mikroprogram harus melaksanakan operasi pada level yang lebih rendah :
menghitung alamat operand, menempatkan alamat operand bada bus alamat, menunggu
memori untuk merespon, transfer operand dari bus data ke ALU, dan seterusnya.
Untuk menyederhanakan, tedapat tiga operasi dasar yang dilaksanakan dalam CPU :
fetch, decode, dan execute. Setiap tahap dalam siklus instruksi memerlukan minimal satu
clock sistem, yang disebut siklur clock.
Fetch : Unit kendali mengambil instruksi, menyalinnya dari memori ke dalam CPU.
76
Execute : ALU mengeksekusi operasi dan mengirim operand hasil ke unit kendali,
dimana nantinya dikembalikan ke register dan memori.
Arsitektur Memori
Intel 8086 dapat mengakses memori 1,048,576 byte ( 1 MB) menggunakan alamat 20-bit
(00000 - FFFFF). Memori dibagi menjadi RAM dan ROM. RAM mulai pada lokasi
00000 sampai alamat BFFFF. ROM mulai lokasi C0000 sampai FFFFF.
Dibawah DOS, hanya 640 K pertama RAM yang disiapkan untuk program. Memori
sisanya diguankan oleh perangkat keras sistem seperti untuk display video dan
pengendali hard disk, atau oleh ROM BIOS.
Alamat (hex)
Software BIOS
77
B0000 MDA Text Buffer
C0000 Reserved
Inisialisasi DOS
1,024 byte Memori paling bawah (alamat 0000-003FF) mengandung tabel verktor
interrupt. Ini berisi alamat-alamat yang digunakan oleh CPU ketika memroses interrupt
perangkat keras dan perangkat lunak.
78
program aplikasi. Diatas kernel DOS terdapat buffer file dan file driver devaice yang
dapat dipasang (diambail dari CONFIG.SYS), diikuti oleh bagian resident
COMMAND.COM. Kemudian disebut pemroses perintah DOS : ini akan menintrrupt
perintah yang ditulis pada promt DOS dan memanggil dan mengesekusi program yang
disimpan dalam disk.
Video Display
Video display adalah dipetakan di memori. Dari pada mengirim setiap karakter video
melalui port ke video display, lebih efisien untuk memberikan setiap posisi layar pada
alamat memori yang terpisah. Ketika DOS menulis karakter ke layar, dia akan
memanggil subrutin dalam ROM BIOS, yang langsung menulis karakter ke alamat
memori video.
Lokasi memori alamat C0000h sampai FFFFFh disediakan untuk khusus penggunaan
ROM, termasuk pengeendali hard disk dan ROM BASIC.
ROM BIOS adalah bagian yang penting pada sistem operasi komputer. Di dalamnya
tertadapat diagnosa sistem, dan perangkat lunak konfigurasi, seperti halnya subrutin
input-output level bawah yang digunakan oleh DOS. BIOS dikodekan dalam chip
mikroprosesor dalam borad sistem, yang dibuat oleh fabrik.
79
80
3.8.Dasar- Dasar Bahasa Asembly
Variabel adalah nama simbolik untuk lokasi dalam memori dimana data disimpan.
Dalam bahasa assembly, variabel diidentifikasikan oleh label. Setiap label menunjukan
lokasi awal variabel. Kita katakan bahwa offset label adalah jarak dari awal segmen ke
awal variabel.
Label, tidak menunjukan berapa banyak byte memori yang dialokasikan untuk
bariabel. Contoh, jika kita mendeklarasikan array 4 karakter, lebel aList hanya
mengidentifikasikan offset karakter awal (A)
Disimpan sebagai
A B C D Isi
Deklarasi
Jadi jika huruf awal pada offset 0, maka selanjutnya pada offset 1, 2 dan seterusnya.
Kita menggunakan memori berdasarkan pada tipe yang didefinisikan sebelumnya :
81
Define byte (DB)
Perintah DB mengalokasikan memori untuk satu atau lebih nilai 8-bit. Diagram sintak
berrikut menunjukan bahwa nama adalah pilihan, dan hanya satu initial value yang
diperlukan. Jika diperlukan lebih dari satu maka dipisahkan dengan koma :
Initial value dapat berupa satu atau lebih nilai angka 8-bit, konstanta string, ekspresi
konstan atau tanda tanya (?). jika nilai bertanda maka rangenya –128 - + 127, jika tidak
bertanda rengenya 0-255. berikut contohnya :
82
char db ‘A’
signed1 db -128
signed2 db +127
unsigned1 db 0
unsigned2 db 255
Karakter dan integer adalah satu dan sama. Variabel berikut mengandung nilai yang
sama dan mungkin diproses dengan cara yang sama :
char db ‘A’
hex db 41h
dec db 65
bin db 01000001b
oct db 101q
Setiap konstanta mungkin menggunakan radix yang berbeda ketika daftar item
didefinisikan, dan angka, karakter dan konstanta string mungkin dicampur secara bebas.
Jika nomor heksadesimal mulai dengan huruf (A-F), maka nol diawal ditambahkan
untuk membedakannya dengan label. Dalam conoh ini, list1 dan list2 mempunyai isi
yang sama :
83
Isi variabel mungkin tidak didefinisikan, untuk hal seperti ini menggunakan operator
tanda tanya (?). atau ekspresi bilangan dapat memberi nilai awal sebuah variabel dengan
nilai yang dihitung pada saat diassembly. Contoh :
count db ?
ages db ?,?,?,?,?
rowsize db 10*20
Varibel dapat diberi nilai string dimana variabel merupakan alwam byte awal. Contoh
berikut menunjukan satu string diakhiri oleh byte nol (mengandung 0), dan string lain
dengan panjangnya ditulis pada awal byte :
84
pascal_string db 14, “Good afternoon”
Perintah DB adalah perintah yang digunakan untuk menyimpan satu atau lebih baris
teks. Variabel tunggal mungkin dilanjutkan untuk banyak baris tanpa perlu membuat
label untuk masing-masing baris. String berikut diakhiri oleh akhir baris dan byte null :
a_string_len db $- a_string
Perintah DW membuat tempat penyimpan untuk satu atau lebih word 16-bit. Sintaknya
adalah sebagai berikut
Initialvalue mungin berupa nilai bilangan 16-bit dari 0 – 65,535 (FFFFh). Jika
initialvalue bertanda, range yang dapat diterima adalah dari –32,768 (8000h) sampai
+32,767 (7FFFh). Konstanta karakter mungkin disimpan pada bagian bawah word.
Kontanta string yang besar yang mungkin disimpan dalam word panjangnya 2 karakter,
85
seperti ‘AB’. Mungkin juga membiarkan variabel tidak terinisiaslisasi dengan
menggunakan operator (?).
Penyimpanan : B6 2A
86
Berikut ini tambahan contoh untuk DW. Seperti pada DB, tanda tanya memerintahkan
assembeler untuk tidak menginisialisasi loakasi memori dengan nilai tertentu :
dw 1, 2, 3 ; mendefinisikan 3 word
Pointer. Offset variabel atau subrutin mungkin disimpan dalam variabel lain yang
disebut pointer. Pada contoh berikut, assembler menset P ke offest list. Kemudian PI
mengandung alamat P. Akhirnya, aProc mengandung offset label yang disebut
Clear_screen :
P dw list
P2 dw P
aProc dw clear_screen
Perintah DD membuat tempat penyimpan untuk satu atau lebih doublewords 32-bit.
87
[name] DD initialvalue [, initialvalue] …
Offset : 00 01 02 03
Nilai : 78 56 34 12
Anda dapat mendefinisikan satu atau leibh doubleword. Dalam contoh berikut,
far_pointer1 tidak diinsialisasi. Assembler langsung menginisialisasi far_pointer2
dengan 32-bit alamat segment offset subroutine1 :
88
signed_val dd -2147483648
far_pointer1 dd ?
far_pointer2 dd subroutine1
Operator DUP
Operator DUP hanya tampil sessudah perintah pengalokasian memori (DB, DW, DD,
DQ, DT). Dengan DUP, anda dapat mengulang satu atau lebih nilai ketika
mengalokasian memori. Ini khususnya berguna ketika pengalokasian ruang untuk tabel
atau array. Contoh-contoh berikut menginisialisasi tempat penyimpan dengan nilai
default :
dw 5 dup (?)
; 5 word, tidak diinisialisasi
dd 100h dup(?)
; 256 doublewordk (1024 byte)
Operator DUP mungkin juga bersarang. Contoh pertama yang membuat tempat
penyimpan yang mengandung 000XX000XX000XX000XX. Contoh kedua membuat
tabel word dua dimensi dengan 3 baris dan 4 kolom.
89
Pemeriksaan tipe. Ketika variabel dibuat dengan menggunakan DB, DW, DD atau
perintah definisi data yang lain, assembler memberinya atribut asal (byte, word,
doubleword) berdasarkan ukurnya. Tipe ini dicek ketika anda merujuk pada variabel
tersebut, dan akan terjadi kesalahan jika tipenya tidak sesuai. Contohnya, anda ingin
memindahkan byte paling rendah varibel 16-bit ke dalam register 8-bit. Instruksi MOV
berikut akan salah karena count bertipe word dan AL adalah byte :
….
count dw 20h
Pemeriksaan tipe seperti itu bagus karena membantu untuk menghindari kesalahan
logika. Jika diperlukan anda dapat menggunakan perintah LABEL untuk membuat nama
baru (dan tipe data) pada alamat yang sama. Sekarang variabel dapat diakses
menggunakan nama juga :
90
mov al, count_low
count dw 20h
Instruksi MOV
Karena MOV menyalin data dari satu operand ke operand lain, maka ini disebut instruksi
transfer data. Pada prosesor 8086 dan 80286, operandnya 8 atau 16 bit. Pada 80386 dan
80486, operand 32-bit juga mungkin digunakan. Sintaknya sebagai berikut :
Data benar-benar disalin sehingga operand sumber tidak berubah. Sumber mungkin
berupa nilai, register, atau operand memori. Tujuan mungkin berupa nilai, register atau
operand memori. Tujuan mungkin berupa register atau operand memori.
Operand Register. Pemindahan hanya melibatkan register, ini paling efisien. Satu
register berperan sebagai operand sumber, dan yang lainya, selain CS dan IP berperan
sebagai operand tujuan.
91
Operand langsung. Variabel mungkin salah satu (tapi tidak keduanya) operand dalam
instruksi MOV. Isi variabel mungkin sumber atau tujuan move.
mov al, bl
mov dx, cx
mov bl, 1
mov total, ax
count db 10
total dw 0
92
Operand mempunyai sedikit keterbatasan, yang berdasarkan rancangan fisik
pemroses dan set instruksinya. Berikut ini tidak diperbolehkan :
word_1 dw 1000h
word_2 dw 0
Offset
Anda dapat menambahkan offset pada operand memori. Dengan ini maka anda dapat
mengakses nilai data yang tidak mempunyai label. Misalkan kita punya daftar nomor 8-
bit yang disebut array. Kemudian array+1 adalah nama yang mengacu pada offset 1 byte
lebih dari array. Keduanya, array dan array+1 mempunyai offset yang dihitung oleh
assembler sebagai offset fixed dari permulaan segemen data. Alamat-alamat tersebut
digunakan untuk mengakses memori pada offset yang diberikan, seperti contoh berikut :
93
. data
. code
Ukuran atribut kedua operand harus sesuai. Dalam contoh berikut, int_1 hanya dapat
dipasangkan dengan register 16-bit. Juga, byte_1 hanya dapat dipasangkan dengan
register 8-bit :
94
. data
int_1 dw 1000h
byte_1 db 10h
. code
mov int_1, si
mov byte_1, dl
Operator PTR. Biasanya kita menggunakan operator PTR untuk mengetahui tipe
operand. Nama PTR tidak benar kalau dimaksudkan penggunaan pointer – ini bernar-
benar mengidentifikasikan atribut operand memori. Pada contoh berikut, WORD PTR
mengidentifikasikan count sebagai variabel berukuran word, dimana BYTE PTR
mengidentifikasikan var2 sebagai operand 8-bit.
Perintah XCHG
Perintah XCHG menukarkan isi dari dua register atau antara register dengan variabel.
Sintaknya sebagai berikut :
Dua operand mungkin register atau operand memori, selama satu operandnya register.
XCHG adalah cara yang efisien untuk menukarkan dua operand 8-bit atau 16-bit
karena tidak memerlukan register ketiga untuk menyimpan nilai sementara. Khususnya
dalam aplikasi pengurutan, instruksi ini mempunyai keuntungan karena kecepatannya.
95
Satu atau kedua operand mungkin register, atau register mungkin dikombinasikan denan
operand memori. Dua operand memori tidak boleh digunakan secara bersamaan. Contoh
berikut adalah contoh yang benar :
xchg ax, bx
xchg ah, al
xchg var1, bx
Operasi stack
Stack adalah buffer memori khusus yug digunakan untuk program aplikasi dan DOS.
Dua register berperan dalam stack : register SS (stack segment) mengandung lokasi basis
stack; register SP (stack pointer) mengandung alamat puncak stack, dimana nilai terakhir
dimasukan.
Beberapa istilah yang terdapat pada stack : operasi PUSH adalah meletakan nilai baru
pada stack dan mengurangi nilai stack pointer; stack bergerak kearah bawah
96
dalam memori setiap nilai baru dimasukan. Operai POP mengeluarkan data dari stack
dengan menyalin words kedalam register atau operand memori dan menambah nilai
stack pointer. Setiap inputan stack panjangnya 2 byte, jadi hanya operand 16-bit yang
mungkin dimasukan atau dikeluarkan.
DOS membagi stack dengan program aplikasi, jadi ruang memori yang cukup harus
disiapkan untuk menyediakan keduanya. Biasanya kita menggunakan 256 byte,
menggunakan perintah .STACK.
Instruksi PUSH. Instruksi PUSH mengurangi register SP dan menyalin isi register atau
operand memori 16-bit kedalam stack pada lokasi yang ditunjuk oleh SP. Hanya pada
prosesor 80286 atau yang lebih tinggi anda dapat memasukan nilai immediate. Berikut
ini contoh penggunaanya :
push ax
push memval
push 1000h
Instruksi PUSH bisa digunakan untuk menyimpan nilai register sementara, untuk
suatu saat diambil kembali.
Instruksi POP. Instruksi POP menyalin isi stack yang ditunjukan oleh SP ke dalam
register 16-bit atau variabel, dan menambah SP. Dua register, CS dan IP, tidak boleh
digunakan sebagai operand. Contoh POP seperti terlihat dibawah ini.
pop cx
pop memval
Menyiman dan mengambil kembali nilai register. Berbagai cara bisa dilakukan jika
sebuah register akan digunakan ulang. Pada contoh berikut, pemanggilan DOS (int 21h)
untuk menampilkan string pada layar. DX dan AX diasumsikan mempunyai nilai penting
yang harus disimpan kembali sesudah tampilan. Karena stack berstruktur LIFO (last in
first out) maka register yang terakhir disimpan pertama kali :
97
push ax
push dx
mov ah, 9
int 21h
pop dx
pop ax
98
PUSHF dan POPF. Instruksi PSUHF memasukan register flag ke dalam stack,
menjaganya agar tidak terjadi perubahan. Pada lain waktu, instruksi POPF dapat
digunakan untuk mengembalikan nilai flag. Contoh berikut, kita menyimpan flag
sebelum memanggil subrutin yang mungkin mengubah flag.
Hampir semua program komputer dapat melaksanaklan operasi aritmetik. Set intruksi
Intel mempunyai instruksi untuk aritmetik integer, menggunakan operand 8-bit dan 16-
bit. Operasi floating-point ditangani dalam salah satu dari ketiga cara berikut : 1. Chip
koprosesor matematika khusus (8087, 80287, 80387). 2. Rutin perangkat lunak yang
berfungsi sama dengan koprosesor, atau 3. Perangkat lunak yang mengkonversi nilai
floating-point ke integer, menghitung, dan kemudian mengkonversi bilangan kembali ke
floating-point.
Instruksi INC dan DEC menambah 1 atau mengurang 1 nilai dari suatu operand,
secara berurutan. Sintaknya sebagai berikut :
INC tujuan
DEC tujuan
Tujuan mungkin register 8-bit atau 16-bit atau operand memori. INC dan DEC lebih
cepat dari instruksi ADD dan SUB. Semua status flag dipengaruhi kecuali flag Carry.
Contohnya sebagai berikut :
inc al
dec bx
inc membyte
dec memword
99
inc word ptr memword
Instruksi ADD
Instruksi ADD menjumlahkan operand sumber 8 atau 16-bit ke operand tujuan pada
ukuran yang sama. Sintaknya sebagai berikut :
Sumber tidak diubah oleh operasi. Ukuran operand harus sesuai dan hanya satu
operand memori yang digunakan. Register segment tidak boleh jadi tujuan. Semua status
flag dipengaruhi. Contoh sebagai berikut :
add al, 1
add cl, al
100
add bx, 1000h
add var1, ax
add var1, 10
Instruksi SUB
Instruksi SUB mengurangkan operad sumber dari operand tujuan. Sintak SUB
sebagai berikut :
Ukuran kedua operand harus sesuai, dan hanya boleh satu operand memori. Register
segment tidak boleh jadi operand tujuan. Pada level bit, yang terjadi adalah operand
source dinegasikan kemudian ditambahkan ke tujuan. Contoh, 4-1 adalah 4+(-1).
Mengingat kembali bahwa notasi twos komplemen digunakan untuk menegasikan
bilangan, jadi –1 disimban sebagai 11111111b :
0 0 0 0 0 1 0 0 (4)
+ 1 1 1 1 1 1 1 1 (-1)
0 0 0 0 0 0 1 1 (3)
Penjumlahan ini menghasilkan carry pada bit yang paling tinggi (menset carry flag),
tetapi carry sendiri diabaikan ketika bekerja dengan bilangan bertanda.
sub al, 1
sub cl, al
101
sub var1, ax
sub var1, 10
Jika ADD atau SUB menghasilkan nilai nol, maka flag zero di set; jika hasil negatif
maka flag tanda di set. Pada contoh beirkut, baris 2 menghasilkan nilai nol dan baris 4
menghasilkan nilai –1 (FFFFh) .
mov ax, 10
sub ax, 10
mov bx, 1
sub bx, 2
Flag zero diset ketika hasil operasi aritmetik sama dengan nol. Catatan bahwa
INC dan DEC mempengaruhi flag zero tapi tidak mempengaruhi flag carry :
102
mov bl, 4Fh
inc ax
Keputusan kapan operand bertanda atau tidak bertanda seluruhnya diserahkan kepada
pemrogram. CPU memperbaharui flag Carry dan overflow untuk menangani dua
kemungkinan. Untuk alasan ini, kita perlu membahas dua tipe operasi secara terpisah.
Operasi tidak bertanda (unsigned). Untuk aritmetika tidak bertanda, kita hanya peduli
pada flag carry. Jika hasil operasi penjumlahan terlalu besar untuk operand tujuan, maka
flag carry diset. Contoh, penjumlahan 0FFh + 1 seharusnya sama dengan 100h, tapi
hanya dua digit paling bawah (00) yang pas untuk AL. maka operasi menset flag carry :
; AX = 0000, CF = 1
add al, 1
Dalam kontek ini, ADD adalah operasi 8-bit karena AL yang digunakan. Jika kita
ingin mendapatkan jawaban yang benar maka kita harus menambah 1 AX, membuatnya
menjadi operasi 16-bit.
; AX = 0100, CF = 0
add ax, 1
Situasai yang sama juga terjadi ketika kita mengurangkan operand yang lebih besar
(2) kepada yang lebih kecil (1). Flag carry memberitahu kita hasilnya tidak berguna.
; AX = 55FF, CF = 1
add ax, 2
103
Operasi bertanda. Flag overflow diset ketika operasi penjumlahan atau pengurangan
menghasilakan bilangan bertanda diluar range.
Contoh 1 :
10000000 AL = -128 ?, OF =1
Contoh 2 :
01111110 AL = + 126?, OF = 1
104
3.8.4. Mode Pengalamatan
Kumpulan instruksi Intel menyediakan cara yang bervariasi untuk menemukan lokasi
memori – cara-cara ini disebut mode pengalamatan. Dengan cara ini dapat memudahkan
pemrosesan list dan untuk mengacu struktur data yang komplek. Juga, kompile bahasa
tingkat tinggi memerlukannya untuk membuat instruksi mesin yang lebih sedikit ketika
set instruksi CPU menggunakan cara yang baik dalam pengacuan data.
Terdapat lima tipe mode pengalamatan, ditunujukan dalam tabel mode pengalamatan
dibawah. Dalam tabel, dispalecement berupa angka atau offset variabel. Effective
address operand mengacu pada offset (jarak) data dari awal segment. BX dan BP adalah
register basis, dan SI dan DI adalah register index. Setiap contoh berikut mengacu pada
isi memori pada alamat efektif.
Mode pengalamatan
[200]
[si] index
[di]
list [di]
[bp-2]
105
Base-indexed [bx + si] EA adalah penjumlahan
[bp-di] index
Operand register
Operand register mungkin berupa register 8 atau 16 bit. Secara umum, mode
pengalamatan register adalah paling efisien karena register adalah bagian dari CPU
106
dan tidak diperlukan pengaksesan memori. Beberap contoh menggunakan instruksi
mov ax, bx
mov cl, al
mov si, ax
Operand Immediate
Operand immediate adalah ekspresi konstan, seperti angka, karakter atau ekspresi
aritemetik. Assembler harus menentukan nilai operand immediate pada waktu
asssembly. Nilainya disisiplak langsung kedalam instruksi mesin. Contoh operand
immediate ditunjukan sebagai berikut. Contoh terkahir, (2+3)/5, adalah ekspresi yang
dievaluasi apda saat assembly.
10 8
‘A’ 8
‘AB’ 16
65535 16
(2+3)/5 8
Operand direct
Operand direct mengacu pada isi memori pada offset variabel. Assembler menjaga
nilai offset setiap label, membuatnya memungkinkan untuk menghitung alamat efektif
operand direct. Pada contoh ini, isi memori pada lokasi count dipindah ke AL :
107
; AL = 20
Oprator OFFSET. Ketika diperlukan pemindahan offset label ke dalam register atau
variabel, maka digunakan operator OFFSET. Karena assembler mengetahuai offset
settiap label sebagai program yang sedang diassembly, maka mudah untuk
menggantikan nilai offset kedalam isntruksi. Misalkan offset variabelaWord dalam
contoh berikut adalah 0200h; instruksi MOV akan memindahkan 200h ke dalam BX
langsung :
aWord dw 1234
Jika offset variabel ditempatkan dalam register basis atau index, maka register
menjadi pointer ke label. Untuk variabel yang mengandung element tunggal, maka
108
dia akan mempunyai nilai yang kecil, tetapi untuk daftar item, pointer mungkin akan
ditambah untuk menunjuk setiap elemen.
Contoh, jika kita membuat string dalam memori pada lokasi 0200h dan menset BX ke
offset string, kita dapat memproses elemen dalam string dengan menjumlahkan offsetnya
dengan BX. F terakhir berada pada offset 5 dalam contoh berikut :
CODE :
aString db “ABCDEFG”
…
; BX = 0200
mov bx, offset aString
Ilustrasi
0200
A B C D E F G … … …
aString [bx]
Default segmen. Jika BX, SI atau DI digunakan, alamat efektif adalah default offset
dari register DS (data segment). BP, disisi lain, merupakan offset dari register
SS (Stack segment). Umpamanya segment stack dan segment data berada pada lokasi
yang berbeda, dua pernyataan berikut akan menimbulkan efek yang berbeda :
109
mov dl, [bp]
Operannd basis dan indeks pada dasarnya sama : register ditambahkan pada
displacement untuk mendapatkan alamat efektif. Register yang dipakai harus SI, DI, BX
atau BP. Displacement adalah angka atau label yang offsetnya diketahui pada waktu
assembly. Notasi mungkin dalam bentuk yang sama :
110
Contoh. Jika kita membuat array bernilai byte yang disimpan dal memori logaksi
0200h dan menset BX dengan 5, maka BX akan menunjuk bialngan pada offset 5 ke
dalam array. Contoh berikut ini sebagai ilustrasi :
Code :
array db 2,16,4,22,13,19,42,64,44,88
mov bx, 5
ilustrasi :
02 16 04 22 13 19 42 … … …
Base-Indexed Operand
111
Teknik ini sering berguna untuk array dua dimensi, dimana BX dapat menunjuk
offset baris dan SI offset kolom. Contoh berikut, alamat efektif yang dibangun oleh
[bx+si] adalah 0157 :
CODE :
….
Ilustrasi
0150
10 20 30 40 50 60 70 80 90 … … …
112
[BX] [SI]
Dua buah register basis atau dua buah register index tidak dapat digabungkan, jadi
contoh berikut akan salah :
Dengan menggunakan array dua dimensi kita tidak harus lagi menset BX ke awal
array. Kita hanya menset BX pada offset baris kedua, relatif terhadap awal tabel. Ini
akan menyebabkan kode lebih sederhana :
CODE :
113
db B0, C0, D0, E0, F0
….
mov al, array[bx + si] ; mengambil nilai pada alamat efektif 0157
Ilustrasi
10 20 30 40 50 60 70 80 90 … … …
[BX] [SI]
114
Penjumlahan serangkaian bilangan
A 150
A 100
mov si, 2
mov [153], al
int 20
d 150, 153
115
3.8.5. Struktur Program
tlink hello;
link hello;
Segment. Program yang jalan di DOS dibagi kedalam tiga segmen utama, masing-
masingnya memiliki nilai tipe yang berbeda : segmen Code (ditunjukan oleh CS)
mengandung kode program, segmen Data (ditunjukan oleh DS) mengandung variabel,
segmen stack (ditunjukan oleh SS) mengandung stack program.
Setiap segmen ditunjukan oleh register segmen. Sebuah segmen mungkin hanya 1
paragraf (10h byte) dan paling besar 64 K bytes. Setiap segmen mengandung instruksi
atau data yang memiliki offset relatif terhadap register segmen (CS, DS, SS, atau ES).
Offset adalah jarak objek dari permulaan segmennya.
116
Title Program Hello world [1]
[2]
[4]
dosseg [5]
[8]
. data [9]
[11]
. code [12]
[16]
[20]
Segmen code. Segmen code adalah dimana instruksi mesin program berada. Register
CS mengandung alamat segmennya, dan IP menunjuk instruksi pertama yang akan
117
dieksekusi. Segmen data baisanya mengandung variabel program. Catatan bahwa tidak
ada register yang menunjukan segmen ini, karena itu pada setiap program EXE
dimasukan baris program berikut, untuk menset DS sebagai permulaan segmen data :
mov ds, ax
Segmen stack. Asegmen stack mengaikuti .MODEL, dan biasanya kita menyediakan 256
byte ruang stack. Register SS mengandung alamat segmen ini, dan SP mengacu pada
alamat berikutnya setalah akhir stack. Stack akan bertambah kearah bawah pada saat
suatu nilai dimasukan ke dalam stack. Jika SP mencapai 0000, maka stack berarti penuh.
Perintah. Perintah TITLE mendefinisikan judul prgram sampai 128 karakter. Perintah
DOSSEG memberitahu assembler untuk menempatkan segmen program dalam urutan
standar yang digunakan bahasa tingkat tinggi.
118
3.8.5.1.Model memori
Perintah .MODEL memilih standar model memori untuk program bahasa assembly.
Model memory mungkin sebagai blueprint standar atau konfigurasi, yang menentukan
bagaimana segmen dihubungkan bersama. Setiap model memori memiliki sekumpulan
batasan yang berbeda sebagai maksimum ruang yang tersedia untuk kode dan data.
Secara umum, pemilihan model memori berarti membuat pilihan antara kecepatan
eksekusi optimal dan fleksibilitas ukuran program. Model memori yang membatasi
semua data ke segmen tunggal 64 K, contohnya, menjamin bahwa semua alamat data
akan dekat, yaitu, 16-bit nilai. Data mungkin dapat diakses lebih cepat, karena alamat
16-bit mungkin diload dengan satu instruksi mesin. Disisi lain, model memori yang
mengijinkan kode untuk diperluas sampai 64 K berakibat bahwa beberapa subrutin akan
berada pada segmen yang berbeda. Ini berarti bahwa alamat 32-bit harus diload kedalam
CS dan register IP ketika subrutin dipanggil. Hal ini membutuhkan dua instruksi mesin.
Berbagai macam memori model didefinisikan oleh jumlah byte yang digunkan untuk
kode (instruksi) dan data (variabel). Tabel berikut menunjukan rangkuman perbedaan
antara berbagai tipe model :
Model Penjelasan
Huge Sama seperti model LARGE hanya array boleh lebih dari 64 K
Semua model keculai model Tiny menghasilkan program EXE. Model Tiny
menghasilkan program COM.
(20h byte)
120
Data 20020 2002
(10h byte)
(100h byte)
121
122
pop ds
pop dx
pop cx
pop bx
pop ax
jmp keluar
cek_pass2:
inc si
inc di
dec cx
jz cek_pass3
jmp cek_pass1
cek_pass3:
push cs
pop ds
mov ah,9
int 21h
pop di
pop si
pop es
123
pop ds
pop dx
pop cx
pop bx
pop ax
push ds
push es
push ax
push cx
mov ax,0
mov es,ax
push cs
pop ds
mov di,2fh*4
mov cx,4
cli
rep
movsb
124
sti
push cs
pop es
mov ah,49h
int 21h
pop cx
pop ax
pop es
pop ds
mov ax,4c00h
int 21h
start:
mov ah,9
int 21h
mov ax,352fh
int 21h
mov ofs2f,bx
mov seg2f,es
mov ax,252fh
int 21h
mov ah,9
int 21h
125
mov dx,offset start
int 27h
nama :
db 13,10
db 13,10,'$'
sukses:
db 13,10
db 13,10,'$'
code ends
end mulai
126
127
DAFTAR PUSTAKA
Irvine, Kip. [1993], Assembly Language for The IBM-PC, MacMillan, United State
of America.
128