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