当前位置: 首页 > 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.xdnf.cn/news/1192627.html

相关文章:

  • Windows11下和Vmware中的Ubuntu22.04设置samba服务遇到的一个问题- valid users和guest设置冲突
  • 零基础学习性能测试第三章:jmeter构建性能业务场景
  • java网络请求工具类HttpUtils
  • 智慧水库管理系统中标签工厂的建立方案
  • HTTP 协议的基本格式和 fiddler 的用法
  • PHP语法高级篇(六):面向对象编程
  • 可调谐激光器原理与设计 【DFB 与 DBR 激光器剖析】
  • 详解力扣高频SQL50题之1141. 查询近30天活跃用户数【简单】
  • 【区块链安全】DeFi协议安全漏洞深度分析:从闪电贷攻击到MEV套利
  • Nuxt 4:前端开发的全新篇章
  • java集合框架面试点(2)
  • 【C语言进阶】程序环境和预处理
  • 各种前端框架界面
  • HighlightingSystem
  • 精密全波整流电路(四)
  • Linux 如何统计系统上各个用户登录(或者登出)记录出现的次数?
  • python 检测蜂窝网络,实现掉网自动拨号
  • 自定义定时任务功能详解
  • SGLang 核心技术详解
  • GO 从入门到精通2
  • TCP如何解决网络切换问题
  • 简单实现支付密码的页面及输入效果
  • @PathVariable与@RequestParam的区别
  • Zama+OpenZeppelin:将机密智能合约带入 DeFi 和数字资产领域
  • 拒绝SQL恐惧:用Python+pyqt打造任意Excel数据库查询系统
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 热词数量分析日期统计功能实现
  • 【数据结构】二叉树初阶详解(二):实现逻辑与代码拆解(超详版)
  • STL——vector
  • [Linux入门] 初学者入门:Linux DNS 域名解析服务详解
  • React入门学习——指北指南(第四节)