Anda di halaman 1dari 67

BAHASA RAKITAN

VARIABEL

Nama
NPM
Kelas

: Angga Ferdian
: 15111103
: Sistem Informasi ( C )

SISTEM INFORMASI
UNIVERSITAS BATAM

VARIABEL
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)
Jadi jika huruf awal pada offset 0, maka selanjutnya pada offset 1, 2 dan seterusnya. Kita
menggunakan memori berdasarkan pada tipe yang didefinisikan sebelumnya :

DB

Deskripsi
Define byte

Byte
1

Atribut
Byte

DW

Define word

Word

DD

Define doubleword

Doubleword

DF, DP

Define far pointer

Far pointer

DQ

Define quadword

Quadword

DT

Define tenbytes

10

Tenbyte

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 :
[name] DB initialvalue [, initialvalue]
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 0255. berikut contohnya :
ABCD

1234
Deklarasi
AList db ABCD
Isi
Offset
Disimpan sebagai
char db A
signed1 db -128
signed2 db +127
unsigned1 db 0
unsigned2 db 255
Nilai banyak (multiple values), daftar bilangan-bilangan 8-bit mungkin dikelompokan dibawah
satu label, dengan nilai dipisahkan oleh koma. Pada contoh berikut, kita umpamakan bahwa
daftar disimpan pada offset 0000. Ini artinya bahwa 10 disimpan pada offset 0000, 20 pada offset
0001, 30 pada offset 0002, dan 40 pada offset 0003.
List db 10, 20, 30, 40
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 :

list1 db 10, 32, 41h, 00100010b


list2 db 0Ah, 20h, A, 22h
Isi variabel mungkin tidak didefinisikan, untuk hal seperti ini menggunakan operator tanda tanya
(?). atau ekspresi bilangan dapat memberi nilai awal sebuah variable 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 :
c_string db Good afternoon, 0
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_long_string db This is a long string, that
db clearly is going to take
db several lines to store in an
db assembly language program, 0Dh, 0Ah, 0
Assembler dapat menghitung panjang string secara otomatis. Dengan menggunakan karakter $
yang menyimpan lokasi sekarang nilai counter. Pada contoh berikut

a_string_len diset awal 16 :


a_string db This is a string
a_string_len db $- a_string
Define Word (DW)
Perintah DW membuat tempat penyimpan untuk satu atau lebih word 16-bit. Sintaknya adalah
sebagai berikut
[name] DW initialvalue [, initialvalue]
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, seperti AB. Mungkin juga membiarkan
variabel tidak terinisiaslisasi dengan menggunakan operator (?).
Pembalikan Format Penyimapan (Reversed Storage Format). Assembler membalik byte
dalam nilai word ketiak disimpan dalam memori. Byte paling bawah berada pada alamat paling
bawah. Ketika variabel dipindahkan ke register 16-bit, CPU akan membalik kembali byte
tersebut. Ini ditunjukan pada ilustrasi berikut, dimana 2AB6h disimpan dalam memori sebagai
B6 2A.
Deklarasi data : value1 dw 2AB6h
Penyimpanan : B6 2A
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

dw 0,65535

; bilangan tidak bertanda tertendah dan tertinggi

dw 32768, +32767

; bilangan bertanda terendah dan tertinggi

dw 256*2

; ekspresi kontanta

dw 4000h

; notasi heksadesimal

dw 1111000011110000b

; notasi biner

dw 1000h, 4096, AB, 0

; notasi campuran

dw ?

; word tunggal tidak diinsialisasi

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 :
list dw 256, 257, 258, 259
P dw list
P2 dw P
aProc dw clear_screen

Define Doubleword (DD)


Perintah DD membuat tempat penyimpan untuk satu atau lebih doublewords 32-bit. Sintaknya
sebagai berikut :
[name] DD initialvalue [, initialvalue]
Initialvalue dapat berupa nomor biner sampai 0FFFFFFFFh, alamat segmet-offset, 4-byte
bilangan real, atau bilangan real desimal. Byte-byter dalam variabel doubleword disimpan
dengan urutan terbalik, sehingga digit yang paling berarti disimpan pada alamat paling bawah.
Contoh, nilai 12345678h akan disimpan dalam memori sebagai:
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 :

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 :
db 20 dup (0)

; 20 byte semuanya sama dengan nol

db 20 dup (?)

; 20 byte tidak diinisialisasi

db 4 dup (ABC)

; 12 byte : ABCABCABCABC

db 4096 dup (0)

; 4096-byte , semuanya nol

dw 5 dup (1000h)

; 5 word, masing-masing sama dengan nol

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.
aTable db 4 dup ( 3 dup(0), 2 dup(X))
aMatrix dw 3 dup (4 dup(0))
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 variable 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 :
mov al, count ; error : ukuran operand harus cocok

.
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 :
mov al, count_low
mov cx, count

count_low label byte


count dw 20h
INSTRUKSI TRANSFER DATA
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 :
MOV tujuan, sumber
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.
Operand immediate. Nilai langsung (konstanta integer) mungkin dipindahkan ke suatu register
(kecuali register segemen atau IP) dan mungkin dipindahkan ke memori. Kesalahan umum
disebabkan nilai lebih besar daripada operand tujuan.
Operand langsung. Variabel mungkin salah satu (tapi tidak keduanya) operand dalam instruksi
MOV. Isi variabel mungkin sumber atau tujuan move. Contoh MOV dengan semua tiga tipe
seperti berikut :
mov al, bl
mov dx, cx
mov bl, 1
mov bx, 8FE2h
mov al, count
mov total, ax
mov total, 1000h

count db 10
total dw 0
Operand mempunyai sedikit keterbatasan, yang berdasarkan rancangan fisik pemroses dan set
instruksinya. Berikut ini tidak diperbolehkan :
- CS atau IP sebagai register tujuan
- Memindahkan data immediate ke register segmen
- Memindahkan dari register segmen ke register segmen
- Perbedaan ukuran antara operand sumber dan tujuan
- Nilai immediate sebagai tujuan
- Perpinadahan dari memori ke memori
Contoh pemindahan yang tidak diperbolehkan :

mov ip, ax

; ip sebagai tujuan

mov ds, 1000h

; immediate ke segmen

mov ds, es

; segmen ke segmen

mov al, bx

; ukuran operan tidak sama

mov si, al

; ukuran operan tidak sama

mov word_1, al

; ukuran operan tidak sama

mov 1000h, ax

; immediate sebagai tujuan

mov word_2, word_1 ; memori ke memori

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 :
. data
array db 10, 20, 30, 40, 50
. code
mov al, array ; isi = 10
mov dl, array+1 ; isi = 20
mov dh, array+4 ; isi = 50

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 :
. data
int_1 dw 1000h
byte_1 db 10h
. code
mov ax, int_1
mov int_1, si
mov al, byte_1
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.
mov word ptr count, 10 mov byte ptr var2, 5
Perintah XCHG
Perintah XCHG menukarkan isi dari dua register atau antara register dengan variabel. Sintaknya
sebagai berikut :
XCHG op1, op2
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. 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

BAHASA RAKITAN
INTERRUPT

Nama
NPM
Kelas

: Angga Ferdian
: 15111103
: Sistem Informasi ( C )

SISTEM INFORMASI
UNIVERSITAS BATAM

