Assembly 邏輯指令
處理器的指令集提供的指令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 指令
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運算。位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 指令
XOR指令實現按位異或操作。異或運算得到位設置為1,當且僅當從操作數的位是不同的。如果操作數的位相同(都為0或為1),將得到的位被清除為0。
實例,
Operand1: 0101 Operand2: 0011 ---------------------------- After XOR -> Operand1: 0110
異或操作數本身改變操作數為0。這是用來清除寄存器。
XOR EAX, EAX
TEST 指令
測試指令的工作原理相同的“與”操作,但不像AND指令,它不改變它的第一個操作數。所以,如果我們需要檢查是否在寄存器數量是偶數還是奇數,我們也可以做到這一點不改變原有號碼的情況下使用測試指令。
TEST AL, 01H JZ EVEN_NUMBER
NOT 指令
指令實現按位非運算。 NOT運算操作數的位逆轉。該操作數可能是在一個寄存器或存儲器中。
實例,
Operand1: 0101 0011 After NOT -> Operand1: 1010 1100