汇编指令补充
CALL 过程调用指令
格式
CALL 目标地址/标签
执行逻辑(32 位)
- 保存返回地址(CALL 下一条指令的地址)
入栈:ESP = ESP - 4MOV SS:[ESP], EIP (存入返回地址) - 跳转到目标地址执行:EIP = 目标地址
作用
调用子程序 / 函数,执行完可通过RET回到原位置
RET 返回指令
格式
RET
执行逻辑(32 位)
- 从栈中取出返回地址,赋值给指令指针:MOV EIP, SS:[ESP]
- 栈指针上移:ESP = ESP + 4
搭配规则
CALL 和 RET 成对使用,保证程序正常返回
LOOP 循环指令
格式
LOOP 目标标签
执行规则
- ECX = ECX - 1(循环计数器自减)
- 判断:若 ECX ≠ 0,则跳转到目标地址;否则顺序执行下一条指令
用法
循环次数提前存入ECX,典型用于固定次数循环
示例:
mov ecx, 5 ; 设置循环5次
loop_tag:
; 循环体代码
loop loop_tag
重复前缀 REP / REPE
- 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个双字,整块清零 - 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
执行规则
- 用 DS:[ESI] 与 ES:[EDI] 做减法,不保存结果,仅修改标志位(重点判断 ZF)
- 根据 DF 位,ESI、EDI 自动增减对应字节数
- 搭配 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
速记
- CALL 压返回地址 + 跳转,RET 弹地址 + 返回,函数调用标配
- LOOP 靠 ECX 计数循环
- 串操作默认 ESI(源)、EDI(目的),DF 控制地址增减
- REP 只管 ECX,用于数据拷贝;REPE 结合 ZF,用于字符串比对