INTERRUPT
PENGERTIAN INTERRUPT
Interupsi adalah suatu permintaan khusus kepada mikroposesor untuk melakukan sesuatu. Bila
terjadi interupsi, maka komputer akan menghentikan dahulu apa yang sedang dikerjakannya dan
melakukan apa yang diminta oleh yang menginterupsi.
Pada IBM PC dan kompatibelnya disediakan 256 buah interupsi yang diberi nomor 0 sampai
255. Nomor interupsi 0 sampai 1Fh disediakan oleh ROM BIOS, yaitu suatu IC didalam
komputer yang mengatur operasi dasar komputer. Jadi bila terjadi interupsi dengan nomor 0-1Fh,
maka secara default komputer akan beralih menuju ROM BIOS dan melaksanakan program yang
terdapat disana. Program yang melayani suatu interupsi dinamakan Interrupt Handler.
VEKTOR INTERUPSI
Setiap interrupt akan mengeksekusi interrupt handlernya masing-masing berdasarkan nomornya.
Sedangkan alamat dari masing- masing interupt handler
tercatat di memori dalam bentuk array yang besar elemennya masing-masing 4 byte. Keempat
byte ini dibagi lagi yaitu 2 byte pertama berisi kode offset sedangkan 2 byte berikutnya berisi
kode segmen dari alamat interupt handler yang bersangkutan. Jadi besarnya array itu adalah 256
elemen dengan ukuran elemen masing-masing 4 byte. Total keseluruhan memori yang dipakai
adalah sebesar 1024 byte (256 x 4 = 1024) atau 1 KB dan disimpan dalam lokasi memori absolut
0000h sampai 3FFh. Array sebesar 1 KB ini disebut Interupt Vector Table (Table Vektor
Interupsi). Nilai-nilai yang terkandung pada Interupt Vector Table ini tidak akan sama di satu
komputer dengan yang lainnya.
Interupt yang berjumlah 256 buah ini dibagi lagi ke dalam 2 macam yaitu:
- Interupt 00h - 1Fh (0 - 31) adalah interrupt BIOS dan standar di semua komputer baik yang
menggunakan sistem operasi DOS atau bukan. Lokasi Interupt Vector Table-nya ada di alamat
absolut 0000h-007Fh.
- Interupt 20h - FFh (32 - 255) adalah interrupt DOS. Interrupt ini hanya ada pada komputer yang
menggunakan sistem operasi DOS dan Interupt Handler-nya diload ke memori oleh DOS pada
saat DOS digunakan. Lokasi Interupt Vector Tablenya ada di alamat absolut 07Fh-3FFh.

Nomor
Interrupt
*00h
*01h
*02h
*03h
04h
05h
06h
07h
08h
09h
0Ah
0Bh
0Ch
0Dh
0Eh
0Fh

Nama
Interrupt
Divide By Zero
Single Step
Non MaskableInt(NMI)
Break point
Arithmatic Overflow
Print Screen
Reserved
Reserved
Clock Tick(Timer)
Keyboard
I/O Channel Action
COM 1 (serial 1)
COM 2 (serial 2)
Fixed Disk
Diskette
LPT 1 (Parallel 1)

Nomor
Interrupt
10h
11h
12h
13h
14h
15h
16h
17h
18h
19h
1Ah
1Bh
1Ch
1Dh
1Eh
1Fh

Nama
Interrupt
Video Service
Equipment Check
Memory Size
Disk Service
Communication (RS-232)
Cassette Service
Keyboard Service
Printer Service
ROM Basic
Bootstrap Loader
BIOS time & date
Control Break
Timer Tick
Video Initialization
Disk Parameters
Graphics Char

Gambar 3.1. BIOS Interrupt


Interrupt ini telah dipastikan kegunaannya oleh sistem untuk keperluan yang khusus , tidak boleh
dirubah oleh pemrogram seperti yang lainnya.

DEVIDE BY ZERO : Jika terjadi pembagian dengan nol maka proses akan segera
dihentikan.

SINGLE STEP : Untuk melaksanakan / mengeksekusi intruksi satu persatu.

NMI : Pelayanan terhadap NMI (Non Maskable Interrupt) yaitu interupsi yang tak dapat
dicegah.

BREAK POINT : Jika suatu program menyebabkan overflow flag menjadi 1 maka
interrupt ini akan melayani pencegahannya dan memberi tanda error.

Nomor
Interrupt
20h
21h
22h

Nama
Interrupt
Terminate Program
DOS Function Services
Terminate Code

23h
24h
25h
26h
27h

Ctrl-Break Code
Critical Error Handler
Absolute Disk Read
Absolute Disk Write
Terminate But Stay Resident
Gambar 3.2. DOS Interrupt

Didalam pemrograman dengan bahasa assembler kita akan banyak sekali menggunakan interupsi
untuk menyelesaikan suatu tugas.
Interrupt dapat dipandang sebagai sejumlah fungsi. Fungsi-fungsi ini memudahkan
pemrograman, bahkan menulis kode untuk mencetak karakter, kita dapat dengan mudah
memanggil

interrupt dan fungsi tersebut akan melakukannya untuk kita. Ada juga fungsi

interrupt yang berkerja dengan disk drive dan hardware lainnya. Pada saat kita memanggil suatu
fungsi hal itu dinamakan software interrupts. Interrupt juga dipicu oleh hardware lainnya, ini
disebut hardware interrupts. Saat ini kita akan membahas pada software interrupts. Untuk
membuat software interrupt ada suatu instruksi yaitu INT, dengan sintak:
INT value Dimana value berupa angka antara 0 - 255 (atau 0 - 0FFh), umumnya kita
menggunakan angka hexadecimal. Anda mungkin berpikir bahwa hanya ada 256 function, tapi
sebenarnya kurang tepat . Tiap interrupt masih punya subfunction. Untuk Menentuka suatu subfunction Register AH harus diset sebelum pemanggilan interrupt.
Tiap interrupt mempunyai hingga 256 sub-function (jadi kita dapatkan 256 * 256 = 65536
function). Secara umum register AH yang digunakan, tetapi suatu saat register lain juga dipakai.
Pada umumnya register lain digunakan untuk mengirim parameter dan data ke sub-function.
Contoh berikut ini menggunakan INT 10h sub-function 0Eh untuk mencetak pesan "Hello!".
Fungsi ini menampilkan karakter di layar, keuntunganThis functions displays a character on the
screen.

ORG

100h ; directive utk membuat file .com.

; sub-function yang dipakai

; tidak memodifikasi register AH pd saat


; return, jadi hanya di set sekali saja.
MOV AH, 0Eh

; pilih sub-function.

; INT 10h / 0Eh sub-function


; menerima kode ASCII sbg
;Karakter yg akan dicetak
;di register AL .
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV AL, 'H'
INT 10h
MOV AL, 'e'
INT 10h

; ASCII code: 72

; cetak!
; ASCII code: 101
; cetak!

BAHASA RAKITAN
MAKRO

Nama
NPM
Kelas

: Angga Ferdian
: 15111103
: Sistem Informasi ( C )

SISTEM INFORMASI
UNIVERSITAS BATAM

MAKRO
1. Makro kurang lebih mirip dengan Prosedur, hanya saja Makro lebih canggih, karena bisa
menggunakan Parameter.
2. Makro tidak menggunakan perintah CALL seperti pada Procedure
3. Format penulisan Makro :
nama_macro MACRO [P1/P2]
<Program>
ENDM
4. Penggunaan Parameter ([P1/P2]) boleh ada, boleh tidak, boleh lebih dari 1 dengan
dipisahkan tanda koma.
5. Jika Makro menggunakan Label, yang dipanggil lebih dari 1, maka HARUS
menggunakan kata kunci LOCAL
Contoh Program dengan MAKRO :
; DEKLARASI MAKRO
; terdiri dari 3 makro, yaitu cetak_kar, cetak_kal, cetak_angka
;cetak karakter
cetak_kar macro kar
local ulang
mov cx, 2
mov ah, 02
mov dl, kar
ulang:
int 21h
loop ulang
endm
;cetak kalimat
cetak_kal macro kal
mov ah,09h
lea dx,kal
int 21h
endm

