處理器的指令集提供的指令AND,OR,XOR,TEST和NOT布林邏輯的測試,根據該方案的需要的位進行置位和清除。
這些指令的格式:
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 |
在所有的情況下,第一個運算元可以是暫存器或記憶體中。第二個運算元可以是暫存器/儲存器或立即值(常數)。但是,記憶體到記憶體的操作是不可能的。這些指令可比較或匹配位元運算數和CF,PF,SF和ZF標誌。
AND指令用於支援邏輯表示式執行按位元與運算。按位元與運算返回1,如果匹配兩個運算元位為1,否則返回0。例如:
Operand1: 0101 Operand2: 0011 ---------------------------- After AND -> Operand1: 0001
“與”操作,可用於清除一個或多個位。例如說,BL暫存器包含00111010。如果需要清除的高位零,AND 0FH。
AND BL, 0FH ; This sets BL to 0000 1010
我們的另一個例子。如果想檢查一個給定的數位是否是奇數還是偶數,一個簡單的測試將是檢查的數量最少的顯著位。如果是1的為奇數,其他的數是偶數。
假設數位是在AL暫存器,我們可以這樣寫:
AND AL, 01H ; ANDing with 0000 0001 JZ EVEN_NUMBER
下面的程式說明了這一點:
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
上面的程式碼編譯和執行時,它會產生以下結果:
Even Number!
一個奇怪的數位,像在AX暫存器中的值更改:
mov ax, 9h ; getting 9 in the ax
該程式會顯示:
Odd Number!
同樣你可以它清除整個暫存器 :AND和00H.
OR指令用於支援邏輯表示式執行按位元OR運算。位OR運算子返回1,如果其中一個或兩個運算元位匹配是一個。它返回0,如果兩個位都是零。
例如,
Operand1: 0101 Operand2: 0011 ---------------------------- After OR -> Operand1: 0111
OR(或)操作可用於設定一個或多個位。例如,讓我們假設AL暫存器包含00111010,需要設定四個低階位,OR 0000 1111,即FH值。
OR BL, 0FH ; This sets BL to 0011 1111
下面的範例演示OR指令。讓我們儲存5和3值分別在AL和BL暫存器。然後,該指令
OR AL, BL
應該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
上面的程式碼編譯和執行時,它會產生以下結果:
7
XOR指令實現按位元互斥或操作。互斥或運算得到位設定為1,當且僅當從運算元的位是不同的。如果運算元的位相同(都為0或為1),將得到的位被清除為0。
範例,
Operand1: 0101 Operand2: 0011 ---------------------------- After XOR -> Operand1: 0110
互斥或運算元本身改變運算元為0。這是用來清除暫存器。
XOR EAX, EAX
測試指令的工作原理相同的“與”操作,但不像AND指令,它不改變它的第一個運算元。所以,如果我們需要檢查是否在暫存器數量是偶數還是奇數,我們也可以做到這一點不改變原有號碼的情況下使用測試指令。
TEST AL, 01H JZ EVEN_NUMBER
指令實現按位元非運算。 NOT運算運算元的位逆轉。該運算元可能是在一個暫存器或儲存器中。
範例,
Operand1: 0101 0011 After NOT -> Operand1: 1010 1100