当前位置: 首页 > 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.dtcms.com/a/298897.html

相关文章:

  • OpenCV学习探秘之一 :了解opencv技术及架构解析、数据结构与内存管理​等基础
  • 技术赋能与营销创新:开源链动2+1模式AI智能名片S2B2C商城小程序的流量转化路径研究
  • 嵌入式硬件篇---zigbee无线串口通信问题解决方法
  • Claude 4.0 终极编程指南:模型对比、API配置与IDE集成实战
  • CMakeLists.txt 怎么写
  • 39.Python 中 list.sort() 与 sorted() 的本质区别与最佳实践
  • 数据库索引详解:原理、设计原则与应用场景
  • NLua和C#交互
  • 6G通感算
  • Spring Boot DFS、HDFS、AI、PyOD、ECOD、Junit、嵌入式实战指南
  • 学习游戏制作记录(剑投掷技能)7.26
  • Kotlin 数据容器 - List 扩展(转换操作、过滤操作、排序操作、分组操作、集合操作、归纳操作、窗口操作)
  • 一款基于react-native harmonyOS 封装的【文档】文件预览查看开源库(基于Harmony 原生文件预览服务进行封装)
  • 【深度之眼机器学习笔记】04-01-决策树简介、熵,04-02-条件熵及计算举例,04-03-信息增益、ID3算法
  • OpenCV图像梯度、边缘检测、轮廓绘制、凸包检测大合集
  • 今天凌晨,字节开源 Coze,如何白嫖?
  • 【Vue2】结合chrome与element-ui的网页端条码打印
  • 使用Spring Boot创建Web项目
  • QT开发---网络编程上
  • 【CTF-WEB-反序列化】利用__toString魔术方法读取flag.php
  • 传统框架与减震楼盖框架地震动力响应分析与有限元模拟
  • USB Type-c
  • 《P3313 [SDOI2014] 旅行》
  • 关于我司即将对商业间谍行为进行法律诉讼的通知
  • C++学习笔记(十:类与对象基础)
  • 洛谷刷题7.25
  • TwinCAT3编程入门1
  • 【Mybatis】分页插件及其原理
  • 蓝桥杯java算法例题
  • powershell 实现批量把文件夹下的bmp文件转换为jpg