;cetak angka
cetak_angka macro angka
local proses, ulang, cetak
proses:
mov ax,angka ;ax =1234
mov bx,10 ;bx=10
xor cx,cx ;cx=0
ulang:
xor dx,dx
div bx

;dx=ax/bx

push dx ;push untuk menyimpan data ke dalam steck


inc cx
cmp ax,0
jne ulang
cetak:
pop dx

;pop untuk mengambil data dari stack

add dl,'0' ;ubah angka menjadi code ascii


mov ah,02h
int 21h
loop cetak
endm
; SELESAI deklarasi MAKRO
;mulai penggunaan makro
.model small
.code
org 100h
proses: jmp x
k db ' STMIK EL RAHMA YOGYAKARTA $'
a dw 2009
x:

cetak_kar 'w'
cetak_kal k
cetak_angka a
int 20h
end proses
PUSTAKA MAKRO
1.

Bila banyak menggunakan makro, maka dapat dijadikan 1 menjadi suatu Pustaka Makro

2. Pustaka Makro adalah suatu File dengan Extensi .MCR yang berisi beberapa atau banyak
Makro
3. File .MCR tadi harus 1 folder dengan file .ASM yang memanggilnya.
4. Untuk memanggilnya menggunakan kata kunci INCLUDE nama_file_pustaka.MCR
Contoh program dengan Pustaka Makro.
a. Buat file pustaka makronya dengan nama "pustaka.mcr", isinya :
;cetak karakter
cetak_kar macro kar
local ulang
mov cx, 2
mov ah, 02
mov dl, kar
ulang:
int 21h
loop ulang
endm
;cetak kalimat
cetak_kal macro kal
mov ah,09h
lea dx,kal

int 21h
endm
;cetak angka
cetak_angka macro angka
local proses, ulang, cetak
proses:
mov ax,angka ;ax =1234
mov bx,10 ;bx=10
xor cx,cx ;cx=0
ulang:
xor dx,dx
div bx

;dx=ax/bx

push dx ;push untuk menyimpan data ke dalam steck


inc cx
cmp ax,0
jne ulang
cetak:
pop dx

;pop untuk mengambil data dari stack

add dl,'0' ;ubah angka menjadi code ascii


mov ah,02h
int 21h
loop cetak
endm
b. Buat file .ASMnya, tempat memanggil file pustaka.MCR tadi, dengan nama "pakai.asm".
isinya :
include pustaka.mcr ; pemanggilan file pustaka makro __BAHAYA __Sesuaikan nama file mcrnya
.model small
.code
org 100h
proses: jmp x

k db ' STMIK EL RAHMA YOGYAKARTA $'


a dw 2009
x:
cetak_kar 'w'
cetak_kal k
cetak_angka a
int 20h
end proses
Hasil jadinya yang pustaka makro :

Nggih, sampun, cekap semanten kemawon share bahan kuliah Pemrograman Bahasa Rakitan
dari Saya : Nur Akhwan @ Teknik Informatika Angkatan 2009 STMIK El Rahma Yogyakarta

BAHASA RAKITAN
STACK

Nama
NPM
Kelas

: Angga Ferdian
: 15111103
: Sistem Informasi ( C )

SISTEM INFORMASI
UNIVERSITAS BATAM

STACK
Secara harfiah stack berarti tumpukan, yaitu bagian memori yang digunakan untuk menyimpan
nilai suatu register untuk sementara, membentuk tumpukan nilai. Stack dapat dibayangkan
sebagai tabung memanjang (seperti tabung penyimpan koin). Sedangkan nilai suatu register
dapat dibayangkan sebagai koin yang dapat dimasukkan dalam tabung tersebut. Jika ada data
yang disimpan maka data-data tersebut akan bergeser ke arah memori rendah, dan akan bergeser
kembali ke arah memori tinggi bila data yang disimpan telah diambil.
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 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 (int21h) untuk
menampilkan string pada layar. DX dan AX diasumsikan mempunya nilai penting yang harus
disimpan kembali sesudah tampilan. Karena stack berstruktur LIFO (last in first out) maka
register yang terakhir disimpan pertama kali :
push ax
push dx
mov ah, 9
mov dx offset message
int 21h
pop dx
pop ax

message db Ini adalah pesan.$


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.

BAHASA RAKITAN
OPERASI ARITMATIKA

Nama
NPM
Kelas

: Angga Ferdian
: 15111103
: Sistem Informasi ( C )

SISTEM INFORMASI
UNIVERSITAS BATAM

OPERASI ARITMATIKA
Penjumlahan
Syntax :
ADD destination, source
ADC destination, source
INC destination
Perintah ADD akan menjumlahkan nilai pada destination dan source tanpa menggunakan carry
(ADD), dimana hasil yang didapat akan ditaruh pada destination. Dalam bahasa pascal
pernyataan ini sama dengan pernyataan destination := destination + source. Daya
tampung destination dan source harus sama misalnya register al (8 bit) dan ah (8 bit), ax (16
bit) dan bx (16 bit). Perhatikan contoh berikut, nilai register ah sekarang menjadi $10 :
mov ah, $5;
mov al, $8;
add ah, al

Perintah ADC digunakan untuk menangani penjumlahan dengan hasil yang melebihi daya
tampung destinationyaitu dengan menggunakan carry (ADD), dalam bahasa pascal sama
dengan pernyataan destination := destination + source + carry. Misalnya register ax (daya
tampung 16 bit) diberi nilai $1234 dan bx (16 bit) diberi nilai $F221, penjumlahan kedua register
ini adalah $10455. Jadi ada bit ke 17 padahal daya tampung register bx hanya 16 bit,
penyelesaiannya adalah nilai bx = $0455 dengan carry flag = 1.
Perintah INC digunakan untuk operasi penjumlahan dengan nilai 1. Jadi nilai pada destination
akan ditambah 1, seperti perintah destination := destination + 1 dalam bahasa Pascal.
Pengurangan
Syntax
SUB destination, source
SBB destination, source
DEC destination

Perintah SUB untuk mengurangkan 2 operand tanpa carry flag. Hasilnya diletakkan pada
destination dalam bahasa pasca sama dengan pernyataan destination := destination source.
Untuk mengenolkan suatu register, kurangkan dengan dirinya sendiri seperti contoh berikut ini.
Pertama kali register ax bernilai $5, kemudian nilai register tersebut dikurangi dengan dirinya
sendiri sehingga terakhir nilai register ax adalah 0.
mov ax, $15;
mov bx, $10;
sub ax, bx;
sub ax, ax;
Perintah SBB mengurangkan nilai destination dengan nilai source kemudian dikurangi lagi
dengan carry flag (destination := destination source carry flag). Dan perintah DEC untuk
mengurangi nilai destination dengan 1.
Perkalian
Syntax

MUL source
Digunakan untuk mengalikan data pada accumulator dengan suatu operand dan hasilnya diletak
pada register source. Register source dapat berupa suatu register 8 bit (misal bl, bh, dan
sebagainya), register 16 bit (bx, dx, dan sebagainya) atau suatu variabel.

Pembagian
Syntax

DIV source
Operasi aritmatika ini pada dasarnya sama dengan operasi perkalian
Instruksi Aritmetik
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
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 byte ptr membyte
dec memword
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 :
ADD tujuan, 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
add bx, 1000h

