汇编之基础指令

EFLAG

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寄存器/内存将操作数增加1INC EAX
DEC寄存器/内存将操作数减少1DEC 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: 将 EAXEBX 寄存器中的值相加,结果存回 EAX

    • ADD EAX, [EBX]: 将 EAX 寄存器中的值与 EBX 寄存器指向的内存位置中的值相加,结果存回 EAX

    • ADD EAX, 5: 将 EAX 寄存器中的值与立即数 5 相加,结果存回 EAX

    • SUB EAX, 3: 将 EAX 寄存器中的值减去立即数 3,结果存回 EAX

    • IMUL EAX, EBX: 将 EAXEBX 寄存器中的值相乘,结果存回 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: 将 EAXEBX 寄存器中的值进行按位与运算,结果存回 EAX
  • OR EAX, EBX: 将 EAXEBX 寄存器中的值进行按位或运算,结果存回 EAX
  • XOR EAX, EBX: 将 EAXEBX 寄存器中的值进行按位异或运算,结果存回 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 测试寄存器的某一位是否为1TEST EAX, EBX
CMP操作数1操作数2比较两个操作数(操作数1 - 操作数2),设置标志位但不存储结果主要用于比较两个操作数的大小CMP EAX, EBX

详细说明和示例

  • TEST EAX, EBX: 对 EAXEBX 寄存器中的值进行按位与运算,结果不存储,仅设置标志位用于后续条件判断。

    • 示例:TEST EAX, EBX,如果 EAXEBX 都有相同的位为1,则零标志位 (ZF) 清零;否则,零标志位置位。
  • CMP EAX, EBX: 将 EAX 寄存器中的值减去 EBX 寄存器中的值,结果不存储,仅设置标志位用于后续条件判断。

    • 示例:CMP EAX, EBX,如果 EAX 大于 EBX,则进位标志 (CF) 清零,零标志 (ZF) 清零;如果 EAX 等于 EBX,则零标志 (ZF) 置位。

虽然这些指令数量相对较少,但它们在条件判断和控制流中非常重要,常用于条件跳转指令(如 JE, JNE, JG, JL 等)之前,以决定跳转条件。

  • 32
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值