当前位置: 首页 > news >正文

x86汇编语言入门基础(三)汇编指令篇5 串操作

LODS, LODSB\LODSW\LODSD 读取字节(从ESI指向的内存地址->AL/AX/EAX寄存器)

STOS, STOSB\STOSW\STOSD 保存字节(从AL/AX/EAX寄存器->EDI指向的内存地址)

MOVS, MOVSB\MOVSW\MOVSD(从ESI指向的内存地址->EDI指向的内存地址)

组合搭配指令:CLD, STD 清除/设置方向标志

1. LODSB

Load String Byte

LODSB\LODSW\LODSD(Byte,Word,dword)

功能:读取数据,用于从ESI指向的内存地址中,加载字符串中的一个字节

执行lodsb,未指定操作数的时候,默认从esi指向的内存地址加载一个字节到AL寄存器中,当DF为0时,执行完lobsb指令后自动更新esi(执行esi+1),指向下一个字节;(当DF为1时,esi自减,指向上一个字节);所以通常执行lodsb指令之前,会使用CLD指令清除复位DF标志

*esi++ 的递增为1个单位,基于使用的指令byte/word/dword,使地址递增1/2/4个字节

实例使用:使用lodsb + stosb复制字符串

  • 第一步 lodsb:从[esi]加载字符到AL,同时esi++(读取源字符串)
  • 第二步 stosb:将AL中的字符存入[edi],同时edi++(写入目标缓冲区)

使用lodsb+stosb的组合可实现动态长度处理,读取字符串至遇到终止符\0,无需提前计算字符串长度,适合未知长度的字符串操作(movsb的复制操作中间不会检查al,遇到\0不会自动停止)

2. STOSB

Store String Byte

功能:写入数据,用于将EAX/AX/AL寄存器中的字节保存至EDI指向的内存地址

通常与LODSB组合使用,先用LODSB读取字符,再使用STOSB保存字符。

3. MOVSB

Move Data from String to String

功能:复制内存数据,从[ESI] 至 [EDI]

  • 从ESI/SI指向的内存地址复制数据,写入EDI/DI指向的内存地址;
  • 根据DF标志更新指针:DF=0时,ESI的值自动递增1/2/4字节(基于指令movsb/movsw/movsd);

movs指令b本身无视数据内容,即使遇到\0也会继续复制。通常movsb会配合rep使用(rep movsb),表示重复执行,重复次数由cx/ecx指定。

4. CLD

Clear Direction Flag,清除方向标志(DF)

功能:设置方向标志DF=0,通常用于确保字符串操作按正向(递增)顺序进行。

当DF为0时,字符串操作指令执行后,源索引寄存器ESI和目的索引寄存器EDI自动递增,意味着字符串操作从低地址向高地址处理数据(正向处理)。

典型应用场景:在使用LODS/STOS/MOVS/SCAS指令读取、保存、复制、扫描字符串之前。

5. STD

Set Direction Flag, 设置方向标志(DF)

功能:设置方向标志DF=0,字符串会按照地址递减的顺序进行,参考相对于指令CLD。

6. SCASB/SCASD

Scan String Byte/Dword

功能:扫描内存中的1个字节,比较AL/EAX和 [DI]/[EDI] 的值,并设置标志位,ZF=1表示匹配。

用途:在字节数组中搜索特定字符(例如查找字符串中的字符,或终止符\0)

使用示例:字符串长度计算

参考引用

[1] http://ref.x86asm.net/coder32.html

[2] 《逆向分析实战》

http://www.lryc.cn/news/600694.html

相关文章:

  • 【架构】Docker简单认知构建
  • JAVA学习-练习试用Java实现“深度优先搜索(DFS):实现八数码问题的解法(最短路径搜索)”
  • LangChain4j低阶+高阶Api+日志配置+监听器+重试机制+超时机制
  • 【LeetCode 热题 100】131. 分割回文串——回溯
  • 算法竞赛阶段二-数据结构(35)数据结构单链表模拟实现
  • Android-广播详解
  • golang实现一个定时引擎,功能包括按照corntab的时间任务实时增加、修改、删除定时任务
  • 常见sql深入优化( 二)
  • 一文学会c++list
  • 激光雷达-相机标定工具:支持普通相机和鱼眼相机的交互式标定
  • 二叉搜索树(Binary Search Tree)详解与java实现
  • Linux 如何统计系统上各个用户登录(或者登出)记录出现的次数?
  • Android-三种持久化方式详解
  • 摘录-打造第二大脑
  • J2EE模式---表现层集成模式
  • C++ TAP(基于任务的异步编程模式)
  • Web后端进阶:springboot原理(面试多问)
  • React入门学习——指北指南(第五节)
  • JavaScript手录06-函数
  • 【RK3568 PWM 子系统(SG90)驱动开发详解】
  • 数据赋能(336)——技术平台——智能化运营
  • Java动态调试技术原理
  • 【RocketMQ】一分钟了解RocketMQ
  • 告别复杂配置!Spring Boot优雅集成百度OCR的终极方案
  • Windows 平台源码部署 Dify教程(不依赖 Docker)
  • 《C++ list 完全指南:从基础到高效使用》
  • Linux——线程同步
  • InvokeRepeating避免嵌套调用
  • C++编程学习(第16天)
  • 7月26日京东秋招第一场第一题