add var1, ax
add dx, var1
add var1, 10

Instruksi SUB
Instruksi SUB mengurangkan operad sumber dari operand tujuan. Sintak SUB sebagai berikut :
SUB tujuan, sumber 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. Contoh SUB digunakan dengan
berbagai tipe operand seperti berikut :
sub al, 1
sub cl, al
sub bx, 1000h
sub var1, ax
sub dx, var1
sub var1, 10
Flag yang dipengaruhi oleh ADD dan SUB
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 :
mov bl, 4Fh
add bl, 0B1h
mov ax, 0FFFFh
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 :
mov ax, 00FFh
add al, 1 ; AX = 0000, CF = 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.
mov ax, 00FFh
add ax, 1 ; AX = 0100, CF = 0
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.
mov ax, 5501h
add ax, 2 ; AX = 55FF, CF = 1

Operasi bertanda. Flag overflow diset ketika operasi penjumlahan atau pengurangan
menghasilakan bilangan bertanda diluar range.
Contoh 1 :
mov al, + 126
add al, 2

01111110
+ 00000010
10000000 AL = -128 ?, OF =1

Contoh 2 :
mov al, -128
sub al, 2

10000000
- 00000010
01111110 AL = + 126?, OF = 1

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

Mode Contoh Keterangan


MODE
Direct

Register Indirect

CONTOH
Op1

KETERANGAN
Alamat efektif adalah

bytelist

displacement

[200]
[bx]

EA adalah isi basis atau index

[si]
Based or Indexed

[di]
list [bx]

EA adalah penjumlahan

[si+list]

register basis atau index

[bp+4]

dengan displacement

list [di]
[bp-2]
[bx + si]

EA adalah penjumlahan

[bx][di]

register basis dan register

[bp-di]

index

Base-indexed with

[bx+si+2]

EA adalah penjumlahan

displacement

list[bx+si]

register basis, register

list [bx][si]

index dan dispalcement

Base-indexed

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 dan tidak diperlukan
pengaksesan memori. Beberap contoh menggunakan instruksi
MOV sebagai berikut :
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.
Contoh Ukruan (bit)
CONTOH

UKURAN(BI
T)

10

AB

16

65535

16

(2+3)/5

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 :
count db 20

mov al, count ; 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

mov bx, offset aWord

Operand tidak langsung


Jika offset variabel ditempatkan dalam register basis atau index, maka register menjadi pointer
ke label. Untuk variabel yang mengandung element tunggal, maka 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

mov bx, offset aString ; BX = 0200


add bx, 5 ; BX = 0205
mov dl, [bx] ; DL = F
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 :
mov dl, [si]
mov dl, [bp]
Based dan Indexed Operand
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 :
Register ditambahkan ke offset :
mov dx, array[bx]

mov dx, [di+array]


mov dx, [array+si]
Register ditambahkan ke konstanta :
mov ax, [bp+2]
mov dl, [di-2]
mov dx, 2[si]
ABCDEFG
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
mov al, array[bx]
ilustrasi :
array [BX] (BX = 0005)
Base-Indexed Operand
Alamat efektif operand dibangun oleh penggabungan register basis dengan register index.
Misalkan BX = 2002h dan SI = 6; instruksi berikut akan menghitung alamat efektif 208h :
mov al, [bx +si]
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 :
array db 10, 20, 30, 40, 50
db 60, 70, 80, 90, A0

db B0, C0, D0, E0, F0


.
mov bx, offset array ; menunjuk pada array (0150)
add bx, 5 ; memilih baris kedua
mov si, 2 ; memilih kolom ke tiga
mov al, [bx + si] ; mengambil nilai pada alamat efektif 0157
Dua buah register basis atau dua buah register index tidak dapat digabungkan, jadi
contoh berikut akan salah :
mov dl, [bp-bx] ; salah : dua register basis
mov ax, [si-di] ; salah : dua register index
Base-Indexed dengan displacement
Alamat efektif operand dibangun dengan menggabungkan register basis, register
index dan displacement. Contohnya sebagai berikut :
mov dx, array [bx] [si]
mov ax, [bx + si + array]
add dl, [bx + si + 3]
sub cx, array [bp+si]
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 :
array db 10, 20, 30, 40, 50
db 60, 70, 80, 90, A0
db B0, C0, D0, E0, F0
.
mov bx, 5 ; memilih baris kedua
mov si, 2 ; memilih kolom ke tiga
mov al, array[bx + si] ; mengambil nilai pada alamat efektif 0157
Ilustrasi
0150 0155 0157

[BX] [SI]
10 20 30 40 50 60 70 80 90
Penjumlahan serangkaian bilangan
Contoh program berikut menunjukan bagaimana bermacam-macam mode pengalamatan bisa
digunakan ketika mengakses elemen sebuah array. Array berada pada offset 150, dan hasil
penjumlahan akan disimpan pada offset 153. Program berikut mungkin diassemble dan
dijanlankan dalam Debug.
A 150
db 10, 20, 30, 0
A 100
mov bx, 150
mov si, 2
mov al, [bx]
add al, [bx+1]
add al, [bx + si]
mov [153], al
int 20
t
.
.
d 150, 153

BAHASA RAKITAN
ALUR PROGRAM

Nama
NPM
Kelas

: Angga Ferdian
: 15111103
: Sistem Informasi ( C )

SISTEM INFORMASI
UNIVERSITAS BATAM

ALUR PROGRAM
Struktur Program
Gambar 3.1. menunjukan program HELLO.ASM. Perintah untuk mengassembly dan link
program ini ditunjukan oleh turbo assembler dan microsoft assembler sebagai berikut :
Turbo Assembler MASM
tasm hello; masm hello;
tlink hello; link hello;
Segment. Program yang jalan di DOS dibagi kedalam tiga segmen utama, masingmasingnya
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.
Title Program Hello world
[1]
[2]
; program ini menampilkan pesan Hello, world

[3]
[4]

dosseg

[5]

. model small

[6]

. stack 100h

[7]
[8]

. data

[9]

. hello_message db Hello, world !, 0dh, 0ah, $

[10]
[11]

. code

[12]

main proc

[13]

mov ax, @data

[14]

mov ds, ax

[15]
[16]

mov ah, 9

[17]

mov dx, offset hello_message

[18]

int 21h

[19]
[20]

mov ax, 4000h

[21]

int 21h

[22]

main endp

[23]

endp main

[24]
Gambar 3.1. Contoh program Hello

Segmen code. Segmen code adalah dimana instruksi mesin program berada. Register CS
mengandung alamat segmennya, dan IP menunjuk instruksi pertama yang akan 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 ax, @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.

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
Tiny

PENJELASAN
Kode dan data digabung harus <= 64 K

Small

Kode <= 64 K, data <= 64 K

Medium

Data <= 64 K, kode ukuran sembarang

Compact

Kode <=64 K, data ukuran sembarang

Large

Keduanya lebih besar dari 64 K

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.
Peta file program Hello :
Start

Stop

Length

Name

Class

00000H

00010H

00011H

_TEXT

CODE

00020H

0002FH

00010H

_DATA

DATA

00030H

0012FH

00100H

STACK

STACK

Diagram segmen :
Misalkan program diload pada alamat absolut 20000 :
Segmen Alamat

Absolut

Nilai Register Segmen

Code

20000

2000

(20h byte)
Data

20020

2002

(10h byte)
Stack

20030

2003

(100h byte)

