汇编指令补充

CALL 过程调用指令

格式
CALL 目标地址/标签
执行逻辑(32 位)

  1. 保存返回地址(CALL 下一条指令的地址)
    入栈:ESP = ESP - 4MOV SS:[ESP], EIP (存入返回地址)
  2. 跳转到目标地址执行:EIP = 目标地址
    作用
    调用子程序 / 函数,执行完可通过RET回到原位置

RET 返回指令

格式
RET
执行逻辑(32 位)

  1. 从栈中取出返回地址,赋值给指令指针:MOV EIP, SS:[ESP]
  2. 栈指针上移:ESP = ESP + 4
    搭配规则
    CALL 和 RET 成对使用,保证程序正常返回

LOOP 循环指令

格式
LOOP 目标标签
执行规则

  1. ECX = ECX - 1(循环计数器自减)
  2. 判断:若 ECX ≠ 0,则跳转到目标地址;否则顺序执行下一条指令
    用法
    循环次数提前存入ECX,典型用于固定次数循环
    示例:
    mov ecx, 5 ; 设置循环5次
    loop_tag:
    ; 循环体代码
    loop loop_tag

重复前缀 REP / REPE

  1. REP 无条件重复
    规则:循环执行后续串指令, 每执行一次串指令,ECX = ECX - 1, 直到 ECX = 0 停止
    搭配组合
    REP MOVSB/MOVSW/MOVSD:批量拷贝整块内存
    mov ecx, 100 ; 复制100次
    cld
    rep movsb ; 循环复制100个字节
    REP STOSB/STOSW/STOSD:批量填充整块内存
    mov ecx, 0x40
    xor eax,eax
    rep stosd ; 填充0x40个双字,整块清零
  2. REPE / REPZ 相等则重复
    ● 规则:同时满足 ECX≠0且ZF=1(两数相等),才继续重复
    ● 一旦 ZF=0(不相等),立刻终止循环,常用于串比较

MOVS 串传送指令(内存→内存专用)

基础分类
MOVSB:字节传送(1B)
MOVSW:字传送(2B)
MOVSD:双字传送(4B)
统称 MOVS 系列,是汇编里少数允许内存直接复制到内存的指令,普通 MOV 做不到
固定配对寄存器
ESI:源数据内存地址(DS 段)
EDI:目标存放内存地址(ES 段)
自动地址修正
执行一次 MOVS 后,CPU 自动修改 ESI、EDI,增减由 DF 方向位决定:
MOVSB:±1
MOVSW:±2
MOVSD:±4
DF=0(正向,CLD 清零指令设置) ESI、EDI 数值变大(地址递增)
DF=1(反向,STD 置 1 指令设置) ESI、EDI 数值变小(地址递减)
cld ; DF=0,地址往上增长
mov esi, src_addr ; 源地址
mov edi, dst_addr ; 目标地址
movsb ; 复制1字节,esi+1,edi+1

串比较指令 CMPSB / CMPSW / CMPSD

执行规则

  1. 用 DS:[ESI] 与 ES:[EDI] 做减法,不保存结果,仅修改标志位(重点判断 ZF)
  2. 根据 DF 位,ESI、EDI 自动增减对应字节数
  3. 搭配 REPE:
    ○ 两字符相等(ZF=1)且 ECX≠0:继续比较
    ○ 遇到不相等(ZF=0):立即停止比较
    ○ 全部字符相等:循环结束后 ZF=1;存在不等字符:ZF=0
    指令 比较单位 地址变化
    CMPSB 单字节 ESI±1、EDI±1
    CMPSW 双字节 ESI±2、EDI±2
    CMPSD 四字节 ESI±4、EDI±4
    示例
    mov ecx, 10 ; 最多比较10个字节
    repe cmpsb ; 逐个字节比较,不等则停止
    jne not_equal ; ZF=0,串不相等则跳转

STOS 串存储填充指令(寄存器→内存)

三条细分
STOSB:把 AL 存入 [EDI]
STOSW:把 AX 存入 [EDI]
STOSD:把 EAX 存入 [EDI]
特性
只操作 EDI 目标地址,不读取 ESI;
执行后 EDI 自动 ±1/±2/±4,规则同样受 DF 控制;
典型用途:批量清零内存、整块缓冲区填充固定值
示例:把一块内存全部填 0
xor eax,eax ; EAX清零
stosd ; 向EDI处写入0,edi+4

速记

  1. CALL 压返回地址 + 跳转,RET 弹地址 + 返回,函数调用标配
  2. LOOP 靠 ECX 计数循环
  3. 串操作默认 ESI(源)、EDI(目的),DF 控制地址增减
  4. REP 只管 ECX,用于数据拷贝;REPE 结合 ZF,用于字符串比对