Boolean dan
instruksi perbandingan
Instruksi boolean berdasarkan operasi aljabar boolean. Operasi-operasi ini
dapat melakukan modifikasi terhadap bit tunggal dalam biner, berikut
penjelasannya
AND =
Menghasilkan 1 jika kedua bit inputnya bernilai 1
OR =
Menghasilkan 1 jika salah satu inputnya bernilai 1
XOR =
Menghasilkan 1 jika kedua inputnya berbeda (disebut exclusive-OR)
NOT =
Hasilnya merupakan kebalikan dari bit input (misal 1 menjadi 0)
Instruksi AND melaksanakan operasi boolean AND menggunakan dua buah operand
8-bit atau 16-bit dan menempatkan hasil pada operand tujuan, sintaknya adalah
AND tujuan,sumber
Masing-masing operand harus mempunyai ukuran yang sama, dan hanya satu
diantaranya yang mengacu ke memori (operand memori). Untuk setiap bit yang
sesuai dalam operand, jika kedua nilainya 1 maka bit hasilnya 1. Akan tetapi,
kalau tidak maka hasilnya 0. Flag-flag yang terpengaruh adalah overflow, sign,
zero, parity, dan auxiliary carry. Berikut adalah contoh dari operasi AND 4 bit
:
0 0 1 1
AND 0 1 0 1
Hasil 0 0 0 1
Ketika dua buah byte atau world di-AND maka setiap posisi bit dihitung
secara terpisah :
Mov al, 00111011b
And al, 00001111b ; AL =
00001011b
Mengahapus bit tertinggi. Beberapa program pemroses kata (misalnya ws) menset
bit tertinggi kode ASCII karakter. Jika kita akan menampilkan file teks pada
konsol maka kita harus menghapus bit tertinggi masing-masing karakter yang akan
ditampilkan.
Contoh program berikut mengutip input yaitu serangkaian teks dari input
standar, menghapus bit tertinggi, dan menulis byte yang diperbaiki ke output
standar :
Mov cx, 10000
L1 : Mov ah,6
Mov dalam, 0FFH
Int 21h
And al, 01111111h
Mov dl, al
Mov ah, 2
Int 21h
Loop L1
Menghapus nilai bit status. Aplikasi yang sama dalam AND berhubungan dengan
byte status keyboard, yang berada pada alamat 0040:0017; bit 5 menandakan bahwa
key NumLock sedang on. Untuk mematikan NumLock, cara yang mudah adalah
menghapus bit tersebut :
Push ds
Mov ax, 40h
Mov ds, ax
Mov bx, 17h
And byte ptr[bx], 11011111b
Pop ds
Instruksi OR
Instruksi OR melaksanakan operasi boolean OR menggunakan operand sumber dan
tujuan meletakkan hasilnya dalam operand tujuan. Sintaksnya adalah :
OR tujuan,sumber
Operand-operand tersebut mungkin 8 bit atau 16 bit asak ukurannya sama.
Hanya satu saja yang bisa mengacu ke memori(operand memori)
Untuk setiap bit yang sesuai pada kedua operand maka berlaku suatu aturan.
Jika salah satu dari keduanya bernilai 1 maka hasilnya adalah 1. Jika keduanya
0 maka hasilnya 0. Flag-flag yang terpengaruh adalah overflow, sign, zero,
parity, auxiliary carry, dan carry. Berikut adalah contoh hasil operasi OR :
0 0 1 1
OR 0 1 0 1
Hasil 0 1 1 1
Contohnya, 3Bh di OR dengan 0Fh maka hasilnya empat bit paling bawah diset
dan empat bit tertinggi bernilai tetap :
Mov al, 00111011b
Or al, 00001111b ; AL = 3Fh
Instruksi XOR
Instruksi XOR melaksanakan operasi boolean XOR menggunakan operand sumber dan tujuan dan menempatkan hasil
operanda tujuan, sintaknya :
OR tujuan, sumber
Operand mungkin 8-bit atau 16-bit, asalkan panjangnya sama. Hanya salah
satu operand yang mengacu pada memori (operand memori)
Untuk setiap bit yang sama pada kedua operand, berlaku suatu aturan. Jika
kedua bit bernilai sama (keduanya 0 atau 1) maka hasilnya 0. Kalau tidak sama
maka hasilnya 1. Flag-flag yang terpengaruh adalah overflow, sign, zero,
parity, auxiliary carry, dan carry.
Contoh berikut menunjukkan efek XOR pada masing-masing bit :
0 0 1 1
XOR 0 1 0 1
Hasil 0 1 1 0
Instruksi berikut mengahasilkan nilai 32h dalam AL :
Mov al, 10110100b
Xor al, 10000110b ; AL = 00110010b, atau 32h
Membalikkan bit. Kelebihan instruksi XOR adalah dapat membalikkan nilai
dirinya sendiri jika dilakukan dua kali. Misalkan kita punya nilai x, kemudian
di XOR dengan y dan menghasilkan z. Ketika z di XOR lagi dengan y maka hasilnya
akan sama dengan x. contohnya :
11010101 x
XOR 11110000 y
Hasil 00100101 z
XOR 11110000 y
Hasil 11010101 x
Membalik bit status. Kita dapat membolak balik status key CapsLock dengan
menset bit 6 flag status sebagai berikut :
Push ds
Mov ax, 20h
Mov ds, ax
Mov bx, 17h
Xor byte ptr [bx],
0100000b
Pop bs
Instruksi NOT
Instruksi NOT membalikkan semua bit dalam operand. Hasilnya disebut ones
complement. Sintaknya sebagai berikut :
NOT operand
Contoh, ones complement F0h adalah 0Fh maka :
Mov
al, 11110000 ; AL = 11110000b
Not al ;
AL = 00001111b
Instruksi NEG
INstruksi NEG membalikkan tanda bilangan dengan membalikkannya menjadi twos
complement. Sintaknya adalah :
NEG tujuan
Setelah melaksanakan operasi NEG, periksa flag overflow barangkali terjadi
kesalahan pada operand hasil. Contoh, jika kita memindahkan 128 ke dalam AL dan
kemudian menegasikannya, hasilnya masih tetap 128, dan overflow di set :
Mov al, -128 ;
AL = 10000000b
Neg al ;
AL = 10000000b, OF = 1
Pada kasus lain, untuk bilangan +127, hsilnya akan benar dan flag overflow
bernilai 0.
Mov al, +127 ;
AL = 01111111b
Neg al ;
AL = 10000001b, OF = 0
Instruksi Test
Instruksi test melaksanakn operasi AND secara tidak langsung pada operand
tujuan menggunakan operand sumber. Flag dipengaruhi, tetapi operand tidak
berubah. Sintaknya adalah :
TEST tujuan, sumber
Jika setiap posisi bit yang sesuai diset pada kedua operand maka ZF akan
bernilai 0. Flag-flag yang terpengaruh adalah overflow, sign, zero, carry,
auxiliary carry dan parity.
Instruksi CMP
Instruksi
CMP menawarkan cara yang baik untuk membandingkan operand 8-bit dan 16-bit.
Hasilnya ditunjukan oleh status register flag. Instruksi CMP
melaksanakan pengurangan secara tidak langsung operand sumber dari operand
tujuan, tanpa mengubah kedua operand. Sintaknya :
CMP tujuan, sumber
Hanya satu operand yang mengacu ke memori. Operand tujuan tidak boleh
operand immediate atau register IP, tidak boleh juga register segmen. Flag-flag yang
terpengaruh : overflow, sign, zero, carry, auxiliary carry dan parity. Kondisi flag. Umumnya hanya tiga flag yang penting. Tabel berikut
menunjukan bagaimana flag terpengaruh.
Sesudah CMP Hasil Flag
Tujuan < sumber CF = 1
Tujuan = sumber ZF = 1
Tujuan > sumber CF = 0, ZF = 0
Contoh-contoh berikut menunjukan bagaimana flag diset ketika nilai
dibandingkan :
Contoh 1
mov al, 5
cmp al, 10 ; CF = 1
melaksanakan pengurangan secara tidak langsung operand sumber dari operand
tujuan, tanpa mengubah kedua operand. Sintaknya :
CMP tujuan, sumber
Hanya satu operand yang mengacu ke memori. Operand tujuan tidak boleh
operand immediate atau register IP, tidak boleh juga register segmen. Flag-flag yang
terpengaruh : overflow, sign, zero, carry, auxiliary carry dan parity. Kondisi flag. Umumnya hanya tiga flag yang penting. Tabel berikut
menunjukan bagaimana flag terpengaruh.
Sesudah CMP Hasil Flag
Tujuan < sumber CF = 1
Tujuan = sumber ZF = 1
Tujuan > sumber CF = 0, ZF = 0
Contoh-contoh berikut menunjukan bagaimana flag diset ketika nilai
dibandingkan :
Contoh 1
mov al, 5
cmp al, 10 ; CF = 1
Conditional Jump
INTRUKSI LOMPAT KONDISIONAL
Instruksi lompat kondisional memindahkan kendali ke alamat tujuan ketika
kondisi flag bernilai benar. Sintaknya sebagai berikut :
JCond tujuan
Alamat tujuan harus antara -128 - +127 byte dari lokasi sekarang. Cond
mengacu pada kondisi flag, mengidentifikasi satu atau lebih keadaan.
Contoh :
Kondisi
|
arti
|
C
|
Carry
Flag diset
|
NC
|
Carry
Flag tidak diset (clear)
|
Z
|
Zero Flag
diset
|
NZ
|
Zero Flag
tidak diset (clear)
|
Kita lihat bahwa flag diset oleh instruksi aritmetik,
perbandingan dan boolean. Setiap instruksi jump kondisional memeriksa satu atau
beberapa flag, menegmbalikan hasil benar atau salah. Jika hasilnya benar maka
jump dilakukan. Sebaliknya, jika salah maka tidak ada yang dilakukan dan
instruksi selanjutnya akan dilakukan.
Penggunaan CMP. Misalkan akan jump ke lokasi equal
pada saat AX dan BX sama. Pada contoh berikut, CMP set ZF jika AX=BX. Instruksi
JE akan lompat jika ZF=1.
Cmp ax,bx
Je equal
Not_equal :
...
...
Jmp exit
Equal :
...
Exit :
Mnemonic
|
penjelasan
|
Kondisi
flag
|
JZ
|
Loncat jika nol
|
ZF=1
|
JE
|
Loncat jika sama (jika op1=op2)
|
|
JNZ
|
loncat jika tidak nol
|
ZF=0
|
JNE
|
Loncat jika tidak sama (jika op1=op2)
|
|
JA
|
Loncat jika diatas (jika op1>op2)
|
CF=0 dan ZF=0
|
JNBE
|
Loncat jika tidak lebih rendah (jika op1 tidak
<=op2)
|
|
JAE
|
Loncat jika lebih atau sama (jika op1 >=op2)
|
CF=0
|
JNB
|
Loncat jika tidak lebih rendah (jika op1 tidak
<op2)
|
|
JB
|
Loncat jika lebih rendah (op1<op2)
|
CF=1
|
JNAE
|
Loncat jika tidak lebih atas atau sama (jika op1
tidak >=op2)
|
|
JC
|
Loncat jika ada carry
|
|
JBE
|
Loncat jika tidak lebih rendah atau sama (jika op1
<=op2)
|
CF=1 atau ZF=1
|
JNA
|
Loncat jika tidak lebih atas (jika op1 tidak
>op2)
|
|
JCXZ
|
Loncat jika CX = 0
|
CX=0
|
JP
|
Loncat jika parity genap
|
PF = 1
|
JNP
|
Loncat jika tidak ada parity
|
PF=0
|
APLIKASI MENGGUNAKAN JUMP KONDISIONAL
Dafta jump berdasarkan perbandingan bertanda
Mnemonic
|
penjelasan
|
Kondisi
flag
|
JG
|
Loncat jika lebih besar
|
ZF=0 dan SF=OF
|
JNLE
|
Loncat jika tidak lebih kecil atau sama dengan
|
|
JGE
|
loncat jika lebih besar atau
sama dengan
|
SF=OF
|
JNL
|
Loncat jika tidak lebih kecil
|
|
JL
|
Loncat jika lebih kecil
|
SF <> OF
|
JNGE
|
Loncat jika tidak lebih besar atau sama dengan
|
|
JLE
|
Loncat jika kurang atau sama dengan
|
ZF=1 atau SF <> OF
|
JNG
|
Loncat jika tidak lebih besar
|
|
JS
|
Loncat jika bertanda
|
SF=1
|
JNS
|
Loncat jika tidak bertanda
|
SF=0
|
JO
|
Loncat jika overflow
|
OF=1
|
JNO
|
Loncat jika tidak overflow
|
OF=1
|
Kunci keyboard tambahan
rutin berikut menangani kode ASCII dan kunci tambahan :
Key db ?
...
...
Mov ah,8
Int 21h
Cmp al,0
Jne L1
Int 21h
L1 : mov key, al
Nilai lebih besar dari dua bilangan
Membandingkan nilai tidak bertanda dalam AX dan BX dan memindahkan nilai yang lebih besar ke dalam
DX.
Contoh program :
Mov dx,ax
Cmp ax,bx
Jae quit
Mov dx,bx
Quit ;
Nilai terkecil dari tiga bilangan
Instruksi berikut ini membandingkan nilai bertanda dalam AL, BL dan CL
dan memindahkan nilai yang paling kecil ke variabel small :
Mov small, al
Cmp small, bl
Jbe L1
Mov small, bl
L1 : cmp small,cl
Jbe L2
Mov small,cl
L2 :
Enkripsi file
Berikut ini contoh penggunaan XOR digabungkan dengan JMP dan JZ untuk
melaksanakan aplikasi ekripsi data :
Top : mov ah,6
Mov dl,0FFh
Int 21h
Jz quit
Xor al,239
Mov ah,2
Mov dl,al
Int 21h
Jmp top
Quit : mov ax, 4000h
Int 21h
Konversi huruf kapital
Program upcase.asm di bawah mengonversi setiap karakter yang dituliskan
menjadi kapital. Program akan berakhir jika ENTER ditekan.
Instruksi CMP,JB dan JA bersama-sama membangun perintah kondisi yang
memeriksa apakah karakter huruf kecil, sebagai berikut :
Title program tampilan huruf kapital
Dosseg
.model small
.stack 100h
.code
Main proc
A1: mov ah,8
Int 21h
Cmp al,0DH
Je A3
Cmp al, ‘a’
Jb A2
Cmp al,’z’
Ja A2
Sub al, 32
A2 : mov ah,2
Mov dl,al
Int 21h
Jmp Al
A3 : mov ax,4000h
Int 21h
Main endp
End main
Konverensi file text
Beberapa program pemroses kata menset bit tertinggi karakter pada saat
memformat file text. Karakter tersebut sulit untuk dibaca menggunakan tipe
perintah DOS. Program CONVERT.ASM, dibawah berfungsi untuk membaca karakter
dari input standar, mengeluarkan karakter yang tidak diinginkan, dan menulis
karakter hasil pada output standart. Akhir setiap baris dalam file teks di
akhiri dua byte yang mengandung 0Dh dan 0Ah, akhir file ditandaidengan sebuah
byte yang mengandung 1AH.
Berikut ini contoh program
konversi file :
Title
program konversi file
Dosseg
.model
small
.stack 100h
Ctrlz equ 1AH
Cr equ
0Dh
If equ 0Ah
Tab equ 09h
Space equ 20h
.code
Main proc
A1 : mov
ah,6
Mov dalam, 0FFh
Int 21h
Jz A3
Cmp al, ctrlz
Je A3
And al,
01111111b
Cmp al,cr
Je A2
Cmp al,if
Je A2
Cmp al,tab
Je A2
Cmp al, space
Je A1
A2 : mov
dalam, al
Mov ah,2
Int 21h
Jmp A1
A3 : mov
ax,4000h
Int 21h
Main endp
End main
Conditional Loop
Intruksi Loopz (Loope)
Instruksi
LOOPZ (LOOPE) meliup ketika CX > 0 dan ZF = 1. Tujuan harus berada dalam
range -128 - +127 byte dari lokasi sekarang. Sintaknya sebagai berikut:
LOOPZ tujuan
LOOPE tujuan
Pertama,
CX ditentukan. Kemudian, jika CX > 0 dan ZF = 1, CPU loncat ke tujuan,
sebaliknya, jika tidak ada yang terjadi maka akan melanjutkan pada instruksi
berikutnya,
Contoh:
membaca array. Berikut ini contoh pembacaan array 100 elemen integer sampai
ditemukan nilai bukan nol. Instruksi CMP membandingkan integer dengan 0. Jika
ketemu maka menset ZF = 1, jika ditemukan nilai bukan nol, LOOPZ tidak lagi
meloncat ke atas:
Mov bx, offset intarray
Sub
bx, 2
Mov cx, 100
Next
: add bx, 2
Cmp word ptr [bx], 0
Loopz next
...
...
Intarray
dw 100 dup(?)
Baris
5 menset ZF = 1 setiap kali elemen array yang ditemui sama dengan nol. Baris 6
meliup ke next jika CX > 0 dan ZF = 1.
Intruksi
Loopnz (Loppne)
Instruksi
LOOPNZ adalah kebalikan dari perintah LOOPZ. Liupan akan terus hanya jika CX
> 0 dan ZF = 0. Contoh berikut membaca setiap bilangan dalam array 8-bit
sampai menemukan nilai positif:
Array db -3,
-6, -1, -10, 10, 30, 40, 4
Array_len equ $ array
...
...
Mov si, offset array -1
Mov cx, array_len
Next :
Inc si
Test byte ptr [i], 80h
Loopnz next
Struktur Logic
Tingkat Tinggi
Dalam
bahasa assembly tidak ada struktur perintah IF, ELSE, WHILE, dsb. Namun
struktur perintah logic dalam bahasa tingkat tinggi tersebut dapat dilaksanakan
dalam bahasa assembly dengan menggabungkan beberapa perintah sehingga secara
prinsip sama dengan perintah tsb.
PERNYATAAN
IF
Perintah
IF membandingkan dua buah nilai yang diikuti oleh perintah jika kondisi yang
diperboleh benar, seperti contoh berikut:
If(op1 = op2) then
<pernyataan1>
<pernyataan2>
Edit
Berikut
ini program dalam bahasa assembly yang serupa dengan program di atas:
Cmp op1, op2
Jne next_label
<pernyataan1>
<pernyataan2>
Next_label :
Menggabungkan
IF dengan operator OR. Perhatikan contoh pseudocode berikut dimana salah satu
dari empat kondisi menghasilkan
pernyataan1:
If (AL>op1) or (AL>= op2) or
(AL = op3) or (AL < op4) then
<pernyataan1>
endif
program
diatas diterjemahkan ke dalam bahasa assembly dengan menggunakan perintah IF
bersarang.
Cmp al, op1
Jg L1
Cmp al, op2
Jge L1
Cmp al, op3
Je
L1
Cmp al, op4
Jl L1
Jmp L2
L1 : <pernyataan1>
L2 :
Menggabungkan
IF dengan operator AND. Pada contoh pseudocode berikut, semua empat kondisi
harus bernilai agar pernyataan1 dieksekusi:
If(AL>op1) and (AL >= op2) and
(AL = op3) and (AL < op4) then <pernyataan1>
Endif
Terjemahkan
dalam bahasa assembly dari program diatas adalah
Cmp al, op1
Jng next_label
Cmp al, op2
Jnge next_label
Cmp al, op3
Jne next_label
Cmp al, op4
Jne next_label
<pernyataan1>
Next_label :
STRUKTUR
WHILE
Struktur
while pertama kali memeriksa kondisi sebelum melaksanakan satu blok perintah.
Selama pemeriksaan bernilai benar maka perintah – perintah tersebut akan
diulangi:
Do while (op1<op2)
<perintah1>
<perintah2>
Enddo
Dalam
assembly dapat dilakukan sebagai berikut
Do_while :
Cmp op1,op2
Jnl enddo
<perintah1>
<perintah2>
Jmp do_while
Enddo :
STRUKTUR
REPEAT ... UNTIL
Struktur
repeat ... until mengeksekusi satu atau lebih perintah dalam sebuah blok
minimal sekali dan melaksanakan pemeriksaan kondisi pada bagian bawah liupan.
Contoh berikut, dua kondisi diperiksa sebelum liupan diulangi:
Repeat
<perintah1>
<perintah2>
<perintah3>
Until (op = op2) or (op1 > op2)
Dalam
bahasa assembly, hasil pemeriksaan pertama dimasukkan ke dalam stack; setelah
pemeriksaan kedua, hasil pertama diambil dari stack dan di-OR-kan dengan hasil
kedua. Berikut ini contoh terjemahan dalam bahasa assemblynya:
Repeat :
<perintah1>
<perintah2>
<perintah3>
Test1 : mov ax, 0
Cmp op1, op2
Jne test2
Mov ax, OFFh
Test2 : push ax
Or dx, ax
Jz endup
Jmp repeat
Endup :
Aplikasi
diatas tidak efisien. Berikut ini contoh program yang lebih efisien untuk
melaksanakan strukstur repeat .. until
Repeat:
<perintah1>
<perintah2>
<perintah3>
Test1 :
Cmp op1,op2
Je endup
Test2:
Cmp op1, op3
Jng repeat
Endup :
STRUKTUR
CASE
Struktur case melakukan pencabangan
banyak dengan membandingkan sebuah nilai terhadap beberapa nilai. Berikut ini
contoh pemilihan aksi berdasarkan nilai variabel input, dalam pascal:
‘A’ : proses_A;
‘B’ : proses_B;
‘C’ : proses_C;
‘D’ : proses_D;
End;
Dalam
bahasa assembly, setiap pilihan khusus dibuat dalam perbandingan secara
terpisah, diikuti oleh loncat ke label:
Mov al, input
Cmp al, ‘A’
Je proses_A
Cmp al, ‘B’
Je proses_B
Cmp al, ‘C’
Je proses_C
Cmp al, ‘D’
Je proses_D
Jika
kita akan memanggil prosedur untuk setiap kasus maka kita harus menyisipkan
perintah call pad setiap kasus yang dipilih, sebagai berikut:
Mov
al, input
Cmp al, ‘A’
Jne L1
Call proses_A
Jmp L4
L1
: cmp al, ‘B’
Jne L2
Call proses_B
Jmp L4
L2: cmp al, ‘C’
Jne L3
Call proses_C
Jmp L4
L3:
cmp al, ‘D’
Jne L4
Call proses_D
Jmp L4
L4:
TABEL
OFFSET
Cara
yang lebih efisien untuk memperoleh struktur CASE adalah dengan membuat tabel
offset yang mengandung ofset tabel atau prosedur. Asembler dapat menghitung
ofset label dan menempatkannya dalam variabel.
Tabel
offset sangat efektif diterapkan pada perbandingan yang banyak. Pernyataan
berikut mendefinisikan tabel yang mengandung nilai dan alamat prosedur yang
akan di panggil:
Casetable
db ‘A’
dw proses_A
db ‘B’
dw proses_B
db ‘C’
dw proses_C
db ‘D’
dw proses_C
misalkan
proses_A, proses_B, proses_C, dan proses_D berada pada alamat 0120h, 0130h,
0140h dan 0150h, berturut- turut. Tabel akan disusun dalam memori sebagai
berikut:
‘A’
|
0120
|
‘B’
|
0130
|
‘C’
|
0140
|
‘D’
|
0150
|
AL
dibandingkan terhadap setiap isi dalam tabel, menggunakan liupan. Yang pertama
sesuai ditemukan dalam tabel menyebabkan pemanggilan offset prosedur yang
disimpan sesudah nilainya:
Mov al, input
Mov bx, offset casetable
Mov cx, 4
L1: cmp
al, [bx]
Jne L2
Call word ptr [bx+1]
Jmp L3
L2: add
bx, 3
Loop L1
L3:
Tidak ada komentar:
Posting Komentar