Program yang dapat dieksekusi (Executable program). Untuk mendapatkan gambaran yang lebih
baik tentang program yang dapat dieksekusi setelah diisikan oleh DOS ke dalam memori,
lihatlah gambar 3.2. yaitu prgram HELLO.ASM, yang diassemble dan dilink ke bentuk
HELLO.EXE. Linker dapat menghasilkan file MAP, yang dengan baik menunjukan offset dan
ukuran segmen program. Dalam contoh ini, segmen kode adalah 11h bytee, segemen datanya
10h byte, dan panjang stacknya 100h byte.

Penyandian
Penyandian (coding) program atau mengikuti kelengkapan diagram alir, mempersiapkan
perintah-perintah dalam bentuk tersandi. Langkah-langkah logis yang dinyatakan dalam diagram
alir diterjemahkan ke dalam perintah-perintah komputer. Pilihan bahasa tergantung atas

kerumitan masalah dan kapasitas dan sumber program yang digunakan. Bahasa pemrograman
rakitan disusun dari beberapa bagian, yaitu: judul (kulit program), deklarasi dan data, tubuh
program, komentar dan penutup. Semuanya itu terdiri dari apa yang disebut dengan pengarah
(directive), operator, simbol pilihan, mnemonik, register, dan lainnya. Misalnya,
Program 1.1: PERTAMA.ASM
;----------------------------------------------------; Nama Berkas : 11.ASM
; Pemrogram : Mahyuddin
; ---------------------------------------------------%Title Judul Tidak dirakit
IDEAL
DOSSEG
MODEL TINY
; ----- Ditempatkan tetapan di sini
DATASEG
; ----- Deklarasi peubah dan nilainya
Pesan DB Program pertama dengan bahasa
DB rakitan,13,10,$
; ----- Penentuan alamat awal model berkas
CODESEG
ORG 100h ; Alamat berkas bermarga .COM
; ----- Tubuh program atau subrutin
Mulai : MOV AH,09h
MOV DX,OFFSET Pesan
INT 21h ; Sela tampilan Sistem Operasi
; (DOS dan Window)
; ----- Akhir sebuah program
INT 20h ; Sela SO kembali ke SO
END Mulai

Judul (header) akan memulai suatu program bahasa rakitan. Pada judul dijumpai bermacam abaaba (command) dan pengarah, tidak satupun darinya akan dirakit menjadi bahasa mesin, tetapi
fungsinya secara umum akan sesuai dengan bagaimana suatu program dihasilkan. Pada program
di atas, %Title menyatakan maksud dari program sebagai judul, pengarah MODEL TINY dan
pengarah IDEAL menyatakan modus program yang dipilih yang hanya berlaku pada Turbo
Assembler (TASM), dan dapat diubah menjadi Program 1.2
Program 1.2: PERTAMB.ASM
;----------------------------------------------------; Nama Berkas : 12.ASM
; Pemrogram : Mahyuddin
; ---------------------------------------------------PengSandi SEGMENT
ASSUME CS:PengSandi
ORG 100h
Mulai : JMP Awal
Pesan DB Program pertama
DB dengan bahasa rakitan,13,10,$
Awal : MOV AH,09h
MOV DX,OFFSET Pesan
INT 21h
INT 20h
PengSandi ENDS
END Mulai
Fungsi beberapa pengarah yang digunakan pada program di atas dapat dijelaskan sebagai
berikut:
ORG singkatan dari originate untuk menentukan alamat awal suatu blok dalam program baik
untuk blok data maupun blok perintah.
ASSUME untuk memberikan aba-aba bagi pengarah untuk menggunakan penggal tertentu
sebagai penggal data atau program.

SEGMENT untuk menyatakan awal penggal.


ENDS atau END untuk menunjukkan akhir suatu penggal atau akhir program.
DB singkatan dari define byte digunakan untuk menyatakan panjang data dan harganya.
OFFSET untuk menerangkan bahwa yang dimaksudkan adalah pergeseran alamat suatu peubah
terhadap penggalnya.
Tubuh program dapat saja mengandungi label, mnemonik, operan, komentar dan pengarah.
Secara umum susunan perintah pada tubuh program dalam satu baris adalah sebagai berikut:
Label : MNEMONIK Operan ; Komentar
Label akan dinyatakan apabila baris program akan menjadi tempat lompatan dari baris program
lain. Label dituliskan sebagaimana adanya suatu pengenal dan dapat dinyatakan sesuai maksud
lompatan dan diakhiri dengan titik dua (:).
Mnemonik adalah sekumpulan huruf yang terdiri dari dua sampai lebih, singkatan yang
mewakili dari maksud perintah dinyatakan, misalnya MOV disingkat dari MOVE yang berarti
pemindahan nilai, yaitu MOV AH,09h berarti AH=09h. Mnemonik dapat saja memerlukan
operan, dan kadangkala lebih dari dua operan. Mnemonik berlaku khusus, seperti INT disingkat
dari interrupt yang diartikan sela, merupakan pemanggilan perangkat keras yang dihasilkan
secara eksternal dari sinyal perangkat keras atau pemanggilan perangkat lunak secara internal
dari pelaksanaan perintah atau dengan peristiwa lain. INT berasal dari BIOS (basic
input-output system) dan SO (sistem operasi), misalnya INT 21h dan INT 20h berasal dari SO
yang masing-masing berfungsi dan mempunyai ketentutan sendiri, yaitu
INT 21h Layanan 09h
Fungsi : Untuk menampilkan untaian karakter yang
diakhiri $.
Masukan : AH = 09h
DS:DX = alamat untaian
INT 20h
Fungsi : Untuk kembali ke prompt sistem operasi
Masukan : Operan mengandungi nilai-nilai dengan mana pengoperasian perintah mnemonik didahulukan.
Sedikit saja perintah yang tidak memerlukan operan, dan kebanyakan pula perintah memerlukan

dua operan. Jika demikian, operan pertama disebut tujuan (destination), sedangkan operan kedua
(jika ada) disebut sumber (source) .Operan mengambil banyak bentuk yang berbeda sesuai
dengan kebutuhan dan syarat-syarat penggunaannya, misalnya MOV memerlukan dua operan,
yaitu AH dan 09h, yang tidak lain berupa salah satu register dan data (nilai) langsung. Sedangkan
MOV DX, OFFSET Pesan berlaku cara berbeda, dengan mana operan sumber menggunakan
pengarah untuk menunjuk alamat untaian karakter yang diwakili oleh peubah Pesan. Register
adalah salah satu operan, yang berasal dari sistem komputer. Untuk melakukan suatu pekerjaan,
pengolah mikro (microprocessor) menggunakan register sebagai tempat pengolahannya. Register
dikategorikan menjadi dua bagian: register serbaguna dan register khusus. Register serba guna
(general-puspose register) atau disingkat register umum terdiri dari empat register yaitu
accumulator(A), base (B), count (C), dan data (D), dan masing-masing diberiakhiran X bila
berukuran 16-bit: AX, BX, CX dan DX. Kemudian, masing-masing juga dapat dibagi menjadi
dua, sebagai register 8-bit, dan diberi akhiran H dan L untuk menandakan high dan low: AH, AL,
BH, BL, CH, CL, DH dan DL. Untuk pengolah Intel yang terbaru dengan menggunakan register
32-bit masing-masing diberi tambahan awalan E (extended): EAX, EBX, ECX dan EDX.
Register khusus terdiri dari register cetakan (offset) yang berfungsi menunjuk alamat memori per
16-bit atau 32-bit, register penggal (segment) yang berfungsi menunjuk alamat blok memori, dan
register bendera yang bertugas khusus sebagai rujukan kendali beberapa pernyataan. Semua ini
akan dibicarakan secara lebih luas pada bab-bab berikutnya.
Komentar digunakan untuk menjelaskan maksud sekumpulan baris program atau satu baris
program, setiap komentar didahului oleh tanda titik koma (;). Komentar tidak dirakit ke dalam
bahasa mesin.
Merakit Program
Setelah penyandian dilaksanakan dengan baik, selanjutnya dilakukan perakitan program dengan
menggunakan perakit (assembler). Perakit mengambil berkas program sandi sumber dan
menerjemahkan perintah-perintahnya ke dalam sandi mesin. Program ini membuka berkasberkas program sumber dari tempat penyimpanan di mana disimpankan berkas tersebut.
Misalnya, dengan menggunakan Turbo Assembler, merakit dapat dilakukan dengan cara:
TASM [nama berkas program sumber]

