处理器指令集提供指令AND,OR,XOR,TEST和NOT布尔逻辑,根据程序的需要测试,设置和清除位.
这些说明的格式 :
Sr.No. | 指令 | 格式 |
---|---|---|
1 | AND | AND operand1,operand2 |
2 | OR | OR operand1,operand2 |
3 | XOR | XOR operand1,operand2 |
4 | TEST | TEST operand1,operand2 |
5 | NOT | NOT 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