开发手册 欢迎您!
软件开发者资料库

汇编 - 逻辑指令

汇编逻辑指令 - 从简单和简单的步骤学习汇编编程,从基本概念到高级概念,包括简介,环境设置,基本语法,存储器段,状态寄存器,系统调用,寻址模式,变量,常量,算术,条件执行,循环,逻辑,字符串处理,递归,数组,中断,过程,常量,宏,文件,内存管理。

处理器指令集提供指令AND,OR,XOR,TEST和NOT布尔逻辑,根据程序的需要测试,设置和清除位.

这些说明的格式 :

Sr.No.指令格式
1ANDAND operand1,operand2
2OROR operand1,operand2
3XORXOR operand1,operand2
4TESTTEST operand1,operand2
5NOTNOT operand1

所有情况下的第一个操作数可以是i n注册或在内存中.第二个操作数可以是寄存器/存储器或立即(常量)值.但是,内存到内存操作是不可能的.这些指令比较或匹配操作数的位,并设置CF,OF,PF,SF和ZF标志.

AND指令

AND指令用于通过执行按位AND运算来支持逻辑表达式.如果来自两个操作数的匹配位为1,则按位AND操作返回1,否则返回0.例如 :

             Operand1: 0101             Operand2: 0011----------------------------After AND -> Operand1:0001

AND操作可用于清除一个或多个位.例如,假设BL寄存器包含0011 1010.如果需要将高位清零,则将其与0FH进行对比.

ANDBL,   0FH   ; This sets BL to 0000 1010

让我们再举一个例子.如果要检查给定数字是奇数还是偶数,一个简单的测试就是检查数字的最低有效位.如果这是1,则数字是奇数,否则数字是偶数.

假设数字在AL寄存器中,我们可以写 :

ANDAL, 01H     ; ANDing with 0000 0001JZ    EVEN_NUMBER

以下程序说明了这个 :

示例

section .text   global _start            ;must be declared for using gcc_start:                     ;tell linker entry point   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   outprogevnn:        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 kerneloutprog:   mov   eax,1              ;system call number (sys_exit)   int   0x80               ;call kernelsection   .dataeven_msg  db  'Even Number!' ;message showing even numberlen1  equ  $ - even_msg    odd_msg db  'Odd Number!'    ;message showing odd numberlen2  equ  $ - odd_msg

当编译并执行上述代码时,它产生以下结果 :

Even Number!

使用奇数位更改ax寄存器中的值,例如 :

mov  ax, 9h                  ; getting 9 in the ax

该程序将显示:

Odd Number!

类似于清除整个寄存器,您可以将其与00H进行对比.

OR指令

OR指令用于通过执行按位OR运算来支持逻辑表达式.如果来自任一操作数或两个操作数的匹配位为1,则按位OR运算符返回1.如果两个位都为零,则返回0.

例如,

             Operand1:     0101             Operand2:     0011----------------------------After OR -> Operand1:    0111

OR操作可用于设置一个或多个位.例如,假设AL寄存器包含0011 1010,您需要设置四个低位,您可以使用值0000 1111进行OR运算,即FH.

OR BL, 0FH                   ; This sets BL to  0011 1111

示例

以下示例演示OR指令.让我们分别在AL和BL寄存器中存储值5和3,然后是指令,

  OR AL,BL

应该在AL寄存器中存储7 :

section .text   global _start            ;must be declared for using gcc_start:                     ;tell linker entry point   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 kernelsection    .bssresult resb 1

当编译并执行上述代码时,它会产生以下结果 :

  7

XOR指令

XOR指令实现按位XOR运算.当且仅当来自操作数的位不同时,XOR操作将结果位设置为1.如果操作数的位相同(均为0或均为1),则结果位清零.

例如,

             Operand1:     0101             Operand2:     0011----------------------------After XOR -> Operand1:    0110

异或操作数本身将操作数更改为 0 .这用于清除寄存器.

  XOR EAX,EAX

TEST指令

TEST指令的工作方式与AND操作相同,但与AND指令不同,它不会更改第一个操作数.因此,如果我们需要检查寄存器中的数字是偶数还是奇数,我们也可以使用TEST指令执行此操作而不更改原始数字.

  TEST AL,01H  JZ EVEN_NUMBER

NOT指令

NOT指令实现按位NOT运算. NOT操作会反转操作数中的位.操作数可以在寄存器中,也可以在内存中.

例如,

              Operand1:    0101 0011After NOT -> Operand1:    1010 1100