Misalnya, untuk berkas 12.ASM dapat dirakit dengan mengetikkan


TASM 12 [Enter].
Pada suguhan pertama melalui program sumber, perakit menentukan pemindahan butir-butir data
dinamai, cetakan label, dan sebagainya, kemudian menempatkan informasi ini dalam suatu tabel
simbol. Pada suguhan kedua melalui program sumber, perakit menghasilkan sandi binari untuk
setiap perintah dan menyisipkan cetakan-cetakan, dan sebagainya, yang dihitung selama suguhan
pertama, lihat senarai sandi berikut setelah dirakit dengan TASM/l12, di mana l mewakili list.
Turbo Assembler Version 2.0 08/23/06 17:55:08
Page 1
12.ASM
1 0000 PengSandi SEGMENT
2 ASSUME
CS:PengSandi
3 ORG 100h
4 0100 EB 29 90 Mulai : JMP Awal
5 0103 50 72 6F 67 72 61 6D+ Pesan DB
'Program pertama dengan bahasa rakitan',13,10,'$'
6 20 70 65 72 74 61 6D+
7 61 20 64 65 6E 67 61+
8 6E 20 62 61 68 61 73+
9 61 20 72 61 6B 69 74+
10 61 6E 0D 0A 24
11 012B B4 09 Awal : MOV AH,09h
12 012D BA 0103r MOV DX,OFFSET
Pesan
13 0130 CD 21 INT 21h
14 0132 CD 20 INT 20h
15 0134 PengSandi ENDS
16 END Mulai

Turbo Assembler Version 2.0 08/23/06 17:55:08


Page 2
Symbol Table
Symbol Name Type Value
??DATE Text "08/23/06"
??FILENAME Text "12 "
??TIME Text "17:55:08"
??VERSION Number 0200
@CPU Text 0101H
@CURSEG Text PENGSANDI
@FILENAME Text 12
@WORDSIZE Text 2
AWAL Near PENGSANDI:012B
MULAI Near PENGSANDI:0100
PESAN Byte PENGSANDI:0103
Groups & Segments Bit Size Align Combine Class
PENGSANDI 16 0134 Para none
Perakit menghasilkan dua berkas di tempat penyimpanan. Berkas pertama disebut berkas tujuan,
diberi ekstensi .OBJ. Berkas ini mengandung sandi-sandi binari untuk perintah-perintah dan
informasi tentang alamat-alamat perintah, karena sandi itu menjadi tujuan dari proses
penerjemahan, yang berarti diberlakukan sebagai sandi tujuan (object code). Penerjemah juga
menghasilkan daftar program sumber dan menyatakan gangguan tentang aturan tatabahasa dari
bahasa pemrogarman yang digunakan. Setelah itu, dilakukan penjalinan dengan alat yang diberi
nama penjalin (linker), yaitu suatu program yang digunakan untuk menggabungkan beberapa
berkas tujuan ke dalam satu berkas tujuan yang besar. Bila program yang ditulis cukup besar,
biasanya melalui pembagian modul-modul. Penjalin menghasilkan berkas jalinan yang
mengandung sandi-sandi binari untuk semua modul yang digabungkan. Penjalin juga
menghasilkan berkas pemetaan jalinan yang mengandung informasi alamat tentang berkasberkas yang dijalin. Akan tetapi, cualihanya alamat-alamat relatif yang dimulai dengan nol.
Bentuk program dikatakan dapat dilokasikan kembali sebab dapat ditempatkan di mana saja di

dalam memori untuk dijalankan. Untuk SO, penjalin menghasilkan berkas berekstensi .EXE.
Misalnya, penjalin Turbo Assembler dapat dijalankan dengan
Gambar 1.1 Cara merakit
TLINK [nama berkas tujuan]
Misalnya, untuk berkas 12.OBJ dapat dirakit dengan mengetikkan
TLINK 12 [Enter].
Selain itu, pada beberapa perakit memerlukan penempat (locator), yang dulunya disediakan oleh
SO. Penempat adalah program yang digunakan untuk menugaskan alamat khusus dari mana
penggal sandi tujuan dimuat ke dalam memori. Namun, dengan menggunakan perakit Turbo
Assembler, penjalin yang disertakan juga bertugas sebagai penempat. Jadi, untuk program
sumber yang bangun strukturnya menggunakan satu penggal (64 Kbyte), dapat langsung dijalin
dengan cara TASM/t [nama berkas tujuan], t menunjukkan pengaktifan penempat, sehingga hasil
jalinan berkas menjadi berekstensi .COM. Tata cara merakit program bahasa rakitan dengan
Turbo Assembler, dapat dilihat pada diagram alir, Gambar 1.1.

BAHASA RAKITAN
EMULATOR 8086

Nama
NPM
Kelas

: Angga Ferdian
: 15111103
: Sistem Informasi ( C )

SISTEM INFORMASI
UNIVERSITAS BATAM

EMULATOR 8086
Emu8086 merupakan aplikasi emulator bagi pemrograman bahasa assembler atau
mikrokontroler. Dengan menggunakan aplikasi emulator, kita dapat mensimulasikan apakah
program kontrol hardware yang kita buat sudah benar atau masih salah.
Dalam emu8086 terdapat beberapa menu, antara lain:
1. Emulate : untuk menjalankan emulator kode program yang kita buat
2. Compile : untuk membuat (compile) binary executable file atau ekstensi .com atau
.exe dari kode program.
3. Run : menjalankan aplikasi dari emulator yang dihasilkan (execute).
4. Single Step : Menjalankan aplikasi dengan cara tracing (diproses perbaris kode program).
Memulai pemrograman bahasa Assembler terdiri dari beberapa kode operasi code (op code) dan
pseudo ops. Bentuk instruksinya adalah op code diikuti operand. Opcode adalah perintah yang
akan dilaksanakan, sedangkan operand dapat terdiri dari sumber (source) dan tujuan
(destination).
Misal : MOV AX,BX
Opcode dari contoh di atas adalah MOV, sedangkan operandnya adalah AX, BX. Maksud kode di
atas adalah perintah untuk menyalin data yang ada di register BX (source operand) ke register
AX (destination operand).
Pseucode operation (pseudo ops) adalah perintah kepada assembler untuk memberitahukan apa
yang harus dilakukan terhadap data, percabangan bersyarat, perintah macro dan listing. Beberapa
pseudo ops yang sering dijumpai adalah sebagai berikut :

Untuk menjalankan Klik compile kemudian pilih lokasi di mana file executable akan
disimpan, lalu single step, sehingga hasilnya akan terlihat seperti dibawah ini :

Contoh operasi penambahan dan pengurangan bahasa assembler menggunakan "Emu8086"

Untuk menjalankan Klik compile kemudian pilih lokasi di mana file executable akan
disimpan, lalu single step, atau bisa langsung "Run" sehingga hasilnya akan terlihat seperti
dibawah ini :

