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