位置:首頁 > 高級語言 > Assembly彙編 > Assembly 邏輯指令

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