DASAR TEORI
A. INSTRUKSI
ARITMATIKA
1.
OPERASI
PERNAMBAHAN
a.
ADD
Untuk menambah dalam bahasa assembler
digunakan perintah ADD dan ADC serta INC. Perintah ADD digunakan dengan syntax :
ADD Tujuan,Asal
Perintah ADD ini akan menambahkan nilai
pada Tujuan dan Asal. Hasil yang didapat akan ditaruh pada Tujuan, dalam bahasa
pascal sama dengan instruksi Tujuan:=Tujuan
+ Asal. Sebagai contohnya :
MOV AH,15h ; AH:=15h
MOV AL,4 ; AL:=4
ADD AH,AL ; AH:=AH+AL, jadi AH=19h
Perlu anda perhatikan bahwa pada
perintah ADD ini antara Tujuan dan Asal harus mempunyai daya tampung yang sama,
misalnya register AH(8 bit) dan AL(8 bit), AX(16 bit) dan BX(16 bit). Mungkin ada yang bertanya-tanya, apa yang
akan terjadi bila Tujuan tempat hasil penjumlahan disimpan tidak mencukupi
seperti pertambahan 1234h dengan F221h.
1234 h Biner
--> 0001 0010 0011 0100
F221 h Biner
--> 1111 0010 0010 0001

