BAB 8 OPERASI LOGIKA

BAB 8
OPERASI LOGIKA
Ada empat operasi logika yang sering dilakukan, yaitu AND, OR, XOR
dan NOT, dimana pada masing-masing operasi dilakukan untuk
pengaturan bit pada suatu data biner.

Operasi AND

Operasi AND sering digunakan untuk operasi masking bit tertentu
menjadi nol, maupun untuk mendeteksi apakah suatu bit aktif atau tidak,
setelah dilakukan operasi AND, maka akan diperiksa ZF=1, jika benar
artinya bit tersebut tidak aktif. Adapun operasi dari AND adalah sebagai
berikut:
0
0
1
1

and
and
and

and

0
1
0
1

=
=
=
=

0
0
0
1

Contoh:
MOV AL, 'a' ; AL = 01100001b
AND AL, 11011111b ; AL = 01000001b ('A')

RET

Operasi AND juga dapat digunakan untuk menghitung sisa bagi dest :=
dest MOD 2n
and ax, 3 ;AX := AX mod 4
and ax, 0Fh ;AX := AX mod 16
and ax, 1Fh ;AX := AX mod 32
and ax, 3Fh ;AX := AX mod 64
and ax, 7Fh ;AX := AX mod 128
mov ah, 0 ;AX := AX mod 256
; (Same as ax and 0FFh)

Operasi OR

Operasi OR sering digunakan untuk operasi masking bit tertentu
menjadi satu, adapun operasi OR adalah sebagai berikut:
0
0
1
1


or
or
or
or

0
1
0
1

=
=
=
=

0
1
1
1


Example:
MOV AL, 'A' ; AL = 01000001b
OR AL, 00100000b ; AL = 01100001b ('a')
RET

Perintah OR juga sering digunakan untuk memeriksa apakah suatu
register berisi nilai
nol.

Contoh:
CMP AX, 0 dapat ditulis juga OR AX, AX

Operasi XOR
Operasi OR sering digunakan untuk membalikkan kondisi bit tertentu,
maupun untuk
menolkan suatu register, misalnya penulisan MOV AX, 0 dapat diganti
dengan XOR
AX,AX,
B80000 MOV AX,0000

31C0 XOR AX,AX ;lebih efisien

Dalam hal ini XOR AX, AX lebih pendek dari pada MOV AX,0
Adapun operasi dari XOR adalah sebagai berikut :
0
0
1
1

xor
xor
xor
xor

0
1
0
1

=

=
=
=

0
1
1
0

Contoh:
MOV AL, 00000111b
XOR AL, 00000010b ; AL = 00000101b
RET

Operasi NOT

Operasi NOT digunakan untuk membuat bilangan komplemen satu yaitu
membalikan
keaktifkan bit, adapun operasi NOT adalah sebagai berikut:
NOT 0 = 1

NOT 1 = 0

Contoh:
MOV AL, 00011011b
NOT AL ; AL = 11100100b

Pemakaian Operasi Logika

Operasi logika sering digunakan untuk memanipulasi status dari
perangkat keras, misalnya untuk mendeteksi, mengaktifkan maupun
mematikan bit-bit tertentu. Pada IBM PC Compatible data daftar peralatan
dapat diperoleh dari data word di lokasi 0040:0010 pada BIOS Data Area
dengan setting sebagai berikut ini: bit 0 Jika bernilai 0, artinya komputer
tidak memiliki drive disket bit 1 1 berarti terdapat numeric coprocessor bit
2-3 memori motherboard: 01=16K; 10=32K; 11=64K+ (biasanya bernilai
00 pada PC modern, sehingga tidak ada artinya) Pada PS/2, jika bit 2
bernilai 1 ketika suatu mouse terdeteksi pada saat POST bit 4-5 Video
adaptor yang sedang aktif 00 = reserver, 01 = 40 clm color, 10 = 80- clm
color, 11 = TTL Monochrome bit 6-7 Jumlah drive disket yang terdeteksi
00=1; 01=2;10=3;11=4 bit 8 1 = hardware DMA tersedia (tidak reliable)


bit 9-11 RS-232 serial port yang terdeteksi 000=0, 001=1, ... 100=4 ...
111=7 bit 12 1 = adapter game (joystick) terdeteksi oleh POST bit 13
(hanya pada PCjr) 1 = printer serial terpasang bit 14- 15 jumlah dari port
printer parallel 00=0, 01=1, 10=2, 11=3 Sehingga untuk mendeteksi
keberadaan drive disket kita dapat melakukan operasi AND word settting
tersebut diatas dengan nilai $1, jika hasil operasi tersebut not zero (zero
flag), maka berarti disk drive terpasang. Untuk mendeteksi keberadaan
coprocessor dapat dilakukan dengan melakukan operasi And word setting
tersebut diatas dengan nilai $2.

Operasi logika pada x86

Tata cara penulisan operasi logika pada x86 dan register flag yang
terpengaruh ditunjukan pada tabel berikut ini: Format instruksi Fungsi
Flags terpengaruh AND dest, src operasi logika and dari dua operand, dan
mengembalikan hasil pada dest. CF, OF, PF, SF, ZF (AF tak terdefinisi) OR
dest, src operasi logika or dari dua operand, dan mengembalikan hasil
pada dest. CF, OF, PF, SF, ZF (AF tak terdefinisi) XOR dest, src operasi
logika or dari dua operand, dan mengembalikan hasil pada dest. CF, OF,

