1. MOV 指令
功能:用于将数据从一个位置传输到另一个位置,可以是寄存器或内存地址。
语法 :mov 目标, 源
示例:
assembly
mov eax, 0FFFFFFFFh ; 将立即数 0xFFFFFFFF 传送到 eax 寄存器
mov edi, offset target ; 将 target 地址存入 edi,用于目标位置
2. REP 前缀
功能 :用来重复执行后面的字符串指令,直到 ECX 寄存器的值为 0。可以结合 MOVS, STOS, CMPS, SCAS 等串操作指令,实现对内存数据的批量操作。
语法 :rep 指令
示例:
assembly
mov ecx, 20 ; 设置重复次数
rep stosd ; 重复 20 次,将 EAX 的值存入 EDI 指向的目标内存
3. STOSD 指令
功能 :将 EAX 寄存器中的双字(DWORD)值存储到 ES:EDI 指向的内存地址,然后根据方向标志位 DF 更新 EDI。
语法 :stosd
示例:
assembly
mov eax, 0FFFFFFFFh ; 将要存储的值 0xFFFFFFFF 加载到 EAX
mov edi, offset target ; 将 target 地址加载到 EDI
mov ecx, 20 ; 设置重复计数
rep stosd ; 重复存储 20 次,将 EAX 中的数据存到 target 的每个双字地址
4. LODS 系列指令
功能 :将 DS:ESI 指向的内存数据加载到累加器(AL, AX, EAX, RAX),常用于从源内存块读取数据。 LODS 系列有多个变体:
lodsb加载字节到ALlodsw加载字到AXlodsd加载双字到EAXlodsq加载四字到RAX
示例:
assembly
mov esi, offset source ; 将 source 地址加载到 ESI
lodsd ; 从 source 处读取双字,加载到 EAX
5. MOVS 系列指令
功能 :将 DS:ESI 指向的源内存数据复制到 ES:EDI 指向的目标内存数据块,通常用于字符串或数组的复制操作。MOVS 系列也有不同大小的变体:
movsb复制字节movsw复制字movsd复制双字movsq复制四字
示例:
assembly
mov esi, offset source ; 源数据地址
mov edi, offset target ; 目标数据地址
mov ecx, 20 ; 复制 20 个双字
rep movsd ; 从 source 复制 20 个双字到 target
6. CMPS 系列指令
功能 :比较 DS:ESI 和 ES:EDI 指向的内存内容,并根据比较结果设置标志位。CMPS 系列指令有多个大小的变体,用于不同的数据宽度:
cmpsb比较字节cmpsw比较字cmpsd比较双字cmpsq比较四字
示例:
assembly
mov esi, offset dwSourceC ; 源数据地址
mov edi, offset dwTarget ; 目标数据地址
cmpsd ; 比较 dwSourceC 和 dwTarget 的双字内容
补充知识点
DF 方向标志位
DF 控制串指令中 SI 和 DI 寄存器的更新方向。可以通过 CLD 清除 DF(递增)或 STD 设置 DF(递减)。
重复前缀的种类
REP:无条件重复,直到ECX为 0。REPE/REPZ:当ZF为 1 时重复,直到ECX为 0 或ZF为 0。REPNE/REPNZ:当ZF为 0 时重复,直到ECX为 0 或ZF为 1。
使用建议
- 数据对齐和方向 :在使用
STOS,MOVS,CMPS等指令时,确保数据对齐;使用CLD或STD指令控制方向。 - 注意内存边界:在操作大数据块时,小心避免越界访问。
- 性能优化:大数据块操作可以结合 SIMD 指令(如 AVX)进一步提升速度。