WELCOME TO MY BLOG

Selasa, 27 Agustus 2019

Boolean dan instruksi Perbandingan


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
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

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: