EFLAG
CF (Carry Flag)
进位标志,当运算结果的
最高有效位
有进位(加法)或借位(减法)时,进位标志置1
,否则为0
xor eax,eax
mov al,0x7f
add al,0x1
add al,0x80
sub al,0x1
OF (Overflow Flag)
溢出标志,若运算结果有
溢出
则OF=1
,否则OF=0
,注意:溢出是相对于有符号数的
,例如
xor eax,eax
mov al,0x80
sub al,0x1
以上例子就会产生溢出,因为AL是8位寄存器,相对于有符号数也就是-128到127
,0x80就是-128,在减1就会产生溢出
ZF (Zero Flag)
零标志,若运算结果为0,
则
ZF=1,否则
ZF=0,注意:一定要运算才行
,例如(与、或、非等
)
xor eax,eax # ZF=1
mov eax,0x1 # ZF=0
SF (Sgin Flag)
符号标志,若运算结果符号为1,
则
SF=1,否则
SF=0,注意:有符号数二进制位最高有效位
表示符号,例如
xor eax,eax
add eax,0x7ffffffff # 二进制 01111111 所以SF=0
add eax,0x1 # 二进制 10000000 所以SF=1
基础指令
算术运算指令
在汇编语言中,算术运算指令是用来执行基本的数学运算的。下面是一个表格,列出了常见的算术运算指令,包括指令名称、操作数1、操作数2、指令的功能描述以及示例。 操作数可以是立即数、寄存器或内存地址
。这些类型的操作数决定了指令如何执行。下面是一个扩展的表格,详细说明了每种算术运算指令支持的操作数类型。
指令名称 | 操作数1 | 操作数2 | 描述 | 示例 |
---|---|---|---|---|
ADD | 寄存器/内存 | 寄存器/内存/立即数 | 将两个操作数相加,并将结果存储在操作数1中 | ADD EAX, EBX |
ADC | 寄存器/内存 | 寄存器/内存/立即数 | 带进位加法 | ADC EAX, EBX |
SUB | 寄存器/内存 | 寄存器/内存/立即数 | 将操作数1与操作数2相减,并将结果存储在操作数1中 | SUB EAX, EBX |
SBB | 寄存器/内存 | 寄存器/内存/立即数 | 带借位减法 | SBB EAX, EBX |
IMUL | 寄存器/内存 | 寄存器/内存/立即数(可选) | 有符号整数乘法 | IMUL EAX, EBX |
MUL | 寄存器/内存 | 无符号整数乘法 | MUL EBX | |
IDIV | 寄存器/内存 | 有符号整数除法 | IDIV EBX | |
DIV | 寄存器/内存 | 无符号整数除法 | DIV EBX | |
INC | 寄存器/内存 | 将操作数增加1 | INC EAX | |
DEC | 寄存器/内存 | 将操作数减少1 | DEC EAX | |
NEG | 寄存器/内存 | 计算操作数的二进制补码(相反数) | NEG EAX | |
CDQ | 将EAX扩展到EDX:EAX(符号位扩展) | CDQ | ||
CBW | 将AL扩展到AX(符号位扩展) | CBW | ||
CWD | 将AX扩展到DX:AX(符号位扩展) | CWD |
详细说明
-
操作数类型:
- 寄存器: 如
EAX
,EBX
,ECX
,EDX
等。 - 内存: 通过地址指定的数据,如
[EAX]
,[EBX + 4]
等。 - 立即数: 直接指定的数值,如
1
,10
,-5
等。
- 寄存器: 如
-
示例详解:
-
ADD EAX, EBX
: 将EAX
和EBX
寄存器中的值相加,结果存回EAX
。 -
ADD EAX, [EBX]
: 将EAX
寄存器中的值与EBX
寄存器指向的内存位置中的值相加,结果存回EAX
。 -
ADD EAX, 5
: 将EAX
寄存器中的值与立即数5
相加,结果存回EAX
。 -
SUB EAX, 3
: 将EAX
寄存器中的值减去立即数3
,结果存回EAX
。 -
IMUL EAX, EBX
: 将EAX
和EBX
寄存器中的值相乘,结果存回EAX
。如果只有一个操作数IMUL EBX
,则相当于EAX
乘以EBX
,结果存放在EDX:EAX
。 -
MUL EBX
: 将EAX
寄存器中的值与EBX
寄存器中的值相乘(无符号乘法),结果存放在EDX:EAX
。 -
IDIV EBX
: 使用EDX:EAX
中的值除以EBX
寄存器中的值,商在EAX
中,余数在EDX
中。 -
DIV EBX
: 使用EDX:EAX
中的值(无符号除法)除以EBX
寄存器中的值,商在EAX
中,余数在EDX
中。 -
INC EAX
: 将EAX
寄存器的值增加1。 -
DEC EAX
: 将EAX
寄存器的值减少1。 -
NEG EAX
: 计算EAX
寄存器中值的二进制补码,即-EAX
。
-
这些指令构成了汇编语言中的基本算术运算工具集,可以处理多种数据类型和存储位置。
位运算指令
在汇编语言中,位运算指令是用于对数据的二进制位进行操作的指令。以下是常见的位运算指令。
指令名称 | 操作数1 | 操作数2 | 描述 | 示例 |
---|---|---|---|---|
AND | 目标操作数 | 源操作数 | 对目标操作数和源操作数进行按位与运算,并将结果存储在目标操作数中 | AND EAX, EBX |
OR | 目标操作数 | 源操作数 | 对目标操作数和源操作数进行按位或运算,并将结果存储在目标操作数中 | OR EAX, EBX |
XOR | 目标操作数 | 源操作数 | 对目标操作数和源操作数进行按位异或运算,并将结果存储在目标操作数中 | XOR EAX, EBX |
NOT | 目标操作数 | 对目标操作数进行按位取反运算 | NOT EAX | |
SHL | 目标操作数 | 位数 | 将目标操作数的二进制位左移指定的位数 | SHL EAX, 1 |
SAL | 目标操作数 | 位数 | 将目标操作数的二进制位左移指定的位数(与SHL相同) | SAL EAX, 1 |
SHR | 目标操作数 | 位数 | 将目标操作数的二进制位右移指定的位数 | SHR EAX, 1 |
SAR | 目标操作数 | 位数 | 将目标操作数的二进制位算术右移指定的位数 | SAR EAX, 1 |
ROL | 目标操作数 | 位数 | 将目标操作数的二进制位循环左移指定的位数 | ROL EAX, 1 |
ROR | 目标操作数 | 位数 | 将目标操作数的二进制位循环右移指定的位数 | ROR EAX, 1 |
RCL | 目标操作数 | 位数 | 将目标操作数的二进制位连同进位标志循环左移指定的位数 | RCL EAX, 1 |
RCR | 目标操作数 | 位数 | 将目标操作数的二进制位连同进位标志循环右移指定的位数 | RCR EAX, 1 |
详细说明和示例
AND EAX, EBX
: 将EAX
和EBX
寄存器中的值进行按位与运算,结果存回EAX
。OR EAX, EBX
: 将EAX
和EBX
寄存器中的值进行按位或运算,结果存回EAX
。XOR EAX, EBX
: 将EAX
和EBX
寄存器中的值进行按位异或运算,结果存回EAX
。NOT EAX
: 对EAX
寄存器中的值进行按位取反运算。SHL EAX, 1
: 将EAX
寄存器中的值左移1位,低位补0。SAL EAX, 1
: 将EAX
寄存器中的值左移1位,低位补0(与SHL
相同)。SHR EAX, 1
: 将EAX
寄存器中的值右移1位,高位补0。SAR EAX, 1
: 将EAX
寄存器中的值算术右移1位,高位补符号位(保留符号)。ROL EAX, 1
: 将EAX
寄存器中的值循环左移1位,溢出位移入低位。ROR EAX, 1
: 将EAX
寄存器中的值循环右移1位,溢出位移入高位。RCL EAX, 1
: 将EAX
寄存器中的值连同进位标志循环左移1位,进位标志位移入低位。RCR EAX, 1
: 将EAX
寄存器中的值连同进位标志循环右移1位,低位位移入进位标志。
这些指令是汇编语言中常用的位运算指令,用于对数据的二进制位进行各种操作,以满足不同的编程需求。
逻辑运算指令
在汇编语言中,逻辑运算指令是用于对数据的逻辑位进行操作的。以下是常见的逻辑运算指令。
指令名称 | 操作数1 | 操作数2 | 描述 | 示例 |
---|---|---|---|---|
TEST | 操作数1 | 操作数2 | 对两个操作数进行按位与运算,但不存储结果,只设置标志位用于判断某寄存器是否为0 测试寄存器的某一位是否为1 | TEST EAX, EBX |
CMP | 操作数1 | 操作数2 | 比较两个操作数(操作数1 - 操作数2),设置标志位但不存储结果主要用于比较两个操作数的大小 | CMP EAX, EBX |
详细说明和示例
-
TEST EAX, EBX
: 对EAX
和EBX
寄存器中的值进行按位与运算,结果不存储,仅设置标志位用于后续条件判断。- 示例:
TEST EAX, EBX
,如果EAX
和EBX
都有相同的位为1,则零标志位 (ZF) 清零;否则,零标志位置位。
- 示例:
-
CMP EAX, EBX
: 将EAX
寄存器中的值减去EBX
寄存器中的值,结果不存储,仅设置标志位用于后续条件判断。- 示例:
CMP EAX, EBX
,如果EAX
大于EBX
,则进位标志 (CF) 清零,零标志 (ZF) 清零;如果EAX
等于EBX
,则零标志 (ZF) 置位。
- 示例:
虽然这些指令数量相对较少,但它们在条件判断和控制流中非常重要,常用于条件跳转指令(如 JE
, JNE
, JG
, JL
等)之前,以决定跳转条件。