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] 《逆向分析实战》