Hasil program penambahan dan pengurangan

PUSTAKA FUNSI UMUM (EMU8086.INC )


Untuk membuat pemrogram lebih mudah, ada beberapa fungsi
umum yang dapat disertakan dalam program kita. Untuk
membuat program kita menggunakan fungsi yang didefinisikan
di file lainnya kita harus menggunakan directive INCLUDE
diikuti dengan nama file yang diacu. Kompiler secara otomatis
mencari file tersebut di folder yang sama dimana file sumber
diletakkan, dan jika tidak ditemukan maka compiler akan
mencari di forlder Inc. Saat ini anda mungkin belum faham
benar isi dari emu8086.inc (terletak di folder Inc), tapi tidak
masalah, karena yang kita butuhkan adalah apa yang dapat
dikerjakannya. Untuk memakai fungsi dalam emu8086.inc kita
harus memiliki baris dalam kode didalam source seperti ini :
include 'emu8086.inc'
emu8086.inc mendefinisikan banyak makro sebagai berikut:
PUTC char - macro dengan 1 paramete, mencetak sebuah
karakter ASCII pada posisi kursor sekarang.
GOTOXY col, row - macro dengan 2 parameters,
mengeset posisi kursor.
PRINT string - macro dengan 1 parameter, mencetak
sebuah string.
PRINTN string - macro dengan 1 parameter, mencetak
string. Sama dengan PRINT tetapi otomatis menambahkan
"carriage return" di akhir string.
CURSOROFF mematikan kursor text.
CURSORON - menghidupkan kursor text.
Untuk menggunakan makro diatas, tinggal ketik nama makro
dan parameter yang dibutuhkan , contohnya:
include emu8086.inc
ORG 100h
PRINT 'Hello World!'
GOTOXY 10, 5
PUTC 65
PUTC 'B'
RET
END

; 65 - kode ASCII untuk 'A'


; return ke OS.
; directive utk menghentikan
; kompiler.

Saat compiler memproses kode kita, dia mencari file


emu8086.inc untuk makro yang dideklarasikan dan
menggantikannya dengan nama makro dalam kode yang
sebenarnya. Umumnya makro relative bagian yang kecil dalam

kode, keseringan menggunakan makro menyebabkan


pengeksekusian kita menjadi semakin besar (penggunaan
procedure lebih baik untuk optimasi ukuran ).
emu8086.inc juga mendefinisikan procedure sebagai berikut :
PRINT_STRING procedure utnuk mencetak null
terminated string pada posisi kursor saat ini , menerima
alamat string di dalam register DS:SI. Untuk
menggunakannya deklarasikan:
DEFINE_PRINT_STRING sebelum directive END.
PTHIS procedure untuk mencetak null terminated string
pada posisi kursor saat ini (seperti PRINT_STRING), tetapi
menerima alamat string dari stack. ZERO TERMINATED
string harus di definisikan setelah instruksi CALL, contoh :
CALL PTHIS
db 'Hello World!', 0
Untuk menggunakannya deklarasikan: DEFINE_PTHIS
sebelum direktive END.
GET_STRING procedure untuk mendapatkan input null
terminated string dari user, string yang diterima ditulis
dalam buffer di register DS:DI, ukuran buffer berada di
DX. Prosedur ini menghentikan input saat tombol 'Enter'
ditekan. Cara menggunakannya: DEFINE_GET_STRING
sebelum direktive END.
CLEAR_SCREEN procesedur membersihkan layar,
(sebenarnya hanya menggulung layar saja satu window),
dan mengeset posisi kursor di atasnya. Cara
pemakaiannya: DEFINE_CLEAR_SCREEN sebelum
direktive END.
SCAN_NUM procedure untuk menerima input berupa
angka multi-digit SIGNED (bertanda) dari keyboard, dan
menyimpan hasilnya di register CX. Cara memakainya :
DEFINE_SCAN_NUM sebelum direktive END.
PRINT_NUM prosedur mencetak angka signed dalam
register AX. Pemakaiannya: DEFINE_PRINT_NUM dan
DEFINE_PRINT_NUM_UNS sebelum direktive END.
PRINT_NUM_UNS prosedur mencetak angka
unsigned dalam register AX. Pemakainnya:
DEFINE_PRINT_NUM_UNS sebelum direktive END.
Untuk menggunakan semua prosedur diatas kita harus
mendeklarasikan fungsi di bawah file sumber (sebelum direktive
END), dan kemudian menggunakan instruksi CALL diikuti
dengan nama prosedurnya, contohnya :
include 'emu8086.inc'
ORG 100h
LEA SI, msg1
; Tanya angka yg di input
CALL print_string ;

CALL scan_num

; ambil angka di CX.

MOV AX, CX

; copy angka ke AX.

; cetak string berikut:


CALL pthis
DB 13, 10, 'Anda memasukkan: ', 0
CALL print_num
RET

; cetak angka di AX.

; return ke OS.

msg1 DB Masukan sebuah Agka: ', 0


DEFINE_SCAN_NUM
DEFINE_PRINT_STRING
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS ;diperlukan utk
;print_num.
DEFINE_PTHIS
END

; directive utk menghentikan


;kompiler.

Pertama-tama compiler memproses deklarasi (ada makro biasa


yang di ekspan menjadi prosedur). Saat compiler menerima
instruksi CALL dia mengganti nama prosedur dengan alamat dari
kode dimana prosedur dideklarasikan. Saat instruksi CALL
mengeksekusi control maka prosedur dipindahkan. Hal ini sangat
berguna, karena jika kita memanggil prosedur 100 kali dalam
kode program kita masih mempunyai ukura program yang kecil
.Tampaknya agak membingungkan bukan ? Tidak masalah
hanya masalah waktu saja m=yang menuntuk kita untuk
memahaminya prinsip dasar ini.

PROSEDURE
Procedure merupakan bagian dari kode yang dapat dipanggil dari
program dalam rangka tugas tertentu. Prosedur membuat
program lebih terstruktur dan mudah dimengerti. Umumnya
prosedur mengembalikan titik dimana dia dipanggil, sintaknya :
name
PROC
; kode dituliskan disini
; dalam badan prosedur ...
RET
name
ENDP
name
nama prosedur, nama ini harus sama dia awal dan akhir
prosedur.
RET menyatakan kembali ke OS setelah pemanggilan prosedur.
PROC dan ENDP merupakan direktiv compiler ,jadi tidak diassembled
ke dalam
kode mesin.
Kompiler
hanya
mengingat
alamat
dari prosedur.

Instruksi
CALL
digunakan
untuk
memanggil
prosedur.

Contoh:
ORG 100h

CALL m1
MOV AX, 2
RET

; kembali ke OS.

m1 PROC
MOV BX, 5
RET
; kembali ke pemanggilnya
m1 ENDP
END

contoh diatas memanggil prosedur m1, yang mengerjakan MOV


BX, 5, dan kembali ke instruksi selanjutnya setelah CALL: MOV
AX, 2.
Ada beberapa cara untuk mengirim parameter ke prosedur, yang
paling mudah adalah mengirimkan parameter menggunakan
register, disini contoh lainnya dari prosedur yang menerima dua
parameter dalam register AL dan BL , kalikan kedua parameter
dan kirim hasilnya ke register AX:
ORG 100h
MOV AL, 1
MOV BL, 2
CALL
CALL
CALL
CALL

m2
m2
m2
m2

RET

; kembali ke OS.

m2 PROC
MUL BL
RET
m2 ENDP

; AX = AL * BL.
; kembali ke pemanggil.

END

contoh dalam diatas nilai register AL di update setiap saat


