處理器的指令集提供的指令A(yù)ND,OR,XOR,TEST和NOT布爾邏輯的測試,根據(jù)該方案的需要的位進(jìn)行置位和清除。
這些指令的格式:
SN | 指令 | 格式 |
---|---|---|
1 | AND | AND operand1, operand2 |
2 | OR | OR operand1, operand2 |
3 | XOR | XOR operand1, operand2 |
4 | TEST | TEST operand1, operand2 |
5 | NOT | NOT operand1 |
在所有的情況下,第一個(gè)操作數(shù)可以是寄存器或內(nèi)存中。第二個(gè)操作數(shù)可以是寄存器/存儲器或立即值(常量)。但是,內(nèi)存到內(nèi)存的操作是不可能的。這些指令可比較或匹配位操作數(shù)和CF,PF,SF和ZF標(biāo)志。
AND指令用于支持邏輯表達(dá)式執(zhí)行按位與運(yùn)算。按位與運(yùn)算返回1,如果匹配兩個(gè)操作數(shù)位為1,否則返回0。例如:
Operand1: 0101 Operand2: 0011 ---------------------------- After AND -> Operand1: 0001
“與”操作,可用于清除一個(gè)或多個(gè)位。例如說,BL寄存器包含00111010。如果需要清除的高位零,AND 0FH。
AND BL, 0FH ; This sets BL to 0000 1010
我們的另一個(gè)例子。如果想檢查一個(gè)給定的數(shù)字是否是奇數(shù)還是偶數(shù),一個(gè)簡單的測試將是檢查的數(shù)量最少的顯著位。如果是1的為奇數(shù),其他的數(shù)是偶數(shù)。
假設(shè)數(shù)字是在AL寄存器,我們可以這樣寫:
AND AL, 01H ; ANDing with 0000 0001 JZ EVEN_NUMBER
下面的程序說明了這一點(diǎn):
section .text global _start ;must be declared for using gcc _start: ;tell linker entry yiibai 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
上面的代碼編譯和執(zhí)行時(shí),它會產(chǎn)生以下結(jié)果:
Even Number!
一個(gè)奇怪的數(shù)字,像在AX寄存器中的值更改:
mov ax, 9h ; getting 9 in the ax
該程序會顯示:
Odd Number!
同樣你可以它清除整個(gè)寄存器 :AND和00H.
OR指令用于支持邏輯表達(dá)式執(zhí)行按位OR運(yùn)算。位OR運(yùn)算符返回1,如果其中一個(gè)或兩個(gè)操作數(shù)位匹配是一個(gè)。它返回0,如果兩個(gè)位都是零。
例如,
Operand1: 0101 Operand2: 0011 ---------------------------- After OR -> Operand1: 0111
OR(或)操作可用于設(shè)置一個(gè)或多個(gè)位。例如,讓我們假設(shè)AL寄存器包含00111010,需要設(shè)置四個(gè)低階位,OR 0000 1111,即FH值。
OR BL, 0FH ; This sets BL to 0011 1111
下面的示例演示OR指令。讓我們存儲5和3值分別在AL和BL寄存器。然后,該指令
OR AL, BL
應(yīng)該AL寄存器中存放7:
section .text global _start ;must be declared for using gcc _start: ;tell linker entry yiibai 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
上面的代碼編譯和執(zhí)行時(shí),它會產(chǎn)生以下結(jié)果:
7
XOR指令實(shí)現(xiàn)按位異或操作。異或運(yùn)算得到位設(shè)置為1,當(dāng)且僅當(dāng)從操作數(shù)的位是不同的。如果操作數(shù)的位相同(都為0或?yàn)?),將得到的位被清除為0。
實(shí)例,
Operand1: 0101 Operand2: 0011 ---------------------------- After XOR -> Operand1: 0110
異或操作數(shù)本身改變操作數(shù)為0。這是用來清除寄存器。
XOR EAX, EAX
測試指令的工作原理相同的“與”操作,但不像AND指令,它不改變它的第一個(gè)操作數(shù)。所以,如果我們需要檢查是否在寄存器數(shù)量是偶數(shù)還是奇數(shù),我們也可以做到這一點(diǎn)不改變原有號碼的情況下使用測試指令。
TEST AL, 01H JZ EVEN_NUMBER
指令實(shí)現(xiàn)按位非運(yùn)算。 NOT運(yùn)算操作數(shù)的位逆轉(zhuǎn)。該操作數(shù)可能是在一個(gè)寄存器或存儲器中。
實(shí)例,
Operand1: 0101 0011 After NOT -> Operand1: 1010 1100