汇编代码中的主要指令笔记

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 加载字节到 AL
  • lodsw 加载字到 AX
  • lodsd 加载双字到 EAX
  • lodsq 加载四字到 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:ESIES:EDI 指向的内存内容,并根据比较结果设置标志位。CMPS 系列指令有多个大小的变体,用于不同的数据宽度:

  • cmpsb 比较字节
  • cmpsw 比较字
  • cmpsd 比较双字
  • cmpsq 比较四字

示例

assembly 复制代码
mov esi, offset dwSourceC ; 源数据地址
mov edi, offset dwTarget   ; 目标数据地址
cmpsd                      ; 比较 dwSourceC 和 dwTarget 的双字内容

补充知识点

DF 方向标志位

DF 控制串指令中 SIDI 寄存器的更新方向。可以通过 CLD 清除 DF(递增)或 STD 设置 DF(递减)。

重复前缀的种类
  • REP:无条件重复,直到 ECX 为 0。
  • REPE/REPZ:当 ZF 为 1 时重复,直到 ECX 为 0 或 ZF 为 0。
  • REPNE/REPNZ:当 ZF 为 0 时重复,直到 ECX 为 0 或 ZF 为 1。

使用建议

  1. 数据对齐和方向 :在使用 STOS, MOVS, CMPS 等指令时,确保数据对齐;使用 CLDSTD 指令控制方向。
  2. 注意内存边界:在操作大数据块时,小心避免越界访问。
  3. 性能优化:大数据块操作可以结合 SIMD 指令(如 AVX)进一步提升速度。
相关推荐
Y4090011 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记
布朗克1681 小时前
java常见的jvm内存分析工具
java·jvm·数据库
笑衬人心。1 小时前
TCP 拥塞控制算法 —— 慢启动(Slow Start)笔记
笔记·tcp/ip·php
胡八一1 小时前
SQLite / LiteDB 单文件数据库为何“清空表后仍占几 GB”?——原理解析与空间回收实战
jvm·数据库·sqlite
花海如潮淹1 小时前
前端性能追踪工具:用户体验的毫秒战争
前端·笔记·ux
Andy杨2 小时前
20250718-5-Kubernetes 调度-Pod对象:重启策略+健康检查_笔记
笔记·容器·kubernetes
秋林辉3 小时前
Jfinal+SQLite处理 sqlite数据库执行FIND_IN_SET报错
jvm·数据库·sqlite
杭州杭州杭州7 小时前
Python笔记
开发语言·笔记·python
cui_hao_nan10 小时前
JVM——JVM由哪部分组成?
jvm