Selamat Datang in "MARIOPUNALA" my blog

Minggu, 02 Januari 2011

Tutorial Assembly untuk Mikroprocessor 8086

Tutorial Assembler untuk Pemrograman
Mikroprosesor 8086


(belom selesai nih...)

Disini akan dibahas pemrograman assembler dengan mikroprosesor Intel 8086 atau yang sejenisnya
seperti Intel 8088 atau Zylog Z-80 selanjutnya anda dapat mempraktekan pada PC dengan prosesor
x86 atau yang lebih tinggi ataupun sekelas Pentium. Komentar silahkan kirimkan ke n3vCr@yahoo.com

Disclaimer from a LAMER (me):
Look, i'm not an expert and i think i never gonna be an expert, so dont askin me for any
difficult question regarding this tutorial. I'd like to share anything if you would too.

OVERVIEW + SeJARAH


Tahun 70-an LSI pertama dengan CPU dari intel -> mikroprosessor (uP)
Mikroprosesor 4 bit pertama dari Intel 4004 lalu 4040
Mikroprosesor 8 bit 8008 (tahun 1970)
8080 (tahun 1973)
8085
pelopor mikroprosesor berorientasi register.

Zylog mengluarkan 8 bit mikroprosesor Z-80 lebih baik dari 8080

Tahun 1978 Intel mengeluarkan uP 16 bit 8086 memiliki kelebihan:
instruksi transfer data lebih luas
dapat melakukan operasi aritmetik seperti penjumlahan pengurangan perkalian pembagian
mampu menangani memori 1 Mbyte dengan
20 bit saluran address (bus) dan 16 bit saluran data secara multipleks

uP 8088 -> 16 bit dengan saluran data 8 bit (dibuat untuk memenuhi pasar yang masih banyak
menggunakan saluran data 8 bit)

Tahun 1985 uP berkembang menjadi Intel 80186 dan 80286, lebih banyak intruksi dan dapat mengakses
memori lebih besar

Tahun 1981 IBM mebuat mikrokomputer dengan Intel 8088 sebagai CPU

Tahun 1985 uP Intel 32 bit 80386
IBM mengeluarkan uP 32 bit ROMP

APA ITU MIKROPROSESOR


APA BEDANYA DENGAN MIKROKONTROLER

Jelas beda doong, coba deh diucapkan sampe kedengeran orang lain, pasti orang itu tanpa
perlu tau tentang mikroprosesor atau mikrokontroler pasti akan tau bahwa keduanya berbeda.
Atau coba perlihatkan dua tilisan dibawah ini sama orang lain yang tidak tau menau tentang
mikroprosesor atau mikrokontroler atau bahkan yang gak bisa baca sekalian.

Mikrokontroler Mikroprosesor

Nah pasti orang itu akan bilang bahwa dua tuliasan diatas berbeda. Jadi Jelas bukan perbedaan
nya. Nah sekarang jangan perdebatkan perbedaannya, kalau ingin tau tentang mikrokontroler silah
kan baca tutorial lain tentang mikrokontroler.

ARSITEKTUR MIKROPROSESOR 8088

1. Arsitektur Fisik


+--------------+ Keterangan:
| | A.. Address
GND | 1 40 | Vcc A../S. Address/Segment indentifier
<-- A14 | 2 39 | A15 --> AD.. Address/Data
<-- A13 | 3 38 | A15 --> ALE Address latch enable
<-- A12 | 4 37 | A16/S3 --> CLK Clock
<-- A11 | 5 36 | A17/S4 --> DEN Data Enable
<-- A10 | 6 35 | A18/S5 --> DT/R Data transmit
<-- A9 | 7 34 | A19/S6 --> HOLD Hold request
<-- A8 | 8 33 | SSO --> HLDA Hold Acknologde
<--> AD7 | 9 32 | MN/MX--> INTR Interrupt Request
<--> AD6 | 10 31 | RD --> IO/M Memory or I/O Access
<--> AD5 | 11 30 | HOLD --> LOCK Bus Hol Control
<--> AD4 | 12 29 | HLDA --> MN/MX = Vcc for minimum system
<--> AD3 | 13 28 | WR --> NMI Non Maskable Interrupt
<--> AD2 | 14 27 | IO/M --> RD read Control
<--> AD1 | 15 26 | DT/R --> READY Wait State Request
<--> AD0 | 16 25 | DEN --> WR write
--> NMI | 17 24 | ALE -->
-->INTR | 18 23 | INTA -->
--> CLK | 19 22 | READY-->
GND |20 21 | RESET-->
| |
+--------------+

Mikroprosesor 8086 memiliki dua mode proses CPU yaitu mode minimum dan mode maksimum

(akan ditulis nanti..)

pada mikroprosesor x86 (prosesor diatas 80386) memiliki dua mode proses juga yaitu
normal mode dan protected mode. Prosesor ini adalah prosesor 32 bit.

DASAR-DASAR BILANGAN OPERASI LOGIKA


