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
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创优秀实例教程
转载请注明:文章转载自:代码驿站 [http:/www.codeinn.net]
本文标题:Assembly 逻辑指令
本文地址:http://www.codeinn.net/assembly/1004.html