Skema register data dalam prosesor x86 meliputi register umum seperti AX, BX, CX, DX yang terbagi menjadi bagian 8 bit dan 16 bit. Terdapat juga register khusus seperti segment register, pointer register, dan status register. Algoritma perpindahan data dalam bahasa rakitan melibatkan duplikasi nilai antara register melalui instruksi MOV. Mekanisme pendeklarasian data mencakup tipe data seperti byte, word, double word beserta panjangnya di memori.
1. TA.2008/2009 Semester-1
CE113 Computer System (3 credits)
Dosen: S.N.M.P. Simamora, ST., MT.
Program studi: Teknik Komputer
Jurusan Teknologi Informasi
Bandung – 2008
Tuntunan Praktis Bahasa Rakitan menggunakan
Turbo Assembler 2.0
Reference:
Irvine, Kip R., ”Assembly Language for Intel-Based Computers Fifth Edition”, Florida
International University, School of Computing and Information Sciences, Pearson
Education, Inc., 2007.
Simamora, S.N.M.P., ”Diktat Kuliah KOM244 Sistem Mikroprosesor (3 sks)”,
Jurusan Ilmu Komputer, F-MIPA, UNAI, Bandung, 2006.
Simamora, S.N.M.P., ”Diktat Kuliah SK-303 Organisasi dan Arsitektur Komputer (2
sks)”, Departemen Teknik Elektro, Fak.Teknik, ITHB, Bandung, 2002.
Skema Register Data dalam prosesor x86
Arsitektur Keluarga Intel 8086:
General-Purpose Register
AH/AL AX (EAX) Accumulator
BH/BL BX (EBX) Base
CH/CL CX (ECX) Counter
DH/DL DX (EDX) Data
1
2. Perbedaan register General-purpose Register:
AH/AL, memiliki panjang @ 8-bit
AX, memiliki panjang 16-bit
EAX, memiliki panjang 32-bit
Segment Register
AH/AL AX (EAX) Code Segment
BH/BL BX (EBX) Stack Segment
CH/CL CX (ECX) Data Segment
DH/DL DX (EDX) Extra Segment
Pointer Register Stack Register
SI (ESI) Source Index SP (ESP) Stack Pointer
DI (EDI) Destination Index BP (EBP) Base Pointer
IP (Instruction Pointer)
Status Register
FLAGS Status Flags
Klasifikasi register (panjang 16 bit) pada mesin x86:
register AX: dikenal juga sebagai Accumulator (Acc), dibagi atas dua bagian
(masing-masing 8 bit), yaitu: AH dan AL.
Misalkan: isi AH bernilai 0, lalu di-copy-kan ke AL; lalu selanjutnya isi AL ditambahkan
dengan 1. Sehingga isi terbaru AX bernilai 1.
MOV AH,0
MOV AL,AH
INC AL
register BX: register ini terdiri dari dua bagian, yaitu BH dan BL. Register BX dapat
mengakses langsung ke lokasi dari main-memory.
Contoh:
MOV AX,0
MOV DS,AX
MOV BX,9
MOV AL,[BX]
Keterangan mnemonic-instruction: pertama-tama AX diisi nilai 0, kemudian di-copy ke
register DS; selanjutnya BX diisi nilai 9, dan isi lokasi memori 9 (bukan isi register BX)
sekarang di-copy-kan ke AL. Ini artinya, register BX berlaku sebagai link ke alamat memori.
register CX: register ini digunakan untuk pencacahan dan operasi string, dan
menampung panjang program yang sedang aktif. Seperti halnya register AX dan BX,
register ini terbagi dua, CH dan CL.
2
3. register DX: register ini dimanfaatkan untuk lalu-lintas (IN dan OUT) data pada port
komputer. Biasanya juga boleh digunakan untuk menampung data yang akan
ditampilkan ke output-devices, misalkan monitor atau printer, bahkan speaker.
register SI: register yang digunakan sebagai pointer ke memori.
Misalkan:
mov ax,o
mov ds,ax
mov si,10
mov al,[si]
register BP: register yang dapat digunakan juga sebagai pointer ke memori, namun
perbedaannya terletak pada tujuan peletakan pointer tersebut, yakni ke register
stack yang disebut register SP.
register SP: register yang digunakan untuk keperluan stack. Stack sendiri
pengertiannya adalah area di memori yang digunakan untuk menyimpan nilai
sebelum dan sesudah proses data terakhir.
Klasifikasi instruksi lompatan (Looping Instruction):
JMP, instruksi lompatan tak bersyarat
Contoh: JMP 0108 ⇒ langsung melompat ke alamat memori segment=0108
CMP, instruksi lompatan dengan bersyarat
Contoh: CMP [op-1],[op-2]
Beberapa jenis instruksi Lompatan Bersyarat seperti:
• JE (Jump if Equal)
• JNE (Jump if Not Equal)
• JG (Jump if Greater than)
• JNG (Jump if Not Greater than)
• JNGE (Jump if Not Greater than Equal)
• JE (Jump if less than)
• JLE (Jump if less or Equal than)
• JNL (Jump if Not Less or Equal)
• JNLE (Jump if Not Less or Equal)
• JA (Jump if Above)
• JNA (Jump if Not Above)
• JNAE (Jump if Not Above or Equal)
• JNS (Jump On Not Sign)
• JC (Jump On Carry)
• JNC (Jump On Not Carry)
• JCXZ (Jump If CX=0)
• JB (Jump If Below)
• JBE (Jump If Below or Equal)
• JNBE (Jump If Not Below or Equal)
• JZ (Jump On Zero)
3
4. • JNZ (Jump On Not Zero)
• JS (Jump On Sign)
Skema Relasi Komponen Utama dalam Komputer
Struktur Program dalam Turbo Assembler
Diformulasikan sebagai berikut:
label instruksi/directive operand ;komentar
label : nama simbolik yang boleh dipakai atau tidak bergantung kebutuhan.
Instruksi tentu saja mutlak, operand dapat saja tidak ada, atau satu buah
atau dua buah, tergantung instruksi yang digunakan.
komentar: yang diawali dengan titik koma boleh optional digunakan. Ini biasanya
digunakan untuk memberi keterangan/maksud sebuah baris kode yang
dituliskan.
Dengan demikian, yang terpenting adalah instruksi (mnemonic-instruction) dan
operand-nya.
Nilai numerik yang dimasukkan ke dalam operand, dapat berupa decimal atau
hexadecimal, namun umumnya dalam hexadecimal.
Contoh:
karakter.asm
.MODEL SMALL
.CODE
ORG 100h
iniLoh :
MOV AH,02h ;Nilai servis untuk mencetak karakter
MOV DL,'S' ;DL diisi Karakter 'S' yang akan dicetak
INT 21h ;menampilkan ke monitor
INT 20h ;kendali dikembalikan ke sistem operasi
END iniLoh
4
5. Tampilan proses penerjemahan dan eksekusi program:
Proses linking di atas menggunakan instruksi:
tlink /t nama_object_file
Dan keluarannya akan men-set program aplikasi tersebut ke dalam platform DOS,
dengan catatan blok inisialisasi program dituliskan sebagai berikut:
.MODEL SMALL
.CODE
ORG 100h
Bedakan dengan source-program berikut, dimana jika di-linking dengan instruksi ini
tlink /t nama_object_file
halo.asm
dosseg
.model small
.stack 100h
.data
kalimat db 'Apakabar Indonesia..' ,13,10,'$'
.code
mov ax,@data
mov ds,ax
mov ah,9
mov dx,offset kalimat
int 21h
mov ah,4ch
int 21h
end
akan menampilkan pesan error, sehingga proses linking digunakan instruksi berikut
ini:
tlink nama_object_file
5
6. Tampilan proses penerjemahan dan eksekusi aplikasi pemrograman:
Penjelasan: maksud bilangan 13,10,’$’ adalah instruksi untuk ganti baris baru (‘new-
line’) dengan demikian cursor akan diletakkan pada baris baru di bawahnya.
Contoh lain:
sandi.asm
DOSSEG
.MODEL SMALL
.CODE
ORG 100H
mulamula:
JMP mulai
IniDia DB 'Selamat dan Sukses..',13,10,'$'
ItuDia DB 'Password: ',13,10,'$'
mulai:
MOV AH,09H
MOV DX,OFFSET ItuDia
INT 21H ;mencetak ItuDia
awal:
MOV AH,07H
INT 21H
CMP AL,'s'
JE sini1
CMP AL,'S'
JNE awal
sini1:
MOV AH,07H
INT 21H
CMP AL,'n'
JE sini2
CMP AL,'N'
JNE awal
sini2:
MOV AH,07H
INT 21H
CMP AL,'m'
JE sini3
6
7. CMP AL,'M'
JNE awal
sini3:
MOV AH,07H
INT 21H
CMP AL,'p'
JE sini4
CMP AL,'P'
JNE awal
sini4:
MOV AH,09H
MOV DX,OFFSET IniDia
INT 21H
INT 20H
END mulamula
Proses penerjemahan dilakukan dengan perintah sbb:
Proses kompilasi:
tasm sandi.asm
Proses linking:
tlink /t sandi
apabila proses linking digunakan perintah:
tlink sandi
maka, akan muncul pesan: No Stack, ini disebabkan, proses linking akan
mengubah object-file menjadi file executed-program dalam tipe file .EXE, sedangkan
source-code di-create menggunakan model agar ukuran file dalam ukuran 64KB,
dengan kata lain dalam tipe file: .COM; oleh sebab itu proses linking menggunakan
instruksi: tlink /t nama_file.
Program di atas akan menanyakan password yang diketikkan user tanpa
menampilkannya ke layar komputer, tanpa menekan tombol ENTER (↵). Jika salah,
maka tetap akan meminta password sampai kata sandi yang diisikan benar. Password
berdasar isi blok program adalah: snmp.
Tampilan proses penerjemahan dan hasil eksekusi program:
7
8. Agar lebih jelasnya, perlu diketahui beberapa hal sebagai berikut:
Stack: secara sederhananya, dalam pemrograman bahasa rakitan, stack
merupakan tempat menampung isi register. Stack pada tipe file: .COM terdapat di
akhir segment, dan saat pertama sekali program dijalankan Stack Pointer akan
langsung menuju byte terakhir dari segment. Sedangkan pada tipe file: .EXE, user
harus me-create stack sendiri dan mengalihkan pointer stack ke tempat yang
diinginkan.
Perbedaan aplikasi pemrograman untuk tipe file .COM dengan .EXE adalah
ukuran (size) file tersebut. Untuk tipe file .COM, maksimal membutuhkan satu
segment dengan luas sebesar 64KB. Sedangkan untuk tipe file .EXE tidak
dibatasi berapa segment, oleh sebab itu ukuran filenya di atas 64KB (karena bisa
lebih dari satu segment).
Segment Directive
Segment Directive yang paling sederhana adalah: DOSSEG, MODEL, STACK, DATA dan
CODE.
DOSSEG: menyebabkan segmen dalam program sebuah bahasa rakitan
dikelompokkan sesuai dengan pembagian segment oleh DOS (Disk
Operating System). Biasanya sebuah program dengan bahasa rakitan
akan berjalan baik jika dimulai dengan kata DOSSEG. Dan patut diingat
bahwa segment directive ini tidak diperlukan saat program bergabung
dengan bahasa pemrograman tingkat tinggi.
.MODEL: menunjukkan model memori untuk bahasa rakitan yang menggunakan
segment directive yang sederhana. Model yang tersedia adalah:
• tiny: baik program maupun data harus masuk dalam segment yang
sama yaitu 64KB. Tipe kode dan data adalah near.
• small: program harus masuk dalam segment tunggal 64KB, dan data
harus masuk dalam segment tunggal lainnya sebesar 64KB. Tipe kode
dan data adalah near.
• medium: program dapat lebih besar dari 64KB, tetapi data harus
masuk dalam segment tunggal sebesar 64KB. Kode program ber-tipe
far, sedangkan data adalah near.
• compact: program harus tepat tertampung dalam segmentasi 64KB,
sebaliknya data-nya dapat lebih besar dari 64KB. Tipe kode adalah
near, sedangkan data adalah far. Disamping itu, data array tidak boleh
melebihi 64KB.
• large: baik program maupun data dapat lebih besar dari 64KB, tetapi
array data tidak dapat melebihi 64KB. Tipe kode program dan data
adalah far.
• huge: kode program dan data sangat besar sekali melebihi 64KB,
dan array untuk data dapat melebihi 64KB. Tipe kode program dan
data adalah far, dan pointer untuk array juga harus far.
.STACK: berguna untuk mengontrol stack. Contohnya adalah sebagai berikut,
misalkan dituliskan:
8
9. .STACK 200h
Ini artinya, didefinisikan stack sebesar 200heksadesimal (atau ini senilai dengan
DEC512) byte panjangnya. Umumnya ini sudah cukup bagi sebuah aplikasi
program, namun jika menginginkan ukuran stack lebih besar lagi, maka tinggal
mengganti nilai 200h.
.DATA: ini adalah bagian sebagai tempat untuk medefinisikan data yang akan
dipakai dalam blok program.
Misalkan:
.DATA
Nilai dw 100
Counter dw?
Pesan db 0dh,0ah,’Hello apakabar...’,odh,0ah,’$’
.CODE: ini adalah bagian inti dari sebuah program bahasa rakitan; dimana semua
kode/sintaks ditulis pada blok ini.
Mekanisme dalam Pendeklarasian Data
Pada Bahasa Rakitan, setiap data dikelompokkan dalam blok .DATA, dengan
mendefinisikannya sebagai berikut beserta panjang data di memori yang dibutuhkan:
DB : 1 byte
DW : 2 byte = 1 word
DD : 4 byte = 1 double word
DF, DP: 6 byte = 1 far pointer word
DQ : 8 byte = 1 quardword
DT : 10 byte
1 byte identik 1 karakter, direpresentasikan 8 bit, karena menggunakan sistem
pengkode ASCII 8-bit.
Dengan catatan, untuk penulisan tersebut, tidak ada perbedaan antara penulisan
menggunakan capital-case maupun lower-case.
Kadangkala, seorang pemrograman perlu mensiasati setiap tipe data yang
digunakannya untuk efisiensi alokasi memori saat program dieksekusi.
Algoritma Perpindahan Data dalam Bahasa Rakitan
Yang dimaksud dengan algoritma adalah langkah-langkah atau tahapan-tahapan
yang dilakukan dalam pemecahan suatu persoalan dan dapat diimplementasikan
dalam sebuah blok pemrograman.
Misalkan dalam perintah mnemonic-instruction berikut ini:
MOV AX,0 ;copy-kan numerik 0 ke isi register AX
MOV BX,5 ;copy-kan numerik 5 ke isi register BX
MOV AX,BX ;copy-kan isi register BX ke isi register AX
Dengan demikian, dapat disimpulkan setiap perintah MOV bukan menandakan
suatu nilai berpindah tempat, namun yang sebenarnya adalah nilai tersebut di-
duplikasikan.
9
10. Skemanya agar lebih jelas, dapat diuraikan sebagai berikut:
Pertukaran nilai antara dua operand
Misalkan: isi dua register akan dipertukarkan, maka mnemonic-struction-nya
dituliskan sebagai berikut,
XCHG AX,DX
Instruksi ini dapat juga digantikan menggunakan instruksi lain seperti berikut ini:
PUSH AX
MOV AX,DX
POP DX
Instruksi PUSH, artinya menampungkan isi dari sebuah register ke puncak stack,
sedangkan instruksi POP, artinya menampungkan isi dari puncak stack ke sebuah
register.
Keadaan ini sering juga disebut dengan swaping, yakni mempertukarkan isi dari
kedua operand atau register.
Contoh Program:
Menampilkan karakter ke layar komputer.
Misalkan, sebelumnya ditampilkan karakter ‘S’, maka isi register DL digantikan
dengan heksa 53 atau 0x53.
karakt3r.asm
.MODEL SMALL
.CODE
ORG 100h
iniLah :
MOV AH,02h ;Nilai servis untuk mencetak karakter
MOV DL,53h ;DL diisi Karakter 'S' yang akan dicetak
INT 21h ;menampilkan ke monitor
INT 20h ;kendali dikembalikan ke sistem operasi
END iniLah
10
11. Tampilan skema penerjemahan & eksekusi program:
Menampilkan string ke layar komputer
halo.asm
dosseg
.model small
.stack 100h
.data
kalimat db 'Apakabar Indonesia..' ,13,10,'$'
.code
mov ax,@data
mov ds,ax
mov ah,9
mov dx,offset kalimat
int 21h
mov ah,4ch
int 21h
end
Menampilkan karakter/string dari user
Program berikut akan menampilkan setiap yang diketikkan oleh user ke layar
komputer; untuk mengakhirinya, cukup tekan ENTER dua kali.
isilah.asm
dosseg
.model small
.stack 100h
.code
lagi:
mov ah,1
int 21h
cmp al,13
jz selesai
mov dl,al
11
12. int 21h
jmp lagi
selesai:
mov ah,4ch
int 21h
end
Untuk melakukan proses linking, gunakan instruksi:
tlink isilah
Tampilan proses penerjemahan dan eksekusi program:
Kesimpulan, proses linking untuk instruksi ’tlink /t’ digunakan atau tidak,
dilihat dari sintaks berikut ini:
.stack 100h
Menanyakan jumlah dari sebuah statement ’2+3’
ijumlah.asm
DOSSEG
.MODEL SMALL
.CODE
ORG 100H
mulamula:
JMP mulai
IniDia DB 'Anda benar..',13,10,'$'
ItuDia DB '2 + 3 = ',13,10,'$'
mulai:
MOV AH,09H
MOV DX,OFFSET ItuDia
INT 21H ;mencetak ItuDia
awal:
MOV AH,07H
INT 21H
CMP AL,'5'
JE sini4
CMP AL,'P'
12
13. JNE awal
sini4:
MOV AH,09H
MOV DX,OFFSET IniDia
INT 21H
INT 20H
END mulamula
Perhatikan, karena sintak mnemonic-instruction memunculkan ’ORG 100h’, maka
proses linking menggunakan: ’tlink /t nama_object_file’.
Tampilan proses penerjemahan dan eksekusi program:
Program akan terus meminta hasil yang benar, sepanjang user belum memberi
input ’5’.
Menampilkan alternatif pilihan jawaban dari user.
pilihlah.asm
dosseg
.model small
.stack 100h
.data
hari db 'Jam menunjukkan pk14.30 (y/t)? $'
sudah db 13,10,'Segera berkemas-kemas untuk kuliah Pak SNS..',13,10,'$'
belum db 13,10,'Selesaikan tugas yang akan dikumpulkan!',13,10,'$'
.code
mov ax,@data
mov ds,ax
mov dx,OFFSET hari
mov ah,09h
int 21h
mov ah,1h
int 21h
cmp al,'y'
jz oke
13
14. cmp al,'Y'
jnz nehi
oke:
mov dx,OFFSET sudah
jmp selesai
nehi:
mov dx,OFFSET belum
selesai:
mov ah,9h
int 21h
mov ah,4ch
int 21h
end
Tampilan proses penerjemahan dan eksekusi program:
Perhatikan, jika sintak berikut
..
sudah db 13,10,'Segera berkemas-kemas untuk kuliah Pak SNS..',13,10,'$'
belum db 13,10,'Selesaikan tugas yang akan dikumpulkan!',13,10,'$'
..
Dihilangkan ekspresi:
.. 13,10, ..
Maka, pada saat pilihlah.exe dijalankan, maka string yang dihasilkan tidak
ditempatkan pada baris baru, melainkan langsung digandengkan dengan akhir
dari jawaban yang diketikkan.
Apabila pilihlah.asm di-edit pada baris terakhir:
..
selesai:
mov ah,9h
int 21h
mov ah,4ch
int 21h
end
14
15. Digantikan dengan sintaks berikut:
..
selesai:
mov ah,9h
int 21h
int 20h
end
Lalu disimpankan dengan nama siiplah.asm, maka saat siiplah.exe
dijalankan dan user memberi input, akan tertampil pesan error:
Ini menandakan, bahwa instruksi:
..
int 21h
int 20h
..
Tidak tepat digunakan mengingat initial-state menggunakan ukuran file .EXE
bukan .COM.
Interrupt (INT)
Instruksi interrupt, artinya kendali dari Control Unit (CU), saat sebuah program sedang
berjalan, akan diambil alih oleh sistem operasi.
Klasifikasi interrupt dibagi atas dua yaitu:
BIOS Interrupt (mengambil alih isi dari ROM), yaitu interrupt yang disediakan oleh
Basic Input Output System (BIOS). Yang tergolong dalam interrupt ini adalah int
0h s.d int 1fh.
DOS Interrupt (mengambil alih isi dari RAM), yaitu interrupt yang disediakan oleh
DOS (Disk Operating System), yaitu nomot interrupt di atas int 1fh, termasuk int
20h dan int 21h.
..
..
15