10455h 1 0000 0100 0101 0101
Pada pertambahan diatas dapat dilihat
bahwa pertambahan bilangan 1234 dengan F221 akan menghasilkan nilai 10455.
Supaya lebih jelas dapat anda lihat pada pertambahan binernya dihasilkan bit ke
17, padahal register terdiri atas 16 bit saja. Operasi pertambahan yang
demikian akan menjadikan carry flag menjadi satu, Contoh :
MOV AX,1234h ; NIlai AX:=1234h dan
carry=0
MOV BX,0F221h ; Nilai BX:=F221h dan
carry=0
ADD AX,BX ; Nilai AX menjadi 0455h dan
carry=1
b.
ADC
Perintah ADC digunakan dengan cara yang
sama pada perintah ADD, yaitu :
ADC Tujuan,Asal
Perbedaannya pada perintah ADC ini
Tujuan tempat menampung hasil pertambahan Tujuan dan Asal ditambah lagi dengan
carry flag (Tujuan:=Tujuan+Asal+Carry). Pertambahan yang demikian bisa
memecahkan masalah seperti yang pernah kita kemukakan, seperti pertambahan pada
bilangan 12345678h+9ABCDEF0h. Seperti
yang telah kita ketahui bahwa satu register hanya mampu menampung 16 bit, maka
untuk pertambahan seperti yang diatas bisa anda gunakan perintah ADC untuk
memecahkannya, Contoh:
MOV AX,1234h ; AX = 1234h CF = 0
MOV
BX,9ABCh ; BX = 9ABCh CF = 0
MOV CX,5678h ; BX = 5678h CF = 0
MOV DX,0DEF0h ; DX = DEF0h CF = 0
ADD CX,DX ; CX = 3568h CF = 1
ADC AX,BX ; AX = AX+BX+CF = ACF1
Hasil penjumlahan akan ditampung pada
register AX:CX yaitu ACF13568h. Adapun
flag-flag yang terpengaruh oleh perintah ADD dan ADC ini adalah CF,PF,AF,ZF,SF
dan OF.
c.
INC
Perintah INC(Increment) digunakan khusus
untuk pertambahan dengan 1. Perintah INC hanya menggunakan 1 byte memory,
sedangkan perintah ADD dan ADC menggunakan 3 byte. Oleh sebab itu bila anda
ingin melakukan operasi pertambahan dengan 1 gunakanlah perintah INC. Syntax
pemakainya adalah :
INC Tujuan
Nilai pada tujuan akan ditambah dengan
1, seperti perintah Tujuan:=Tujuan+1 dalam Turbo Pascal. Tujuan disini dapat
berupa suatu register maupun memory. Contoh : perintah INC AL akan menambah
nilai di register AL dengan 1. Adapun flag yang terpengaruh oleh perintah ini
adalah OF,SF,ZF,AF dan PF.
2.
Pengurangan
a.
SUB
Untuk Operasi pengurangan dapat
digunakan perintah SUB dengan syntax:
SUB Tujuan,Asal
Perintah SUB akan mengurangkan nilai
pada Tujuan dengan Asal. Hasil yang didapat akan ditaruh pada Tujuan, dalam
bahasa pascal sama dengan instruksi Tujuan:=Tujuan-Asal.
Contoh :
MOV AX,15 ; AX:=15
MOV BX,12 ; BX:=12
SUB AX,BX ; AX:=15-12=3
SUB AX,AX ; AX=0
Untuk menolkan suatu register bisa anda
kurangkan dengan dirinya sendiri seperti SUB AX,AX.
b.
SBB
Seperti pada operasi penambahan, maka
pada operasi pengurangan dengan bilangan yang besar(lebih dari 16 bit), bisa
anda gunakan perintah SUB disertai dengan SBB(Substract With Carry). Perintah
SBB digunakan dengan syntax:
SBB Tujuan,Asal
Perintah SBB akan mengurangkan nilai Tujuan dengan Asal dengan
cara yang sama seperti perintah SUB, kemudian hasil yang didapat dikurangi lagi
dengan Carry Flag(Tujuan:=Tujuan-Asal-CF).
Contoh
:
ORG 100h
TData :
JMP Proses ; Lompat ke Proses
ALo EQU 0EFFFh
AHi EQU 122h
BLo EQU 0FFFFh
Bhi EQU 0FEh
HslLo DW ?
HslHi DW ?
Proses :
MOV AX,ALo ; AX=EFFFh
SUB AX,Blo ; Kurangkan EFFF-FFFF, jadi AX=F000
MOV HslLO,AX ; HslLo bernilai F000
MOV AX,AHi ; AX=122h
SBB AX,BHi ; Kurangkan 122-FE-Carry, AX=0023
MOV HslHi,AX ;
HslHi bernilai 0023
INT
20h ; Kembali ke DOS
END Tdata
Disini dapat kita lihat begaimana
caranya mendefinisikan suatu nilai constanta(nilai yang tidak dapat dirubah)
dan variabel dengan :
ALo EQU 0EFFFh
AHi EQU 122h
BLo EQU 0FFFFh
Bhi EQU 0FEh
HslLo DW ?
HslHi DW ?
Perintah EQU digunakan untuk
mendefisisikan suatu yang constan(Tetap), data yang telah didefinisikan dengan
perintah EQU tidak dapat dirubah. Dengan perintah EQU kita mendefinisikan bahwa
ALo = 0EFFF, AHi=122, BLo=FFFF dan BHi=0FE. Untuk menampung hasil dari
pengurangan A-B(122EFFF-FEFFF) nantinya, kita definisikan suatu tempat untuk
menyimpannya dengan nama HslLo dan HslHi. Tanda '?' digunakan untuk menyatakan
bahwa tempat yang kita pesan sebanyak sebanyak 1 word (DW) tidak diberikan data awal yang akan terdapat pada varibel
tersebut(HslLo dan HslHi). Jadi data yang akan terdapat pada HslLo dan HslHi
bisa apa saja dan kita tidak mengetahuinya. Tempat data program kita lompati
dengan perintah JMP supaya komputer tidak mengeksekusi data program sebagai
perintah.
MOV AX,ALo
SUB AX,Blo
MOV HslLO,AX
Untuk mengurangkan angka 122EFFF dengan
0FEFFFF kita dapat mengurangkan word rendah dari angka tersebut dahulu, yaitu
EFFF- FFFF. Hal ini dikarenakan daya tampung register yang hanya 16 bit. Dapat
anda lihat bahwa pengurangan EFFF-FFFF akan menyebabkan terjadinya
peminjaman(Borrow), hasil word rendah(F000) yang didapatkan kemudian kita
simpan pada variabel HslLo.
122 EFFF
FE FFFF
---------- -
023 F000
Sampai saat ini kita sudah selesai
mendapatkan nilai pada word rendahnya, yang disimpan pada variabel HslLo.
MOV AX,AHi
SBB AX,BHi
MOV HslHi,AX
Langkah selanjutnya adalah menghitung
word tingginya yaitu pengurangan 122-FE-Carry dengan menggunakan perintah SBB
maka masalah tersebut dengan mudah terpecahkan. Akhirnya kita akan mendapatkan
hasil pengurangan dari 122EFFF-0FEFFFF yaitu 23F000 yang tersimpan pada
pasangan HslHi:HslLo(0023F000).
c.
DEC
Perintah DEC(Decrement) digunakan khusus
untuk pengurangan dengan 1. Perintah DEC hanya menggunakan 1 byte memory,
sedangkan perintah SUB dan SBB menggunakan 3 byte. Oleh sebab itu bila anda
ingin melakukan operasi pengurangan dengan 1 gunakanlah perintah DEC. Syntax
pemakaian perintah dec ini adalah:
DEC Tujuan
Nilai pada tujuan akan dikurangi 1,
seperti perintah Tujuan:=Tujuan-1 dalam Turbo Pascal. Tujuan disini dapat
berupa suatu register maupun memory. Contoh : perintah DEC AL akan mengurangi
nilai di register AL dengan 1.
Contoh
:
Mov AL,10h ; isi AL
bengan nilai 10h
Dec
AL ; kurangkan nilai AL dengan 1
3.
OPERASI
PERKALIAN
Untuk perkalian bisa digunakan perintah MUL dengan syntax:
MUL Sumber
Sumber disini dapat berupa suatu
register 8 bit(Mis:BL,BH,..), register 16 bit(Mis: BX,DX,..) atau suatu
varibel. Ada 2 kemungkinan yang akan terjadi pada perintah MUL ini sesuai
dengan jenis perkalian 8 bit atau 16 bit.
Bila Sumber merupakan 8 bit seperti MUL BH maka komputer akan mengambil
nilai yang terdapat pada BH dan nilai pada AL untuk dikalikan. Hasil yang
didapat akan selalu disimpan pada register AX. Bila sumber merupakan 16 bit
seperti MUL
BX maka komputer akan mengambil nilai yang terdapat pada BX dan nilai
pada AX untuk dikalikan. Hasil yang didapat akan disimpan pada register DX dan
AX(DX:AX), jadi register DX menyimpan Word tingginya dan AX menyimpan Word
rendahnya.
ORG 100h
TData :
JMP Proses ; Lompat ke Proses
A DW 01EFh
B DW 02FEh
HslLo DW ?
HslHi DW ?
Proses:
MOV AX,A ; AX=1EF
MUL B ; Kalikan 1FH*2FE
MOV HslLo,AX ; AX bernilai C922 sehingga HslLo=C922
MOV HslHi,DX ; DX bernilai 0005 sehingga HslHi=0005
INT 20h ; Kembali ke DOS
END TData
4.
PEMBAGIAN
a.
DIV
Operasi pada pembagian pada dasarnya
sama dengan perkalian. Untuk operasi pembagian digunakan perintah DIV dengan
syntax:
DIV Sumber
Bila sumber merupakan operand 8 bit seperti DIV BH, maka komputer akan mengambil nilai pada register AX dan
membaginya dengan nilai BH. Hasil pembagian 8 bit ini akan disimpan pada
register AL dan sisa dari pembagian akan disimpan pada register AH.
Bila sumber merupakan
operand 16 bit seperti DIV BX,
maka komputer akan mengambil nilai yang terdapat pada register DX:AX dan membaginya
dengan nilai BX. Hasil pembagian 16 bit ini akan disimpan pada register AX dan
sisa dari pembagian akan disimpan pada register DX.
ORG 100h
TData :
JMP Proses ; Lompat ke Proses
A DW 01EFh
B DW 2
Hsl DW ?
Sisa DW ?
Proses:
SUB DX,DX ; Jadikan DX=0
MOV AX,A ; AX=1EF
DIV B ; Bagi 1EF:2
MOV Hsl,AX ; AX bernilai 00F7 sehingga Hsl=00F7
MOV Sisa,DX ; DX berisi 0001 sehingga Sisa=0001
INT 20h ; Kembali ke DOS
B.
INSTRUKSI LOGIKA
1.
GERBANG
NOT
Operator NOT akan menginvers suatu nilai seperti yang terlihat
pada gambar berikut .
A
|
NOT
A
|
1
|
0
|
0
|
1
|
Hasil dari operasi not ini akan disimpan pada Tujuan, sebagai contoh, instruksi NOT AL,3Fh akan menghasilkan nilai C0h
bagi AL. Mungkin masih ada pembaca yang bingung dengan operasi ini. Baiklah
untuk lebih jelasnya kita lihat operasi di atas secara per bit
3 F = 0011 1111
Not 3F : C 0 = 1100
0000
2.
GERBANG AND
Operator AND akan menghasilkan nilai nol bila salah satu
operandnya bernilai nol. Dan hanya akan bernilai satu bila kedua operandnya
bernilai satu.
A
|
B
|
OUTPUT
|
0
|
0
|
0
|
0
|
1
|
0
|
1
|
0
|
0
|
1
|
1
|
1
|
Hasil dari operasi AND ini akan disimpan pada Tujuan, sebagai contoh, instruksi :
MOV AL,3Fh
MOV BL,1Ah
AND AL,BL
Perintah diatas akan menghasilkan nilai 1A bagi register AL. Ingatlah :
Setiap bit yang di AND dengan 0 pasti menghasilkan bit 0
juga, sedangkan setiap bit yang di AND dengan
1 akan menghasilkan bit itu sendiri.
3.
GERBANG OR
Operator logik OR akan menghasilkan
nilai nol bila kedua operannya bernilai nol dan satu bila salah satunya
bernilai satu.
A
|
B
|
OUTPUT
|
0
|
0
|
0
|
0
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
Hasil dari operasi OR ini akan disimpan pada Tujuan, sebagai contoh, instruksi :
MOV AL,3Fh
MOV BL,1Ah
OR AL,BL
Hasil operasi OR diatas akan menghasilkan nilai 3F bagi register
AL.
Ingatlah :
Setiap bit yang di OR dengan
0 pasti menghasilkan bit itu sendiri, sedangkan setiap bit yang di OR dengan 1 pasti menghasilkan bit.
4. GERBANG EXOR
Operator XOR akan menghasilkan nol untuk dua nilai yang
sama nilainya dan satu untuk yang berbeda.
A
|
B
|
OUTPUT
|
0
|
0
|
0
|
0
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
0
|
.
Hasil dari operasi XOR ini akan disimpan pada Tujuan, sebagai, contoh instruksi :
MOV AX,0A12h
XOR AX,AX
Hasil operasi XOR diatas pasti akan menghasilkan nilai 0 bagi
register AX.
Ingatlah: Setiap
bilangan yang di XOR dengan
bilangan yang sama pasti menghasilkan bilangan 0.
5. TEST
Perintah Test digunakan untuk mengetahui nilai pada suatu bit,
dengan syntax :
TEST Operand1,Operand2
Perintah test akan mengAND
kedua nilai operand, tetapi hasil yang didapatkan tidak akan berpengaruh
terhadap nilai kedua operand tersebut. Setelah perintah Test dilaksanakan yang
akan terpengaruh adalah Flags, sehingga perintah ini sering diikuti dengan
perintah yang berhubungan dengan kondisi flags. Adapun flags yang terpengaruh
adalah CF,OF,PF,ZF,SF dan AF.
TEST AX,0Fh
JNZ Proses ; Lompat jika Zerro flag 0
Pada perintah diatas komputer akan menuju ke label Proses bila ada
satu bit atau lebih dari AX yang sama dengan 0Fh. Bila diikuti dengan perintah JC Proses, maka komputer akan menuju
ke label proses bila keempat byte rendah pada AL semuanya 1(?F).
SHL ( Shift Left )
Operator SHL akan menggeser operand1 ke
kiri sebanyak operand2 secara per bit. Kemudian bit kosong yang telah tergeser
di sebelah kanannya akan diberi nilai nol. Operator SHL digunakan dengan syntax
:
SHL Operand1,Operand2
Operand2 harus digunakan register CL
bila pergeseran yang dilakukan lebih dari satu kali.
Instruksi :
MOV AX,3Fh
MOV CL,3
SHL AX,CL ; Geser 3 bit ke kiri
Akan menghasilkan nilai F8h pada register AX. Operasi detilnya
dapat dilihat di bawah ini.
3Fh : 0011
1111
SHL 1 :
0111 1110 (=7Eh)
SHL 2 :
1111 1100 (=FCh)
SHL 3 : 1111 1000 (=F8h)
SHR ( Shift Right )
Operator SHR akan menggeser operand1 ke kanan sebanyak operand2
secara per bit dan menambahkan nilai nol pada bit yang tergeser seperti halnya
pada operator SHL. Operator SHR digunakan dengan syntax :
SHR Operand1,Operand2
Operand2 harus digunakan register CL bila pergeseran yang
dilakukan lebih dari satu kali.
MOV CL,3
SHR AX,CL ; Geser 3 bit ke kanan
Akan menghasilkan nilai 07h pada register AX. Operasi detilnya
dapat dilihat di bawah ini.
3Fh : 0011
1111
SHR 1 :
0001 1111 (=1Fh)
SHR 2 :
0000 1111 (=0Fh)
SHR 3 : 0000 0111 (=07h)
LAPORAN PRESENTASI
A. Judul
Presentasi : PENGGUNAAN INTRUKSI ARITMATIKA DAN LOGIKA
B. Hasil
Presentasi :
Untuk
presentasi yang pertama kami menjalankan program sepertti di bawah ini :
ORG 00h
MOV AL,2
MOV AH,3
ADD AL,AH
ADD byte ptr [20],AL
ADD BL, byte ptr [20]
ADD BL,3
MOV AL,2
MOV AH,3
ADD AL,AH
ADD byte ptr [20],AL
ADD BL, byte ptr [20]
ADD BL,3
RET
Dalam
presentasi ini tidak ada permasalahan yang ada :
Presentasi
yang ke dua kami menjalankan program di bawah ini :
ORG 00h
MOV AL,100
MOV BL,3
MUL BL
RET
Dalam
presentasi ini ada beberapa permasalahan yang kami dapatkan yaitu :
1. Perbedaan
Mul dengan Imul...?
2. Perbedaan
Div dengan Idiv...?
Pada
presentasi yang ketiga kami menjalankan program seperti di bawah ini:
ORG
0
MOV
AL,0
MOV
BL,0
INC
AL
DEC
BL
MOV
CL,11110000b
MOV
DL,11110000b
NOT
CL
NEG
DL
RET
Dalam presentasi yang ketiga ini
kami juga di hadapkan dengan beberapa permasalahan yaitu :
1. Apakah
yang di magsud dengan ORG dan Bagiamana penggunaannya dalam bahasa asembly ?
2. Apa
Hubungan pembelajaran intruksi aritmatika dan logika dengan bahasa assembly ?
C. Pembahsan
Masalah :
1. Perbedaan
antara intruksi MUL dengan IMUL pada intruksi perkalian :
MUL
: digunakan pada proses perkalian bilangn tak bertanda
Contoh
: ORG 00h
MOV AL,100
MOV
BL,3
MUL BL
RET
IMUL : digunakan pada
proses perkalian bilangan bertanda.
Contoh : ORG 00h
MOV AL,100
MOV
BL,-3
MUL BL
RET
2. Perbedaan
antara intruksi DIV dan IDIV
DIV
: digunakan untuk intruksi pembagian pada bilangan tak bertanda
Contoh
: ORG 00h
MOV AL,100
MOV BL,3
DIV BL
RET
IDIV
: digunakan untuk intruksi pembagian pada bilangan bertanda
Contoh
: ORG 00h
MOV AL,100
MOV BL,-3
DIV BL
RET
3. ORG
dan Penggunaannya.
Org
100h adalah directiv kompiler yang mengatakan pada kompiler bagaiamana
menangani source kode, directiv ini sangat penting digunakan saat kita bekerja
dengan variabel. Directiv tersebut mengatakan pada kompiler tersebut bahwa file
exesutable akan di muat pada offset 100h. Jadi kompiler harus menghitung alamat
yang benar untuk semua variabel ketika dia mengganti nama variabel dengan
offsetnya.
4. Penggunaan
instruksi aritmetik dan logika:
Karena
dalam proses bahasa asembly menggunakan perintah intruksi aritmetika dan logika
pada penggunaannya.
Mas bisa kirim gambar ke muhamaddwirama@gmail.com
BalasHapus