Montaj - Mantıksal Talimatlar

İşlemci komut seti, programın ihtiyacına göre bitleri test eden, ayarlayan ve temizleyen AND, OR, XOR, TEST ve NOT Boole mantığını sağlar.

Bu talimatların biçimi -

Sr.No. Talimat Biçim
1 VE AND işlenen1, işlenen2
2 VEYA OR işlenen1, işlenen2
3 ÖZELVEYA XOR işlenen1, işlenen2
4 ÖLÇEK TEST işlenen1, işlenen2
5 DEĞİL DEĞİL işlenen1

Tüm durumlarda ilk işlenen, kayıtta veya bellekte olabilir. İkinci işlenen, kayıt / bellekte veya anlık (sabit) bir değer olabilir. Ancak, bellekten belleğe işlemler mümkün değildir. Bu talimatlar, işlenenlerin bitlerini karşılaştırır veya eşleştirir ve CF, OF, PF, SF ve ZF bayraklarını ayarlar.

AND Talimatı

AND komutu, bitsel AND işlemi gerçekleştirerek mantıksal ifadeleri desteklemek için kullanılır. Her iki işlenenden eşleşen bitler 1 ise bitsel AND işlemi 1 döndürür, aksi takdirde 0 döndürür. Örneğin -

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

AND işlemi, bir veya daha fazla biti temizlemek için kullanılabilir. Örneğin, BL yazmacının 0011 1010 içerdiğini söyleyin. Yüksek sıralı bitleri sıfıra sıfırlamanız gerekiyorsa, siz VE 0FH ile.

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

Başka bir örnek ele alalım. Belirli bir sayının tek mi çift mi olduğunu kontrol etmek istiyorsanız, basit bir test sayının en az anlamlı bitini kontrol etmektir. Bu 1 ise sayı tek, yoksa çift sayıdır.

Numaranın AL sicilinde olduğunu varsayarsak, yazabiliriz -

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

Aşağıdaki program bunu göstermektedir -

Misal

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

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

Even Number!

Ax yazmacındaki değeri tek bir rakamla değiştirin, örneğin -

mov  ax, 9h                  ; getting 9 in the ax

Program şunları görüntüleyecektir:

Odd Number!

Benzer şekilde tüm kütüğü temizlemek için VE bunu 00H ile yapabilirsiniz.

OR Talimatı

OR komutu, bitsel OR işlemi gerçekleştirerek mantıksal ifadeyi desteklemek için kullanılır. Bitsel OR operatörü, işlenenlerden birinin veya her ikisinin eşleşen bitleri bir ise, 1 döndürür. Her iki bit de sıfırsa 0 döndürür.

Örneğin,

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

OR işlemi, bir veya daha fazla biti ayarlamak için kullanılabilir. Örneğin, AL yazmacının 0011 1010 içerdiğini varsayalım, dört düşük sıralı biti ayarlamanız gerekir, bunu 0000 1111, yani FH değeriyle VEYA yapabilirsiniz.

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

Misal

Aşağıdaki örnek, OR talimatını gösterir. Sırasıyla AL ve BL yazmaçlarında 5 ve 3 değerini saklayalım, ardından komut,

OR AL, BL

AL kaydında 7'yi saklamalıdır -

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

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

7

XOR Talimatı

XOR komutu bitsel XOR işlemini uygular. XOR işlemi sonuçtaki biti 1'e ayarlar, ancak ve ancak işlenenlerden gelen bitler farklıysa. İşlenenlerden gelen bitler aynıysa (her ikisi de 0 veya her ikisi 1), ortaya çıkan bit 0'a temizlenir.

Örneğin,

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

XORing kendi başına bir işlenen, işleneni şu şekilde değiştirir: 0. Bu, bir kaydı temizlemek için kullanılır.

XOR     EAX, EAX

TEST Talimatı

TEST komutu, AND işlemiyle aynı şekilde çalışır, ancak AND komutunun aksine, ilk işleneni değiştirmez. Yani, bir kayıttaki bir sayının çift mi yoksa tek mi olduğunu kontrol etmemiz gerekirse, bunu orijinal sayıyı değiştirmeden TEST komutunu kullanarak da yapabiliriz.

TEST    AL, 01H
JZ      EVEN_NUMBER

NOT Talimatı

NOT komutu bitsel NOT işlemini uygular. NOT işlemi bir işlenendeki bitleri ters çevirir. İşlenen, bir kayıtta veya bellekte olabilir.

Örneğin,

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