Anda di halaman 1dari 5

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 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 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 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 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 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 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 shift sebelah kiri ditekan


2 ctrl ditekan
3 alt ditekan
4 keaktifkan ScrollLock
5 keaktifan NumLock
6 keaktifkan CapsLock
7 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:

Anda mungkin juga menyukai