汇编代码中的主要指令笔记
1. MOV
指令
功能:用于将数据从一个位置传输到另一个位置,可以是寄存器或内存地址。
语法:mov 目标, 源
示例:
mov eax, 0FFFFFFFFh ; 将立即数 0xFFFFFFFF 传送到 eax 寄存器
mov edi, offset target ; 将 target 地址存入 edi,用于目标位置
2. REP
前缀
功能:用来重复执行后面的字符串指令,直到 ECX
寄存器的值为 0。可以结合 MOVS
, STOS
, CMPS
, SCAS
等串操作指令,实现对内存数据的批量操作。
语法:rep 指令
示例:
mov ecx, 20 ; 设置重复次数
rep stosd ; 重复 20 次,将 EAX 的值存入 EDI 指向的目标内存
3. STOSD
指令
功能:将 EAX
寄存器中的双字(DWORD)值存储到 ES:EDI
指向的内存地址,然后根据方向标志位 DF
更新 EDI
。
语法:stosd
示例:
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
加载字节到AL
lodsw
加载字到AX
lodsd
加载双字到EAX
lodsq
加载四字到RAX
示例:
mov esi, offset source ; 将 source 地址加载到 ESI
lodsd ; 从 source 处读取双字,加载到 EAX
5. MOVS
系列指令
功能:将 DS:ESI
指向的源内存数据复制到 ES:EDI
指向的目标内存数据块,通常用于字符串或数组的复制操作。MOVS
系列也有不同大小的变体:
movsb
复制字节movsw
复制字movsd
复制双字movsq
复制四字
示例:
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
比较四字
示例:
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)进一步提升速度。
原文地址:https://blog.csdn.net/2301_79740767/article/details/143734180
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!