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