Perakitan - Instruksi Logis

Set instruksi prosesor menyediakan instruksi logika Boolean AND, OR, XOR, TEST, dan NOT, yang menguji, mengatur, dan membersihkan bit sesuai dengan kebutuhan program.

Format untuk instruksi ini -

Sr.No. Petunjuk Format
1 DAN AND operand1, operand2
2 ATAU ATAU operand1, operand2
3 XOR Operand XOR1, operand2
4 UJI TEST operand1, operand2
5 TIDAK TIDAK operand1

Operan pertama dalam semua kasus dapat berupa register atau memori. Operan kedua dapat berupa register / memori atau nilai langsung (konstan). Namun, operasi memori-ke-memori tidak dimungkinkan. Instruksi ini membandingkan atau mencocokkan bit dari operand dan mengatur tanda CF, OF, PF, SF dan ZF.

Petunjuk AND

Instruksi AND digunakan untuk mendukung ekspresi logika dengan melakukan operasi AND bitwise. Operasi bitwise AND mengembalikan 1, jika bit yang cocok dari kedua operan adalah 1, jika tidak, mengembalikan 0. Misalnya -

Operand1: 	0101
             Operand2: 	0011
----------------------------
After AND -> Operand1:	0001

Operasi AND dapat digunakan untuk membersihkan satu atau lebih bit. Misalnya, register BL berisi 0011 1010. Jika Anda perlu menghapus bit orde tinggi ke nol, Anda DAN dengan 0FH.

AND	BL,   0FH   ; This sets BL to 0000 1010

Mari kita ambil contoh lainnya. Jika Anda ingin memeriksa apakah suatu bilangan ganjil atau genap, tes sederhananya adalah memeriksa bit yang paling tidak signifikan dari bilangan tersebut. Jika ini 1, angkanya ganjil, jika tidak angkanya genap.

Dengan asumsi nomor tersebut ada dalam register AL, kita dapat menulis -

AND	AL, 01H     ; ANDing with 0000 0001
JZ    EVEN_NUMBER

Program berikut menggambarkan hal ini -

Contoh

section .text
   global _start            ;must be declared for using gcc
	
_start:                     ;tell linker entry point
   mov   ax,   8h           ;getting 8 in the ax 
   and   ax, 1              ;and ax with 1
   jz    evnn
   mov   eax, 4             ;system call number (sys_write)
   mov   ebx, 1             ;file descriptor (stdout)
   mov   ecx, odd_msg       ;message to write
   mov   edx, len2          ;length of message
   int   0x80               ;call kernel
   jmp   outprog

evnn:   
  
   mov   ah,  09h
   mov   eax, 4             ;system call number (sys_write)
   mov   ebx, 1             ;file descriptor (stdout)
   mov   ecx, even_msg      ;message to write
   mov   edx, len1          ;length of message
   int   0x80               ;call kernel

outprog:

   mov   eax,1              ;system call number (sys_exit)
   int   0x80               ;call kernel

section   .data
even_msg  db  'Even Number!' ;message showing even number
len1  equ  $ - even_msg 
   
odd_msg db  'Odd Number!'    ;message showing odd number
len2  equ  $ - odd_msg

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Even Number!

Ubah nilai dalam register kapak dengan digit ganjil, seperti -

mov  ax, 9h                  ; getting 9 in the ax

Program akan menampilkan:

Odd Number!

Demikian pula untuk menghapus seluruh register Anda bisa DAN dengan 00H.

Instruksi ATAU

Instruksi OR digunakan untuk mendukung ekspresi logika dengan melakukan operasi OR bitwise. Operator bitwise OR mengembalikan 1, jika bit yang cocok dari salah satu atau kedua operan adalah satu. Ia mengembalikan 0, jika kedua bit tersebut nol.

Sebagai contoh,

Operand1:     0101
             Operand2:     0011
----------------------------
After OR -> Operand1:    0111

Operasi OR dapat digunakan untuk mengatur satu atau lebih bit. Sebagai contoh, mari kita asumsikan register AL berisi 0011 1010, Anda perlu menyetel empat bit orde rendah, Anda dapat ATAU dengan nilai 0000 1111, yaitu FH.

OR BL, 0FH                   ; This sets BL to  0011 1111

Contoh

Contoh berikut menunjukkan instruksi OR. Mari kita simpan nilai 5 dan 3 masing-masing di register AL dan BL, lalu instruksi,

OR AL, BL

harus menyimpan 7 di register AL -

section .text
   global _start            ;must be declared for using gcc
	
_start:                     ;tell linker entry point
   mov    al, 5             ;getting 5 in the al
   mov    bl, 3             ;getting 3 in the bl
   or     al, bl            ;or al and bl registers, result should be 7
   add    al, byte '0'      ;converting decimal to ascii
	
   mov    [result],  al
   mov    eax, 4
   mov    ebx, 1
   mov    ecx, result
   mov    edx, 1 
   int    0x80
    
outprog:
   mov    eax,1             ;system call number (sys_exit)
   int    0x80              ;call kernel
	
section    .bss
result resb 1

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

7

Instruksi XOR

Instruksi XOR mengimplementasikan operasi XOR bitwise. Operasi XOR menetapkan bit resultan ke 1, jika dan hanya jika bit dari operan berbeda. Jika bit dari operan sama (keduanya 0 atau keduanya 1), bit resultan dihapus ke 0.

Sebagai contoh,

Operand1:     0101
             Operand2:     0011
----------------------------
After XOR -> Operand1:    0110

XORing operan dengan sendirinya mengubah operan menjadi 0. Ini digunakan untuk menghapus register.

XOR     EAX, EAX

Instruksi TEST

Instruksi TEST bekerja sama dengan operasi AND, tetapi tidak seperti instruksi AND, ini tidak mengubah operan pertama. Jadi, jika kita perlu memeriksa apakah suatu bilangan dalam register genap atau ganjil, kita juga dapat melakukan ini menggunakan instruksi TEST tanpa mengubah nomor aslinya.

TEST    AL, 01H
JZ      EVEN_NUMBER

Instruksi NOT

Instruksi NOT mengimplementasikan operasi bitwise NOT. Operasi NOT membalikkan bit-bit dalam operan. Operand dapat berupa register atau memori.

Sebagai contoh,

Operand1:    0101 0011
After NOT -> Operand1:    1010 1100