PF, SF, ZF (AF tak terdefinisi) NOT dest mengembalikan invers bit pada
dest TEST dest, src melakukan operasi AND dari dua operand dan
mengupdate register CF, OF, PF, SF, ZF (AF tak terdefinisi) flag, tetapi
tidak mengembalikan hasil pada dest.
-a 100
0B46:0100 mov ax,0040
0B46:0103 mov ds,ax
0B46:0105 mov ax,[0010]
0B46:0108 and ax,1
0B46:010B
-t
AX=0040 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000
DI=0000
DS=0B46 ES=0B46 SS=0B46 CS=0B46 IP=0103 NV UP EI PL NZ NA PO
NC
0B46:0103 8ED8 MOV DS,AX
-t
AX=0040 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000
DI=0000
DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=0105 NV UP EI PL NZ NA PO NC

0B46:0105 A11000 MOV AX,[0010] DS:0010=C822
-t
AX=C822 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000
DI=0000
DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=0108 NV UP EI PL NZ NA PO NC
0B46:0108 250100 AND AX,0001
-t
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000
DI=0000
DS=0040 ES=0B46 SS=0B46 CS=0B46 IP=010B NV UP EI PL ZR NA PE NC

Operasi tersebut diatas dapat dijelaskan bahwa pada awalnya akan
diduplikasi nilai 0040 ke register AX, kemudian nilai dari register AX akan
diduplikasi ke register DS, dan akan diduplikasi nilai dari lokasi memori
0040:0010 ke register AX, dan kemudian akan dilakukan operasi AND
register AX dengan nilai $1. Berdasarkan hasil T (Trace) yang dilakukan
terlihat bahwa hasil akhir register AX adalah 0000 dan ZR (Zero flag aktif),
berarti bahwa tidak ada drive disket yang terpasang.
org 100h
push ds

mov ax,40h
mov ds,ax
mov ax,[10h]
pop ds
and ax,2h
jz cetak_tidak_ada
mov dx, offset ada
jmp cetak
cetak_tidak_ada:
mov dx, offset tidak_ada
cetak:
mov ah,9h
int 21h
mov ah,4ch
int 21h
ada db 'ada coprocessor.',0dh,0ah,'$'
tidak_ada db 'tidak ada coprocessor.',0dh,0ah,'$'

Adapun program tersebut diatas dapat dijelaskan bahwa pada
awalnya akan didorong nilai register DS ke stack, kemudian duplikasi nilai
40 ke register AX, kemudian diduplikasi nilai AX ke DS, kemudian
diduplikasi isi memori yang ditunjuk oleh DS: [0010] dalam hal ini adalah
0040:1000 ke register AX, dan kemudian register AX di AND dengan nilai
$2, dan tarik kembali nilai dari stack ke register DS, berdasarkan hasil
operasi AND akan diuji nilai Zero flag, jika aktif akan dicetak ‘tidak ada
coprocessor’ dan sebaliknya akan dicetak ‘ada coprocessor’. Sesuatu hal
yang perlu diingat bahwa perintah TEST tidak menyimpan nilai hasil
operasi, tetapi hanya mempengaruhi flag. Perintah test dapat digunakan
untuk memeriksa apakah suatu register bernilai nol atau tidak, contoh:
Sesuatu hal yang perlu diingat bahwa operasi TEST tidak menyimpan nilai
hasil operasi, tetapi hanya mempengaruhi flag. Test dapat digunakan
untuk memeriksa apakah suatu register bernilai nol atau tidak.
85C0 TEST AX,AX
3D0000 CMP AX,0000

Dalam hal ini TEST AX,AX lebih pendek dibandingkan dengan CMP AX,AX.

Latihan
Byte pada 0040:0017 pada BIOS Data Area menunjukan status keyboard
sebagai berikut ini : bit Status 0 shift sebelah kanan ditekan

1
2
3
4
5
6
7

shift sebelah kiri ditekan
ctrl ditekan
alt ditekan
keaktifkan ScrollLock
keaktifan NumLock
keaktifkan CapsLock
Keaktifan Insert

1. Buatlah program Assembly yang dapat menampilkan pesan keaktifan
tombol
CapsLock (CapsLock Aktif, CapsLock tidak Aktif).
2. Buatlah program Assembly yang menon-aktifkan tombol Capslock
3. Buatlah program Assembly yang mengaktifkan tombol NumLock
4. Buatlah program Assembly yang dapat membalikkan status tombol
Capslock (On
menjadi Off dan sebaliknya).
5. Modifikasi soal latihan nomor tiga bab sebelumnya agar password yang
dimasukan tidak case sensitif.

LATIHAN TAMBAHAN
CGA video memori untuk text mode terdapat dilokasi memori
B800:0000 s/d B800:0F9F untuk halaman pertama. Masing-masing
karakter yang ditampilkan pada layar terdiri dari menggunakan satu
WORD, yaitu low byte adalah nilai ASCII dari karakter, dan high byte
adalah atribut (background dan foreground). Misalnya pada posisi baris 0,
kolom 0 ditampilkan huruf A dengan warna latarbelakang black dan warna
tulisan light gray, maka isi memori B800:0000 adalah $41 dan isi memori
B800:0001 adalah $07.
1. Buatlah program yang dapat mengubah atribut layar menjadi
latarbelakang
merah dan warna tulisan light gray tanpa mengubah tulisan yang ada.
2. Buatlah program yang dapat mengubah karakter pada layar menjadi
huruf
besar semua.
3. Buatlah program yang dapat mengubah karakter pada layar menjadi
huruf
kecil semua.
4. Dengan menggunakan nested loop, buatlah program yang dapat
menampilkan
urutan angka berikut :
12345 54321
1234 5432
123 543
12 54
15

5. Buatlah program yang dapat menampilkan suatu daftar ASCII dengan
tampilan
sebagai berikut: