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