汇编指令补充

📅 2026/7/1 2:56:30
汇编指令补充
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 / REPEREP 无条件重复规则循环执行后续串指令 每执行一次串指令ECX ECX - 1 直到 ECX 0 停止搭配组合REP MOVSB/MOVSW/MOVSD批量拷贝整块内存mov ecx, 100 ; 复制100次cldrep movsb ; 循环复制100个字节REP STOSB/STOSW/STOSD批量填充整块内存mov ecx, 0x40xor eax,eaxrep stosd ; 填充0x40个双字整块清零REPE / REPZ 相等则重复● 规则同时满足 ECX≠0且ZF1两数相等才继续重复● 一旦 ZF0不相等立刻终止循环常用于串比较MOVS 串传送指令内存→内存专用基础分类MOVSB字节传送1BMOVSW字传送2BMOVSD双字传送4B统称 MOVS 系列是汇编里少数允许内存直接复制到内存的指令普通 MOV 做不到固定配对寄存器ESI源数据内存地址DS 段EDI目标存放内存地址ES 段自动地址修正执行一次 MOVS 后CPU 自动修改 ESI、EDI增减由 DF 方向位决定MOVSB±1MOVSW±2MOVSD±4DF0正向CLD 清零指令设置 ESI、EDI 数值变大地址递增DF1反向STD 置 1 指令设置 ESI、EDI 数值变小地址递减cld ; DF0地址往上增长mov esi, src_addr ; 源地址mov edi, dst_addr ; 目标地址movsb ; 复制1字节esi1edi1串比较指令 CMPSB / CMPSW / CMPSD执行规则用 DS:[ESI] 与 ES:[EDI] 做减法不保存结果仅修改标志位重点判断 ZF根据 DF 位ESI、EDI 自动增减对应字节数搭配 REPE○ 两字符相等ZF1且 ECX≠0继续比较○ 遇到不相等ZF0立即停止比较○ 全部字符相等循环结束后 ZF1存在不等字符ZF0指令 比较单位 地址变化CMPSB 单字节 ESI±1、EDI±1CMPSW 双字节 ESI±2、EDI±2CMPSD 四字节 ESI±4、EDI±4示例mov ecx, 10 ; 最多比较10个字节repe cmpsb ; 逐个字节比较不等则停止jne not_equal ; ZF0串不相等则跳转STOS 串存储填充指令寄存器→内存三条细分STOSB把 AL 存入 [EDI]STOSW把 AX 存入 [EDI]STOSD把 EAX 存入 [EDI]特性只操作 EDI 目标地址不读取 ESI执行后 EDI 自动 ±1/±2/±4规则同样受 DF 控制典型用途批量清零内存、整块缓冲区填充固定值示例把一块内存全部填 0xor eax,eax ; EAX清零stosd ; 向EDI处写入0edi4速记CALL 压返回地址 跳转RET 弹地址 返回函数调用标配LOOP 靠 ECX 计数循环串操作默认 ESI(源)、EDI(目的)DF 控制地址增减REP 只管 ECX用于数据拷贝REPE 结合 ZF用于字符串比对