位置:首页 > > 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