desimal : bilangan yang biasa dipakai sehari-hari (0,1,2,3,4,5,6,7,8,9)
contoh 1998 = 1X10^3 + 9X10^2 + 9X10^1 + 8X10^0
biner : bilangan basis 2 terdiri dari nilai 0 dan 1
contoh 100110 = 1X2^5 + 0X2^4 + 0X2^3 + 1X2^2 + 1X2^1 + 0X2^0 = 38 (decimal)
heksadesimal : bilangan basis 16 (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
contoh 10B58F = 1X16^5 + 0X16^4 + 11X16^3 + 5X16^2 + 8X16^1 + 16X16^0
= 1095055 (decimal)

+--[ konversi bilangan ]--+

o biner -> heksadesimal

1100110110111100111110101 (biner) = 0001 1001 1011 0111 1001 1111 0101
1 9 B 7 9 F 5
= 19B79F5 (hexadecimal)
o decimal -> biner

1576 (decimal) = 788*2 + 0
788 = 394*2 + 0
394 = 197*2 + 0
197 = 98 *2 + 1
98 = 49 *2 + 0
49 = 24 *2 + 1
24 = 12 *2 + 0
12 = 6 *2 + 0
6 = 3 *2 + 0
3 = 1 *2 + 1
1 = 0 *2 + 1
= 11000101000 (biner)

o decimal -> hexadecimal

1576 (decimal) = 98*16 + 8
98 = 6*16 + 2
6 = 0*16 + 6
= 628 (hexadesimal)

JENIS DATA

Sebuah digit biner disebut BIT (binary digit)
Sebuah digit heksadesimal disebut NIBBLE (4 bit)
BYTE (by eight) = data yang menampung 8 byte atau 2 nibble ( range 0-255 atau 0-FFh )
WORD = gabungan data dari 2 byte atau 4 nibble atau 16 bit (range 0-65535 atau 0-FFFFh)
DOUBLEWORD = gabungan data dari 2 word atau 4 byte atau 8 nibble atau 32 bit (range 0-FFFFh)

Satuan pembacaan (read) terkecil dalam low level language adalah jenis data BYTE
Jadi sebuah data yang lebih besar dari 1 byte akan dibagi-bagi menjadi beberapa byte,
misalnya sebuah data 1 word akan dibagi dalam 2 byte, 1 douleword dibagi dalam 4 byte
dalam penyimpannya di memori.

Dari sebuah data, byte yang paling kiri disebut byte terpenting (Most Significant Byte -- MSB)
dan byte yang paling kanan disebut byte yang paling tidak penting (Less Significant Byte - LSB)
Contoh:
[ABCD]word akan dibagi menjadi 2 byte [AB] dan [CD]. [AB] disebut MSB, dan [CD] disebut LSB

Dalam penyimpanan data di memori urutan penyimpanan adalah dimulai dari LSB. Misalnya
data [[ABCD1234]double word akan disimpan dalam urutan [34], [12], [CD], [AB].

MEMORY dan SEGMENTASI

Mikroprosesor n bit berarti mikroprosesor tersebut dapat melakukan operasi metematik
(operasi logika) yang melibatkan maksimum n bit. Contoh: 8086 adalah mikroprosesor 16 bit,
artinya dalam satu waktu dapat mengakses data sebesar 16 bit (1 WORD), 80386 adalah
mikroprosesor 32 bit artinya dalam satu waktu dapat mengakses data sebesar 32 bit
(1 DOUBLEWORD).

Jalur alamat 8086 adalah 20 bit, ini berarti alamat yang dapat diakses adalah 2^20
= 1048576 alamat (mulai dari alamat 0h sampai FFFFFh).

8086 adalah mikroprosesor 16 bit berarti register-nya (register adalah variable untuk
perangkat keras) paling besar berukuran 16 bit (1 WORD). Karenannya untuk mengakses
alamat fisik sebanyak FFFFFh tidak dapat digunakan 1 register alamat.

Untuk mengatasi kendala tersebut, suatu alamat fisik dipresentasikan oleh 2 register
berukuran WORD, yang biasa disebut SEGMENT dan OFFSET.

Pengalamatan memori seperti ini disebut segmentasi. Dengan segmentasi pengalsmatan, memory
dapat digambarkan menjadi suatu array dua dimensi. Antara segment dan offset keduanya saling
independent.

Sebuah alamat fisik (0-FFFFFh) dapat dialamatkan menggunakan Segment dan Offset dengan cara:

- kalikan segment dengan 16 (= 10h = 10000)
- tambahkan dengan offset, maka didapatkan alamat fisik

contoh: FFE23 jika ditulis dalam SEMENT:OFFSET adalah FFE2:0003 atau FFE0:0023 atau
FF00:0E23 atau F000:FE23 atau FFE1:0013 atau yang lainnya asalkan memenuhi syarat diatas
(SEGMENT*10h + OFFSET = alamat fisik)

Mikroprosesor yang ada saat ini (lebih tinggi dari 80386) adalah mikroprosesor 32 bit.
Berarti register mikroprosesor x86 berukuran 32 bit, yang biasanya dibagi dalam lowbyte
dan highbyte.

REPRESENTASI DATA


Beberapa cara untuk merepresentasikan data diantaranya adalah:

o-- Kode ASCII (American Standard Code for Information Interchange)
o-- Metoda BCD (Binary Coded Decimal)
o-- Floating point representation -> 1.5732*10^6


REGISTER DAN FLAG

Register adalah variable perangkat keras. Ilustrasi: Di dalam bahasa pemrograman lain
(HIGH LEVEL) kita bebas menentukan variable-variable sebanyak yang kita mau, tapi tidak di
bahasa tingkat rendah, jumlahnya sudah tertentu. Register dapat disamakan dengan variable
pada HLP.

Flag adalah suatu variable boolean (1 atau 0) yang menunjukan status/keadaan dari
mikroprosesor. Karena flag hanya terdiri dari 1 bit, maka flag biasanya dikumpulkan
menjadi suatu bentuk yang lebih besar. Dalam 8086 flag-falg dikumpulkan menjadi 1 word
(16 bit).

Flag biasanya digunakan terutama untuk pencabangan program (conditional brach)

Klasifikasi/kelompok register berdasarkan fungsinya:

[1] Multi/general purpose register:
Pada 386 keatas juga ada register dengan besar 32 bit, dengan nama yang sama dengan
register 16 bit hanya ditambah huruf E di depannya (EAX, EBX, ECX, EDX).

o AX (Accumulator): sering digunakan untuk menyimpan Arithmetic Logical unit dan
hasil perhitungan sementara dari operasi logika atau aritmetika tsb.
Selain itu register ini juga digunakan untuk menyimpan sementara data yang akan dikirim
ke Port atau yang datang dari port untuk diproses.
o BX (Base): sering digunakan untuk menyimpan alamat (offsetnya) dari data yang
disimpan di memory atau dalam kata lain, menyimpan address tak langsung (indirect address)
o CX (Count): sering digunakan untuk instruksi yang memerlukan hitungan (count)
seperti ROL, LOOP, dll. MIsalnya pada kasus iterasi suatu loop atau menghitung banyaknya
karakter dalam suatu string.
o DX (Data): digunakan untuk menyimpan nilai overflow dari suatu operasi aritmetik dan
alamat I/O sehingg sering digunakan untuk mengakses data input/output bus melalui instruksi
IN, OUT

AX, BX, CX, DX merupakan register dengan besar 1 word (16 bit). Untuk memudahkan
pemrograman, register-register tersebut dapat diakses terpisah antara high byte
(1 byte kiri) dan low byte (1 byte kanan). Jadi kita dapat mengakses register AX
melalui register AL (AX low) dan AH (AX high). Tapi register 8 bit ini juga dapat dioperasikan
sebagai data "sendiri/tunggal". Contoh:

Jika AX berisikan 1234h, maka AH berisi 12h dan AL berisi 34h. dan jika kita mengisi
AH dengan 45h dan AL 66h,maka AX berisi 4566h. hal ini juga berlaku untuk register BX,
CX, DX dimana ada BH, BL, CH, CL, DH, DL.

[2] Pointer dan index register:
Register ini besarnya 16 bit (untuk 386+ besarnya 32 bit).

o SP (Stack Pointer): digunakan sebagai penunjuk (menyimpan data) alamat (offset) dari
LIFO stack memory.
Biasanya disebut stack offset register. Terlibat langsung dalam intruksi PUSH dan POP.
Lihat bagian yang membahas stack memory dibawah.
o BP (Base Pointer): digunakan untuk menunjuk alamat (offset) dari array
(array merupakan sekumpulan data berindeks) yang terletak di dalam stack memory.

Kedua register ini akan dibahas lebih lanjut di bawah.

o IP (Instruction Pointer): menunjukan alamat (offset) instruksi di memory yang akan
dilaksanakan oleh mikroprosessor. Mikroprosessor selalu mejalankan instruksi yang
berada di memory yang ditunjuk oleh alamat CS:IP (Code Segment:Instruction Pointer)
Register ini disebut juga Program Counter (di Z-80), sebagai pecatatat address kode
bahasa mesin yang akan dijalankan, satu persatu register ini mencatat maju ke address
berikutnya, kode demi kode. Register ini berjalan otomasis sehingga biasanya tidak di
jamah oleh program.

o SI (Source Index): digunakan sebagai penunjuk alamat (ofset) dari source (sumber) bagi
instruksi-instruksi yang termasuk dalam 'string instruction' (operasi blok transfer?),
seperti MOVS, SCAS, CMPS, LODS.
o DI (Destination Index): digunakan sebagai penunjuk alamat (offset) dari destination
(tujuan) bagi operasi yang menggunakan 'string instruction'.
Biasanya digunakan bersama-sama SI

Dalam melakukan operasi blok transfer berarti SI harus menyimpan dahulu alamat awal dari
data source dan DI menyimpan alamat awal dari data tujuan.
SI dan Di juga berfungsi untuk menunjukan /mencatat address memory yang akan digunakan.
SI dan DI digunakan bersama-sama dengan Segment Register sebagai OFFSET.
DS:SI berarti DS = Data Segment dan SI adalah offset dari Data Segment.

[3] Segment register
Adress dicatat sebagai penunjuk lokasi data di memory. Pencatatan address dilakukan menggunakan
Segment Register ditambah dengan offset (selisih address). Offset ditempatkan (biasanya menggunakan)
BX, CX , SI atau DI yang tidak termasuk dalam segment register.

o CS (Code segment): menunjkan segment intruksi yang akan dilaksanakan oleh
mikroprosessor
o DS (Data segment): menunjukan alamat segment memory yang digunakan oleh program
sebagai tempat penyimpanan data.
o ES (Extra Segment): segment tambahan yang diberikan kepada pemakai, dan digunakan
oleh beberapa instruksi yang termasuk dalam 'string instruction'.
o SS (Stack Segment): menunjukan segment yang digunakan oleh memory untuk stack.

Pada 386 keatas segment register ini berjumlah 6, dengan:
o FS - Just another segment (only 386+), seldom used in cracking
o GS - And yet another one (only 386+), seldom used in cracking

[4] Flag register / program status register
Register yang didalamnya menyimpan bit-bit flag.
Merupakan register 16 bit.
Berfungsi dalam menyimpan informasi (flag) yang berkaitan dengan operasi kerja mikroprosessor dan
akibat dari operasi aritmetik dan atau logik.

Register ini dapat digambarkan sebagai berikut:

BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+---+---+---+---+----+----+----+----+----+----+---+----+---+----+---+----+
FLAG | | | | | OF | DF | IF | TF | SF | ZF | | AF | | PF | X | CF |
+---+---+---+---+----+----+----+----+----+----+---+----+---+----+---+----+

Bit-bit yang kosong berarti tidak dipergunakan. Keadaan bit bernilai 1 disebut keadaan set
dan jika 0 disebut reset.

o CF = Carry (bit ke 0): menunjukan carry (bawaan) atau borrow (pinjaman) setelah penjumlahan
atau pengurangan. Nol berarti tidak ada carry.
o PF = Parity (bit ke 2): menunjukan jumlah bit '1' dalam data adalah genap atau ganjil, jika
genap flag parity ini berisi 1 dan sebaliknya jika ganjil.
o AF = Auxilaty Carry Flag (bit ke 4): menunjukan adisi/substraksi carry ke bit 4 di Al atau AH
Nol menunjukan non carry
o ZF = Zero (bit ke 6): menunjukan apakah hasil dari instruksi sebelumnya nol atau tidak, jika
hasilnya nol maka flag ini di-set (1), jika tidak nol maka di-reset (0).
o SF = Sign (bit ke 7); menunjukan apakah hasil dari instruksi sebelumnya negatif atau positif,
jika positif flag ini di-set, dan sebaliknya.
o TF = Trap (bit ke 8): menunjukan mode debugging on atau off.
Nilai flag ini 1 berari program berjalan dalam mode single step by step (debugging).
o IF = Interrupt (bit ke 9): mengontrol operasi dari INTR (interrupt Request) pin masukkan.
Jika flag ini di-set, maka INTR pin berlaku, dan sebaliknya.
o DF = Direction (bit ke 10): mengontrol arah akases string dari instruksi-instruksi yang
tergabung dalam 'string instruction'.
o OF = Overflow (bit ke 11): kondisi yang terjadi jika bilangan bertanda (negatif/postif) di
jumlah atau dikurangkan. Flag ini menunjukan apakah hasil telah melampaui batas
dari kapasitasnya. Contoh:
7Fh (+127) ditambah dengan 01h (+1) maka hasilnya (-128) dan flag ini di-set.

--
Catatan: INTEL membagi register pada 8086 menjadi 3 yaitu general purpose register (ax, bx, cx, dx
si, di, bp dan sp), segment register (cs, ds, es, ss) dan miscellaneous register (atau
special purpose register yaitu: flags register dan ip).

Stack Memory

Stack atau biasa disebut stack register adalah bagian yang amat penting bagi semua mikroprosessor.
Stack menjadi penyimpanan data secara sementara (temporary) dan penyimpanan alamat dari prosedure
atau subrutin.

Dalam 8086 ukuran stack adalah word ( 2 byte = 16 bit).

Ada dua stack register yaitu BP dan SP

Stack memory menggunakan sistem LIFO (Last In First Out) artinya data yang kita simpan
terakhir adalah data yang paling pertama akan kita dapatkan.

Perintah yang terkait langsung (dengan stack pointer) ini adalah PUSH (untuk menyimpan data)
dan POP ( untuk mengakses data). Jadi data yang pertama di-PUSH akan menjadi data yang terakhir
di-POP, dan begitu sebaliknya.

Instruksi PUSH digunakan untuk menyimpan suatu data ke Stack. Contoh: 'PUSH AX'
fungsinya "ambil data dari ujung stack dan masukan nilainya ke AX'
Perlu diingat bahawa kita tidak dapat mengintruksikan 'PUSH AL' atau 'PUSH BL' karena
AL dan BL besarnya 1 byte (bukan 1 word).

Salah satu guna stack adalah untuk men-save (menyimpan) suatu register secara sementara, misalnya:

PUSH AX ; AX disimpan dalam stack
IN AL, DX ; baca port DX dan masukkan nilainya ke AL (disini AX berubah)
MOV BX, Ax ; Simpan hasil pembacaan ke BX
POP AX ; kembalikan nilai AX

Data yang dapat kita simpan ke stack adalah Register 16 bit, Flag dan alamat memory tertentu.
Contoh: PUSH DX, PUSH (push flag), POP [2345h]

Alamat memory yang digunakan untuk alokasi stack adalah di alamat SS:SP
(Stack Segment:Stack pointer)

Setiap intruksi PUSH dikerjakan: alamat SS:PP diisikan data yang di-PUSH ke dalam register,
flag atau memory (tergantung instruksi), otomatis SP ditambah 2.

Perubahan SP sebanyak 2 dikarenakan jenis data yang disimpan dalam stack adalah word (2 byte).


MODE PENGALAMATAN

Untuk menjelaskan metoda pengalamatan sebaikanya dimengerti dulu sebuah instruksi yang penting
dan umum yaitu MOV. Bentuk sintaksnya:

MOV destination, source

Instruksi ini memindahkan sebuah nilai pada suatu lokasi di memory (register atau variable)
Contoh:

MOV AX, 1234h ; memindahkan nilai 1234h ke register AX
MOV BX, AX ; memasukan nilai di register AX ke register BX

--
Catatan:
Pada sintaks bahasa assemby yang mengikuti standar AT&T, seperti pada sistem operasi Linux (UNIX)
terdapat beberapa perbedaan konfensi sintaks, misalnya: 'movl %eax, %ebx' yang berarti memindahkan
data di source register (AX) ke destination register (BX).

* Mode Pengalamatan Data (Data Addressing Mode) *

o Register addressing: 'MOV AX, BX' artinya memindahkan (meng-copy) register BX
ke register AX
o Immediate addressing: 'MOV AX, 46h' artinya memasukan nilai 46h ke register AX atau
"AX = 46h".
o Direct addressing: 'MOV AX, [1234]' artinya memasukan nilai word yang ada di alamat
offset 1234h ke dalam AX atau "AX = isi data pada alamat memory 1234h"
o Register Indirect Adressing: 'MOV AX, [BX]' artinya Masukan nilai yang ada di alamat
yang terkandung dalam BX ke register AX atau " AX = isi dari alamat memory yang ditunjukan BX"
o Base Plus Index Addressing: 'MOV AX, [BX+DI]' artinya masukan nilai yang ada di alamat
(BX+DI) ke dalam AX
o Dan lain-lain. Lihat literatur ( mode pangalamatan yang lain jarang digunakan kecuali untuk
program-program data base).

Ingat: bedakan antara 'MOV AX, BX' dengan 'MOV AX, [BX]' dan 'MOV AX, 12h' dengan
'MOV AX, [12h]'


PERINTAH-PERINTAH DASAR (UMUM)


o-- Data movement instruction

Pada setiap program kita akan menghadapi pemindahan data antara memory dan register CPU
pemindahan tersebut bisa dari memory ke beberapa register, dari register ke register,
dari sebuah register ke stack, atau mentransmisikan data dari register ke port device
eksternal, dan kebalikannya.

Pemindahan data tersebut memiliki batasan yaitu:
o tidak dapat memindahan data dari lokasi memory ke lokasi memory lain secara langsung
o tidak dapat memindahkan data langsung ke sebuah segment register, tapi harus melalui
register CPU dulu.

---
Perintah untuk men-copy data sebesar 1 byte adalah dengan MOV yang syntaksnya memiliki bentuk

MOV ,

Fungsi: untuk memindahkan (meng-copy) data dari source ke destination
ada beberapa kemungkinan pemindahan ini berdasarkan source dan destination-nya:

* Destination: memory. Source: accumulator
* Destination: accumulator. Source: memory
* Destination: memory/register. Source: segment register
* Destination: register. Source: register
* Destination: register. Source: memory
* Destination: memory. Source: register
* Destination: register. Source: immediate data
* Destination: memory. Source: immediate data
Contoh:
MOV AX,0006h ; menyimpan nilai 0006h ke alamat register AX
MOV BX,AX ; memindahkan data/nilai di register AX ke register BX

---
Dalam asembler untuk mikroprosesor x86 telah dimungkinkan untuk memindahkan data block dalam
bytes atau word. Untuk memindahkan group dalam n byte digunakan perintah MOVSB sedangkan
untuk pemindahan n worduntuk pemindahan n word data digunakan perintah MOVSW. Kedua perintah
ini mengambil sebuah group nilai dari alamat DS:DI dan memindahkannya ke alamat ES:DI.

Perintah MOVS atau MOVSB atau MOVSW, memiliki sintaks:

MOVS ;tanpa parameter

Fungsi: memindahkan ggroup data dari source address yang berada di register SI ke destination
address di register DI

Contoh:
MOV SI, OFFSET VAR1
MOV DI, OFFSET VAR2
MOVS

pada perintah tersebut pertama didefinisikan nilai dari SI dan Di berturut-turut yaitu VAR1
dan VAR2 setelah perintah MOVS maka nilai VAR1 akan di-copy ke VAR2

---
Untuk pemindahan data ke stack digunakan perintah PUSH, dan untuk mengambil data dari stack
digunakan perintah POP.
Ingat: pada stack data yang pertama kita simpan adalah data yang akan terakhir kita ambil.
Contoh pengguan perintah PUSH dan POP :

PUSH AX
PUSH BX
PUSH CX

POP CX
POP BX
POP AX

Pada mikroprosesor x86 untuk komunikasi dengan device eksternal dapat digunakan peintah OUT
untuk mengirim data ke port dan IN untuk membaca data dari suatu port. Contoh:

OUT DX, AX ; ax berisi informasi yang akan dicopy ke port dx
IN AX, DX ; dx berisi informasi yang akan disimpan di register ax




LEA
LDS
LES

LODS
STOS
CMPS

o-- Arithmeetics and logic instructions:

ADD
ADC
SUB
DEC
INC

MUL
DIV
IDIV
IMUL

CMP
TEST

beberapa perintah untuk operasi logika adalah sebagai berikut:

Or
AND
XOR
NOT
NEG

ROL
ROR
SHL
SHR

o-- Program Control Instructions:

Instruksi yang sering digunakan untuk pengontrol program adalah Conditional Jump.
Ada dua bagian jenis JUMP yaitu unsigned (yang tidak mepedulikan tanda positif atau
negatif) dan signed conditional jump. Ada juga instruksi yang jump yang tidak
mengecek tanda dari nilai. Perhatikan tabel perintah jump dibawah ini:B

-- Unsigned conditional jumps
JA Jump if above
JAE Jump if above or equal
JB Jump if below
JBE Jump is below or equal
JNA Jump if not above (same as JBE)
JNAE Jump if not above or equal (same as JB)
JNB Jump if not below (Same as JBE)
JNBE Jump if not below or equal (same as JA)

-- Signed conditional jumps
JG Jump if greater
JGE Jump if greater of equal
JL Jump if less
JLE Jump if less or equal
JNG Jump if not greater (same as JLE)
JNGE Jump if not greater or equal (same as JGE)
JNL Jump if not lower (same as JGE)
JNLE Jump if not lower or equal (same as JG)

-- Conditional jump (dont matter if it's signed or not)
JZ Jump if zero
JE Jump if equal (same as JZ)
JNZ Jump if not zero
JNE Jump is equal (same as JNZ)

JZ atau JE pada dasarnya instruksi yang berdasarkan pengecekkan pada Zero Flag.
Ini biasanya penting bagi crakerz untuk melewati suatu subrutin dengan cara mengeset
langsung zero flag-nya.

Perintah jump yang sering digunakan adalah JZ, JNZ, JA dan JB.

JMP

JA
JB
JNA
JNB
JE
JZ

LOOP

CALL
RET

INT
IRET


* Pencabangan program *

Cara pencabangan program (conditional brach) adalah menggunakan instruksi yang
mengecek flag-flag tertentu (dalam BASIC: if flag=1 then go to ...).

Setiap akhir instruksi, flag-flag di-set/reset sesuai dengan hasilnya.
Perhatikan contoh berikut:

MOV AL, BL ; AL=BL
CMP AL,07 ; bandingkan AL dengan 07, jika sama: set zero di set,
; jika AL < 07 flag borrow di set JZ ... (suatu alamat) ; check flag: apakah flag zero set? jika ya loncat ke alamat ... Untuk mengecek bit-bit tertentu dapt digunakan TEST Untuk mengecek nol atau tidaknya suatu register dapat digunakan 'CMP AL, 0' atau 'OR AL, AL' (instruksi ini lebih sering digunakan karena dalam byte yang lebih kecil). * LOOPING * Looping atau iterasi (pengulangan proses sampai beberapa kali) merupakan aspek terpenting bagi semua level pemrograman. Instruksi LOOP
adalah sama dengan urutan instruksi:

DEC CX ; CX = CX-1
JZ

Jadi jika kita ingin membuat rutin yang diulang n kali:

MOV CX, n ; Isi register CX dengan n

address_loop1:
PUSH CX ; Simpan di stack isi CX, agar tidak hilang

... ; Rutin yang diulang sebanyak n kali
...

POP CX ; kembalikan dari stack isi CX
LOOP address_loop1 ; CX = CX-1; kalau CX=0 loncat ke address_lopp1 diatas

Dengan konsep yang sama kita dapat menggunakan register lain misalnya:

XOR BX, BX ; BX = 0

address_loop2:
PUSH BX ; Simpan BX

... ; Rutin yang diulang sebanyak n kali
...

POP BX ; Kembalikan BX
INC BX ; BX = BX+1
CMP BX,n ; Bandingkan BX dengan n
JNE address_loop2 ; Kalau tidak sama (belum sampai) loncat ke address_loop2



* SUBRUTIN (FUNGSI) *

Subrutin dapat juga disebut prosedur atau fungsi. Dalam Low Level programming subrutin di-
handle dengan instruksi CALL (go to subroutine) dan RET (return from subroutin).

Perhatikan contoh berikut:

MOV AX, BX ; AX = BX
CALL routine_1 ; Go to subroutin routine_1 (pemanggil 1)

return1:
MOV [1234],CX ; Save hasilnya ke alamat 1234h
MOV AX, DX ; AX = DX
CALL routine_1 ; Go to subrutin routine_1 (pemanggil 2)

return2:
MOV [1236], CX ; Save hasilnya ke alamat 1236h

...
...

routine_1:
SHL AX, 1 ; AX = AX*2
INC AX ; AX = AX+1
MOV CX, AX ; Simpan hasilnya ke CX
RET ; Lanjutkan program ke program pemanggil
; jika pemanggil dari pemanggil 1; loncat ke return 1
; Jika pemanggil dari pemanggil 2; loncat ke return 2


* INTERRUPT *

Interrupt dapat dibedakan menjadi 2, yaitu interrupt software dan interupt hardware.
Interrupt hardware selalu mempunyai handler berupa interupsi software
Interupsi hardware menggunakan jalur interupsi pada mikroprosessor (IRQ = Interrupt Request)

Interupsi software berfungsi sebagai subrutin.
Rutin yang ada dalam rutin interupsi berguna dalam meng-handle [ermintaan interupsi,
misalnya: keyboard di tekan, mouse digerakkan, dll.

Dengan cara interupsi, maka program tidak perlu menunggu masukkan dan tidak perlu
men-cek status dari peminta-interupsi, pada saat peminta interupsi minta dilayani,
barulah program dialihkan ke rutin peng-handle interupsi dan setelah itu, program
dilanjutkan.

Interupsi memiliki nomor agar dikenali. Misalnya

INT 8 : Clock timer (setiap detik diapnggil 18.2 kali)
INT 9 : diapnggil setiap tombol keyboard ditekan

Selain itu interupsi juga berguna sebagai subrutin (rutin-rutin ayng memiliki kegunaan
tertentu). misalnya:

INT 21 : berisi DOS service
INT 10 : berisi video service
INT 13 : berisi disk service
dan lain-lain

Contoh:

XOR AX, AX ; AX = 0 ; untuk disk service int 13h, digunakan untuk reset
INT 13h ; Panggil interrupt 13

Tabel interrupt yang memuat no interrupsi dan fungsinya pada IBM PC, terdapat di literatur DOS
dan BIOS (basic Input Otpur Service)

MEMULAI MEMPROGRAM DI DOS



Tools yang perlu digunakan:
Sistem operasi Microsoft DOS yang dilengkapi dengan debug.exe atau debug.com
Turbo Assembler (TASM) atau Microsfot Macro Assembler (MASM)
Turbo debugger

Struktur Assambler


Bahasa asembler memiliki struktur

[instruction] [parameter] [comments]

perintah (instruction) adalah kode yang akan dieksekusi oleh mesin, instruction ada
yang memiliki parameter ada yang tidak. Comments adalah komentar yang dapat ditambahkan
pada source code kita untuk memperjelas kode yang kita buat, kometar ni ditandai dengan
awalan ";"

Untuk pembuatan program pada DEBUG di Microsoft DOS, kita tidak akan menggunakan komentar2
Buat apa? toh file yang bisa dibuat juga kecil, cukup dapat dimengerti tanpa perlu komentar

Menggunakan Debug dari DOS

Debug haya dapat membuat file .COM dan tebatas sampai berukuran 64 kb dan
memulai programnya pada segmen memory yang khusus yaitu dengan offset 0100h
Dengan debug kita dapat melihat nilai pada internal register dalam CPU.

Operasi/perintah pada debug:

A Assemble symbolic instructions into machine code
D Display the contents of an area of memory
E Enter data into memory, beginning at a specific location
G Run the executable program in memory
N Name a program
P Proceed, or execute a set of related instructions
Q Quit the debug program
R Display the contents of one or more registers
T Trace the contents of one instruction
U Unassembled machine code into symbolic code
W Write a program onto disk

Untuk memulai debug ketikan perintah debug pada promt DOS anda:

C:\>debug [Enter]

Seteleh masuk program debug, anda akan mendapatkan prompt dengan tanda
-

Ketikan r untuk melihat isi register pada CPU

-r [Enter]

maka akan terlihat isi dari register pada CPU sepeti berikut:

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B15 ES=0B15 SS=0B15 CS=0B15 IP=0100 NV UP EI PL NZ NA PO NC
0B15:0100 09E8 OR AX,BP

Untuk melihat register khusus misalnya DX saja, maka anda dapat memberikan perintah
"r" diikuti dengan option yang nenunjukan register yang ingin dilihat isinya

-rdx [Enter]
DX 0000
:

sekarang prompt anda berganti menjadi ":" bukan "-" untuk melihat register lain kita
hanya perlu menuliskan registernya setelah prompt ":" lalu enter, untuk melihat nilai
register yang sebelumnya kita hanya perlu menekan enter, tanpa perlu menuliskan alamat
registernya.

Membuat program asembler sederhana dengan debug


Untuk "menyiapkan" (assamble) suatu program dalam debug kita menggunakan perintah
"a" diikuti dengan parameter yang berupa offset dari register yang ditunjukan oleh
CS:IP. Kita akan membuat program .COM yang biasanya diinlisialisasi pada 0100h.
Pada saat kita menuliskan perintah asembler maka debug akan memberikan alamt register
diawal baris berformat CS:IP. Buatlah program kecil dengan mengetikan perintah berikut
pada prompt debug kita:

a 100[enter]
mov ax,0002[enter]
mov bx,0004[enter]
add ax,bx[enter]
nop[enter][enter]

program ini melakukan penyimpanan nilai 0002 pada register AX, kemudian menyimpan nilai
0004 ke register BX, menambahkan nilai di register BX dengan nilai di register AX dan
menyimpan hasilnya ke register AX, dan terakhir perintah "nop" (no operation)untuk
mengakhiri program.

Kita akan mendapatkan hasil di layar seperti ini:

C:\>debug
-a 100
0B15:0100 mov ax,0002
0B15:0103 mov bx,0004
0B15:0106 add ax,bx
0B15:0108 nop
0B15:0109
-

untuk melihat hasil (men-trace) program dalam tiap-tiap sterp instruksi maka kita dapat
memberikan perintah "t" pada promt debug

-t


AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B15 ES=0B15 SS=0B15 CS=0B15 IP=0103 NV UP EI PL NZ NA PO NC
0B15:0103 BB0400 MOV BX,0004
-t

AX=0002 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B15 ES=0B15 SS=0B15 CS=0B15 IP=0106 NV UP EI PL NZ NA PO NC
0B15:0106 01D8 ADD AX,BX
-t

AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B15 ES=0B15 SS=0B15 CS=0B15 IP=0108 NV UP EI PL NZ NA PE NC
0B15:0108 90 NOP
-

terlihat bahwa pada register AX dihasilkan nilai 0006 yang merupakan penambahan dari register
BX dan register AX sebelumnya (0004 + 0002)

Untuk menyimpan program tersebut dalam file .COM maka pertama kita tentukan dulu besarnya
file yang berisi perintah2 tersebut, dengan perintah "h" yang diikuti parameter address
akhir dari intruksi (0109) dan address awal intruksi (0100)

-h 0109 100
0209 0009

besarnya file yang diperlukan adalah nilai kedua dari hasil perintah tersebut yaitu 0009
Langkah kedua adalah memberinama program yaitu dengan perintah "n" diikuti dengan nama
file.

-n coba.com

Informasi besarnya suatu file disimpan pada register CX, untuk itu kita perlu menuliskan
besarnya file ini pada register tersebut hal ini bisa dilakukan dengan perintah "rcx"

-rcx
CX 0000
:0009

untuk melihat berapa besar file yang telah kita buat dan disimpan gunakan perintah "w"

-w
Writing 00009 bytes

untuk keluar dari program debug gunakan perintah "q" atau "quit"
Sekarang cobalah untuk menjalankan program coba.com kita, dengan mengetik coba atau coba.com
pada prompt dos

C:\>coba.com

kita akan mendapatkan pesan error, hal ini karena program kita diakhiri dengan perintah yang
salah yaitu "nop" Perintah dalam program dos yang akan dijalankan harus diakhiri dengan
interrupt 20h yaitu dengan perintah "int 20"
Cobalah ganti perintah "nop" dengan "int 20" lalu save dan coba jalankan, sekarang program kita
akan jalan tanpa pesan error dan tanpa output apa-apa (karena memang kita tidak membuat program
yang menghasilkan putput).

Men-debug Program yang sudah ada/jadi

Untuk mendebug program yang sudah ada misalnya coba.com tadi, maka load file dengan perintah debug
dengan paramater nama file yang akan di"debug"

C:\>debug coba.com

cara lain adalah dengan masuk program debug kemudian memberinama file program yang akan didebug
kemuadian me-load file tersebut dengan perintah "l":

C:\>debug
-n coba.com
-l
-u 0100 0109
0B89:0100 B80200 MOV AX,0002
0B89:0103 BB0400 MOV BX,0004
0B89:0106 01D8 ADD AX,BX
0B89:0108 CD20 INT 20

Perintah terakhir "u" yang diikuti dengan awal address register dan akhir register adalah untuk
melihat perintah pada file program coba.com pada range address tersebut.
Pada kolom ketiga dari ouput perintah tersebut adalah kode bahasa mesin representasi dari instruksi
asemblernya.

Membuat Program Dengan Compiler (TASM/MASM)

Ok, cukup untuk pengenalan debug, sekarang kita mulai dengan real assemby language programming.
Untuk memulai memprogram asembler siapkan program editor, kompiler dan linker.
Dalam tutorial ini akan dijelaskan membuat program asembler dengan Turbo asembler (TASM).
Dengan TASM anda pertama akan membuat file source code dengan eksternsi .ASM kemudian file
tersebut dikompilasi menjadi file .OBJ yang berisi instruksi2 bahasa masin tapi belum dapat
dimengerti oleh mikroprosesor, kemudian file tersebut harus di-link menggunakan linker (TLINK)
untuk mendapatkan file executable berekstensi .EXE yang dapat kita jalankan.

Kita akan membuat program asembler sederhana yang akan mengeluarkan output tulisan "Hello, World!"
pada layar, untuk itu
Pertama buatlah file dengan nama hello.asm dengan editor kesukaan anda, seperti ini :

DOSEG
.MODEL SMALL
.STACK 200h
.DATA
message db "Hello, World!" 13, 10, "$"
.CODE

mov ax, msg message ; mov isi dari msg message ke regisrter ax
mov ds, ax ; mov isi dari AX ke DS
mov dx, offset msg ; mov offset dari msg ke dx
mov ah, 09 ; memberikan perintah pada interrupt 21h agar
; mendisplay pesan di layar
int 21h
mov ax, 4c00h ; keluar dari program
int 21h ; interrupt untuk keluar dari program dos dengan safe

END

Save file tersebut dalam format ASCII dengan nama HALO.ASM kemudian kompile program tersebut
dengan tasm.exe

C:\>tasm halo.asm

hasil dari perintah tersebut kita akan mendapatkan file halo.obj yang kemudian akan kita link
dengan program tlink dari turbo asembler.

C:\>tlink halo.obj

hasilnya adalah file executable bernama halo.exe, dan file ini bisa dieksekusi (dijalankan)
akan menhasilkan output:

C:\>halo.exe
Hello, World!

Sekarang kita bahas baris-perbaris dari file program asembler kita


1. DOSEG
DOSEG digunakan untuk mengurutkan segmen berdasarkan standar DOS yaitu:
1) 'code' segments (in alphabetical order)
2) 'data' segments (in alphabetical order)
3) 'stack' segments (again, in alphabetical order)

Gunakan perintah ini pada awal kode sumber yang akan dikompilasi.

2. .MODEL [OPTION]
.MODEL digunakan jika hanya diinginkan pensimplifikasian segmen.
.MODEL secara mudahnya merupakan fungsi untuk memilih MODEL sehingga
program nantinya dapat di linked oleh program lain, baik dari program
dengan bahsa asembler maupun bukan seperti C PASCAL dll.

Pengaksesan address untuk memanggil/mencapai data pada memori dapat
dibedakan menjadi;

NEAR yang berarti kode/data dapat diakses menggunakan sebuah pointer
16 bit (offset)
FAR yang berarti harus digunakan pasangan SEGMENT:OFFSET untuk mengakses
kode/data

Option untuk model adalah:

TINY:Code and Data must fit in same 64k segment.
Both Code and Data are NEAR.

SMALL:Code & Data have seperate segment, but must be each less than 64k
Both Code and Data are NEAR.
For most applications, this will suffice.

MEDIUM:Code may be larger than 64k, but Data has to be less than 64k
Code is FAR, Data is NEAR.

COMPACT:Code is less than 64k, but Data may be greater than 64k
Code is NEAR, Data is FAR.

LARGE:Both Code & Data can be greather than 64k. Both are FAR, but a
single array cannot be greater than 64k. Note that max array size
means nothing if you are just writing in assembler. This only
matters when you link to C or another high level language.

HUGE:Same as LARGE, but arrays can be greater than 64k.
What that means is that the array index is a far pointer, instead
of a NEAR one LARGE and HUGE are identicle to the assembler programmer..

3. .STACK 200h
perintah ini memberitahu kompiler untuk mensetup sebuah 200h stack ketika
program dieksekusi.
Catatan: besarnya stack yang dipilih tidak menpengaruhi besarnya file program
hasil kompilasi.

Perintah tersebut juga dapat dilakukan dengan seperti ini:

: MyStack SEGMENT PARA PUBLIC STACK 'STACK'
: db 200h dup (0)
: MyStack ENDS

tapi dengan perintah tersebut selain tidak simple hasil file executable nya
juga akan lebih besar 512 byte.

4. .DATA
sintaks .DATA digunakan untuk memulai mendefinisikan suatu varibel

(akan diteruskan nanti..)

5. .CODE
.CODE menandakan awal dari kode program kita

6. END
sintaks END menandakan akhir dari kode program atau subrutin

Contoh program Akecil lain:

.model small
.stack
.code
mov ah,2h
mov dl,2ah
int 21h
mov ah,4ch
int 21h
end

Tidak ada komentar:

Posting Komentar

Pengunjung kiranya memberikan saran yg dapat membantu kami dalam penyempurnaan isi dari blog.