prosedur di panggil, register BL tetap tidak berubah, jadi
algoritma ini menghitung 2 pangkat 4, hasil akhirnya di register
AX adalah 16 (or 10h).
Cotoh lainnya, prosedur mencetak pesan Hello World! :
ORG 100h
LEA SI, msg
CALL print_me

; load address msg ke SI.

RET

; ke OS.

;
==========================================================
; prosedur ini mencetak string,stringy harus null
; terminated (ada nol diakhir string),
; alamat string hrs berada di register SI :
print_me PROC
next_char:
CMP b.[SI], 0 ; check jika nol ke stop
JE stop
;
MOV AL, [SI]

; selanjutnya ambil karakter ASCII .

MOV AH, 0Eh ; teletype nomer function.


INT 10h
; gunakan interrupt utk mencetak karakter di AL.
ADD SI, 1
JMP next_char

; advance index dari string array.


; kembali dan cetak karakter lainnya.

stop:
RET
; kembali ke pemangil proc.
print_me ENDP
;
==========================================================
msg DB 'Hello World!', 0 ; null terminated string.
END

prefix "b." sebelum [SI]berarti bahwa kita perlu


membandingkan byte, bukan word. Jika kita perlu
membandingkan word tambahkan prefix "w.". Jika salah satu
operand pembandingnya berupa register, hal tersebut tidak
diperlukan karena compiler tahu ukuran tiap register .

BAGIAN 11
MEMBUAT SISTEM OPERASI SENDIRI
Biasanya, saat komputer dihidupkan akan mencoba me-load
512-byte sector pertama ( Cylinder 0, Head 0, Sector 1) dari
disk drive, misal A: ke lokasi memori 0000h:7C00h dan
memberikan kontrolnya. Jika gagal BIOS mencoba menggunakan
MBR dari hard drive primer. Dalam bagian ini akan mencoba
mengcover booting dari sebuah floppy drive,dengan prinsip yang
sama dapat juga dilakukan di harddisk. Tetapi menggunakan
floppy drive memiliki beberapa keuntungan:
OS kita tetap utuh (windows, dos, linux, unix, be-os...).
udah dan aman memodifikasi boot record padaf floppy
disk.
contoh floppy disk boot program:
; directive utk membuat BOOT file:
#make_boot#
; Boot record di-loaded di 0000:7C00,
; informasikan compiler utk membuat permintaan yang benar:
ORG 7C00h
PUSH CS ; yakinkan DS=CS
POP DS
; load alamat message ke dalam register SI :
LEA SI, msg
; teletype id fungsi:
MOV AH, 0Eh
print: MOV AL, [SI]
CMP AL, 0
JZ done
INT 10h ; cetak dg teletype.
INC SI
JMP print
; tunggu utk 'any key':
done: MOV AH, 0
INT 16h

; simpan nilai magic di 0040h:0072h:


; 0000h - cold boot.
; 1234h - warm boot.
MOV AX, 0040h
MOV DS, AX
MOV w.[0072h], 0000h ; cold boot.
JMP 0FFFFh:0000h ; reboot!
new_line EQU 13, 10
msg DB 'Hello ini Boot Program saya yang pertama!'

DB new_line, 'Tekan sembarang tombol utk reboot', 0

tulis contoh diatas pada editor emu8086 dan tekan emulate.


Emulator secara otomatis akan me-load file .bin ke
0000h:7C00h (ini digunakan sebagai suplemen file .binf utk
mengetahui dimana akan di load). Kita dapat menjalankan
seperti program biasa, atau dapat menggunakan menu virtual
drive untuk menulis: write 512 bytes di 7c00h ke boot
sector dari virtual floppy drive (file "FLOPPY_0" file di
c:\emu8086). Setelah program ditulis ke virtual floppy drive, kita
dapat memilih boot from floppy dari menu virtual drive . File
.bin untuk boot records terbatas pada 512 bytes (ukuran
sektor). Jika OS baru kita berukuran lebih dari nilai tersebut, kita
perlu menggunakan suatu boot program untuk me- load data
dari sector lainnya (seperti micro-os_loader.asm ). Contoh OS
kecil dapat di temukan di c:\emu8086\examples. Untuk
membuat perluasan OS kita (lebih dari 512 bytes), kita dapat
tambahkan sector pada floppy disk. Ini direkomendasikan untuk
menggunakan file ".bin" untuk tujuan ini ( untuk membuat file
".bin" pilih "BIN Template" dari menu "File" -> "New").
Untuk menulis file ".bin" ke virtual floppy, pilih "Write .bin file
to floppy..." dari menu "Virtual drive" emulator, kita harus
menulisnya dimanapun di boot sektor ( Cylinder: 0, Head: 0,
Sector: 1).

kita dapat menggunakan utility ini untuk menulis file .bin ke


virtual floppy disk ("FLOPPY_0" file), dapat juga menu "write
512 bytes at 7c00h to boot sector" . bagaimanapun juga, kita
perlu ingat bahwa file .bin yang didisain untuk menjadi boot
record harus selalu di tulis ke cylinder: 0, head: 0, sector: 1
Boot Sector Location:
Cylinder: 0
Head: 0
Sector: 1

Untuk menulis file .bin kef loopy disk sebenarnya gunakan


writebin.asm, lalu kompilasikan ke file .com dan jalankan dari
command prompt.
- Untuk menulis tipe boot record : writebin
loader.bin ;
- untuk menulis tipe modul kernel : writebin
kernel.bin /k.
parameter /k mengatakan pada program untuk
menulis file pada sector ke dua sebagai ganti yang
pertama .Hal tersebut bukan menjadi masalah dalam
rangka menulis file ke floppy drive, tetapi yang
menjadi masalah dimana kita akan menuliskannya .
Catatan: boot record ini tidak kompitabel dengan MSDOS/Windows, juga Linux atau Unix , OS tidak mengijinkan kita
membaca atau menulis file dalam disket hingga kita akan mereformatnya ,Jadi yakinkan bahwa disket yang kita gunakan
tidak berisi data yang penting. Bagaimanapun juga kita dapat
menulis dan membaca apa saja dari dank e disk menggunakan
interrupt untuk mengakses disk secara low level , bahkan
mungkin memproteksi informasi yang bernilai dari orang lain
atau jika seseorang mendapatkan disket mungkin dia akan
berpikir bahwa disket tersebut kosong dan akan memformatnya,
karena pilihan defaultnya ada di windows operating system
Struktur floppy drive dan diskette yang ideal:

Untuk disket 1440 kb :


floppy disk mempunyai 2 side , dan ada 2 head (0..1),
head drive bergerak keatas permukaan dari disket untuk
tiap sisi.
Tiap sisi memiliki 80 cylinders (di nomori 0..79).
tiap cylinder memiliki 18 sectors (1..18).
tiap sector memiliki 512 bytes.
Total ukuran floppy disk adalah : 2 x 80 x 18 x 512 =
1,474,560 bytes.
Catatan: disket the MS-DOS (windows) yang terformat memiliki
free space sedikit berkurang (sekitar 16,896 bytes) karena OS
perlu menempatkan struktur nama file dan direktori (sering
disebut FAT atau file system allocation table). Semakin banyaknama file semaki
berkurang ruang yang kosong .Yang paling
efisien untuk menyimpan file adalah menuliskan secara langsung
dengan menggunakan file system , dan untuk beberapa kasushal ini merupakan
yang paling reliable , jika kita dapatmenggunakannya. Untuk membaca sector dari
floppy drivegunakan INT 13h / AH = 02h.

Anda mungkin juga menyukai