Win32ASM学习[18]:串指令-MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE

--------------------------------------------------------------------------------------------------------------------------------------------------------

一.字符串传送指令  MOVSB/MOVSW/MOVSD

 格式: MOVS OPD,OPS 
 功能: OPD<--OPS.

 

说明: 1. 其中OPS为源串符号地址,OPD为目的串符号地址.
          2. 对字节串操作时: 若DF=0,则作加,即[ES:DI]<--[DS:SI],(SI)<--(SI)+1,(DI)<--(DI)+1.
                          若DF=1,则作减,即 (SI)<--(SI)-1,(DI)<--(DI)-1.
          3. 对字串操作时: 若DF=0,则作加,即(SI)<--(SI)+2,(DI)<--(DI)+2.
                        若DF=1,则作减,即(SI)<--(SI)-2,(DI)<--(DI)-2.

          4. 在指令中不出现操作数时,字节串传送格式为MOVSB、字串传送格式为MOVSW,双            字传送格式为MOVSD

          5. 本指令不影响标志位.

          6. 例如: 将存储器中变量A开始的200个数据串传送至B开始的存储区,可用以下程            序段实现:
                MOV SI,OFFSET A ;SI指向源串首址
                MOV DI,OFFSET B ;DI指向目的串首址
                MOV CX,200         ;字节串或字串长度200送CX
                CLD                       ;0-->DF 
      ATOB:MOVS B,A   ;对字节串传送可用MOVSB
                DEC CX                 ;(CX)<--(CX)-1 
                JNZ ATOB             ; 
                (CX)<>0,转至ATOB

         7. 用指令MOVS?   B,A究竟是字节传送,还是字传送,取决于A,B的类型定义.
                 若DF=0,则在字传送时,(SI)<--(SI)+2,(DI)<--(DI)+2.

----------------------------------------------------------------------------------------------------------------------------------------------------------

.

二.比较串指令:CMPSBCMPSWCMPSD ;比较 ESI、EDI; 执行后, ESI 与 EDI 的地址移动相应的单位

 

字符串比较指令

 格式: CMPS      OPRD1,OPRD2
 ----  CMPSB
         CMPSW

 功能: 由SI寻址的源串中数据与由DI寻址的目的串中数据进行比较,比较结果送标志位,而
 ----  不改变操作数本身.同时SI,DI将自动调整.

 

说明: 1. 其中OPRD2为源串符号地址,OPRD1为目的串符号地址.
        2. 本指令影响标志位AF、CF、OF、SF、PF、ZF.本指令可用来检查二个字符串是否相同,可以使用循环控制方法对整串进行比较.

        3. 与MOVS相似,CMPS指令也可以不使用操作数,此时可用指令CMPSB或CMPSW分别表示字节串比较或字串比较.

        4. 例如: 对两个字节串进行比较,若一致,则AL内容置为0;若不一致,则AL内容置为0FFH.程序段如下:
                MOV SI,OFFSET ST1
                MOV DI,OFFSET ST2 
                MOV CX,N
                CLD 
       NEXT:CMPSB
                JNZ FIN
                DEC CX
                JNZ NEXT
                MOV AL,0
                JMP OVR

         FIN:MOV AL,0FFH 
        OVR:MOV RSLT,AL

        5.CMPSD不大一样,它是双字扫描,其它的基本相同.

----------------------------------------------------------------------------------------------------------------------------------------------------------

.

三.扫描串指令:SCASBSCASWSCASD ;依据 AL/AX/EAX 中的数据扫描 EDI 指向的数据, 执行后 EDI 自动变化

 字符串搜索指令

 格式: SCAS OPRD
 ----  SCASB 
         SCASW

         SCASD        ;它是双字扫描,其它的基本相同

 功能: 把AL(字节串)或AX(字串)的内容与由DI寄存器寻址的目的串中的数据相减,结果置标志位,但不改变任一操作数本身.地址指针DI自动调整.
 

 说明: 1. 其中OPRD为目的串符号地址.
 ----
       2. 本指令影响标志AF、CF、OF、PF、SF、ZF.该指令可查找字符串中的一个关键字,只需在本指令执行前,把关键字放在AL(字节)或AX(字串 )中,用重复前缀可在整串中查找.
          指令中不使用操作数时,可用指令格式SCASB,SCASW,分别表示字节串或字串搜索指令.

       3. 例如: 寻找字符串中有否'$'字符
                MOV DI,OFFSET STR
                MOV CX,N               ;N为串长度
                MOV AL,'$'
                CLD 
       AGN:SCASB
                JZ FIN
                DEC CX
                JNZ AGN
                MOV AL,0 ;未找到,AL中置0
                JMP OVR 
         FIN:MOV AL,0FFH   ;找到,AL中置为0FFH 
       OVR:MOV RALT,AL

----------------------------------------------------------------------------------------------------------------------------------------------------------

.

四.储存串指令:STOSBSTOSWSTOSD ;将 AL/AX/EAX 中的数据储存到 EDI 给出的地址, 执行后 EDI 自动变化

 

 字符串存储指令 STOS

 格式: STOS OPRD
 ----  STOSW

         STOSD   它是双字传送,其它的基本相同.

 功能: 把AL(字节)或AX(字)中的数据存储到DI为目的串地址指针所寻址的存储器单元中去.指针DI将根据DF的值进行自动调整.

 说明: 1. 其中OPRD为目的串符号地址.
         2. 本指令不影响标志位.当不使用操作数时,可用STOSB或STOSW分别表示字节串或字串的操作.

---------------------------------------------------------------------------------------------------------------------------------------------------------

.

五.载入串指令:LODSBLODSWLODSD ;将 ESI 指向的数据载入到 AL/AX/EAX, 执行后 ESI 自动变化

 

 取字符串元素指令 LODS

 格式: LODS OPRD 其中OPRD为源字符串符号地址.
 
 功能: 把SI寻址的源串的数据字节送AL或数据字送AX中去, 并根据DF的值修改地址指针SI
            进行自动调整.

 

 说明:   1. 本指令不影响标志位.
           2. 当不使用操作数时,可用LODS(字节串)或LODSW(字串)指令.

----------------------------------------------------------------------------------------------------------------------------------------------------------.

上述指令可以有重复前缀

:REP      ECX > 0

REPE (或 REPZ)ECX > 0 且 ZF=1

REPNE(或REPNZ)ECX > 0 且 ZF=0

;重复前缀可以自动按单位(1、2、4)递减 ECX

 

嗯   串传送指令   功能都是比较强大的  

对一个函数进行反编译  我们也会发现   编译器利用了这些串传送指令 对局部变量进行了初始化  

 

xor eax,eax                     ;要将这块内存的每个单元要初始化的数值 送入eax
mov edi,offset szString   ;获取这块内存的地址 送去edi
mov ecx,dwStingSize      ;这块内存的要初始化的长度 送去ecx
cld                                  ;CLD使DF复位,即DF=0
rep stosb                        ;重复覆盖掉edi所指向的单元
REP                                ;CX<>0 重复执行字符串指令


汇编指令stosb,stosw,stosd,分别是把AL,AX,EAX的内容存储到EDI所指的内存单元中,同时根据EDI的值根据方向标志增加或减少,可配合指令REP一起使用

另外:汇编指令MOVSB,MOVSW,意思是搬移一个字节或一个字,它是把 DS:SI 所指地址的一个字节搬移到 ESI 所指的地址上,搬移后原来的内容不变,但是原来 ESI 所指的内容会被覆盖而且在搬移之后 SI 和 DI 会自动的指向下一个要搬移的地址。

RtlMoveMemory      移动内存 ----> ?--->movsb
RtlFillMemory           填充内存块 --->eax = ? ---->stosb
RtlZeroMemory        以0填充内存块 -->eax = 0 ----->stosb 如果是sw,sd的话 那样计数的方式就不一样了

---------------------------------------------------------------------------------------------------------------------------------------------------------- 

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------------- 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------------- 

 

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------------- 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xamarin iOS编写第一个应用程序创建工程

Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后&#xff0c;就可以在Xamarin Studio中编写程序了。本节将主要讲解在Xamarin Studio中如何进行工程的创建以及编写代码等内容XamariniOS编写第一个应用程序创建工程本文选自Xamarin iOS开发实战大学霸。 1.3.…

Jade之Extends

Extends jade允许多个jade文件继承一个jade文件。 jade&#xff1a; //- layout.jade doctype html htmlheadblock titletitle Default titlebodyblock content //- index.jade extends ./layout.jadeblock titletitle Article Titleblock contenth1 My Article html&#xff1…

Win32ASM学习[19]:结构与联合

结构和联合分别用 struct、union 定义, 都是 ends 结束定义. 它们使用方法相同, 并可以互相嵌套; 主要区别是后者的各成员共用同一个地址. -------------------------------------------------------------------------------------------------------------------------------…

hdu 1257 最少拦截系统(贪心)

题意&#xff1a; 最少需要多少个拦截系统才能将所有的导弹拦截下来。 思路&#xff1a; 第1枚导弹一定需要第一个拦截系统&#xff0c;第2枚导弹如果比第1个高度高&#xff0c;则需要第二个拦截系统。 考虑第i枚导弹&#xff0c;如果前i-1枚导弹的高度都比它小&#xff0c;则需…

Birt使用总结

把report放到其他服务器要重新建立Data Source ,这是配置&#xff0c;拷贝项目时不会同时拷贝 (1)在EXTJs中利用Report实现报表的刷新 Ext.getCmp("showview").body.update("<iframe idshowviewframe src" "> </iframe>"…

Win32ASM学习[20]:子程序

关于函数调用约定 :函数调用约定 这是以前的一个求和函数的例子 ---------------------------------------------------------------------------------------------------------------- .386 .model flat, stdcall include windows.inc include kernel32.inc include …

Mac联网恢复系统重新安装Lion

Mac的Lion系统&#xff0c;虽然不像Windows那样需要经常重装&#xff0c;但也难免会有要重置的时候&#xff0c;比如更换硬盘。本文介绍如何利用Mac的联网恢复系统进行Lion系统的在线恢复。Mac的在线恢复系统只在近几年的机型上才有&#xff0c;在进行系统恢复前&#xff0c;请…

【线性代数公开课MIT Linear Algebra】 第二十三课 微分方程与exp(At)

本系列笔记为方便日后自己查阅而写&#xff0c;更多的是个人见解&#xff0c;也算一种学习的复习与总结&#xff0c;望善始善终吧~ 一阶常系数微分方程 Aududt 将一阶常系数微分方程转换为线性代数问题的关键在于常系数微分方程的解一定是指数形式的。那么我们的需要求解的东西…

Win32ASM学习[21]:宏汇编(1)

-------------------------------------------------------------------------------------------------------------------- 嗯 上个星期到现在 把Win32ASM基础汇编复习了下 在网上找到了 这个不错系列 于是就转载过来了 其中 根据我自己的水平 删减了一些内容 或…

ubunu安装软件的一个错误

http://tonychiu.blog.51cto.com/656605/654776/ 由于ubuntu/debian软件库中有时候不同的库更新速度不一致&#xff0c;apt-get 出出现如下的错误提示 Some packages could not be installed. This may mean that you have requested an impossible situation or if you are us…

常用的基本Windows数据类型

常用的基本Windows数据类型 --------------------------------------------------------------------------------------------------------------------------------------------------------- 类 型 …

删除空文件夹 清除CS扩展名文件 bat

删除空文件夹。删的干净。删的彻底。 将下列代码复制到txt中保存。并把后缀.txt命成.bat。然后运行即可。 方案&#xff11;.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 删除指定目录及其子目录下的空文件夹.bat 代码&#xff1a;…

ios 坐标转换

// 将像素point由point所在视图转换到目标视图view中&#xff0c;返回在目标视图view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 将像素point从view中转换到当前视图中&#xff0c;返回在当前视图中的像素值 - (CGPoint)convertPoint:(C…

80X86伪指令

8086 伪指令表 一、数据定义伪操作 伪 指 令 名 称 语 句 格 式 功 能 定义字节类型的数据存储区 [变量名] DB 表达式[&#xff0c;…] 定义一个以变量名为首址的字节类型数据存储区&#xff0c;所含数据元素的个数由其后表达式的个数所决定&#xff0c;数据存储单元…

jQuery慢慢啃之选择器(二)

1.$("#myDiv");ID匹配一个元素 <span id"foo[bar]"></span> $("#foo\\[bar\\]);//转义 2.$("div");//元素标签名匹配 3.$(".myClass"); css类名匹配 4.$("*") 匹配所有元素&#xff0c;多用于结合上下文…

iOS学习之基本概念

学习iOS最重要的是态度和兴趣&#xff0c;如果你对于学习始终抱有不断的热情和端正的态度&#xff0c;那么&#xff0c;无论是什么&#xff0c;你总会成功的&#xff01; 有一句话与大家共勉&#xff1a;过程中跌倒多少次都没有关系&#xff0c;重要的是&#xff0c;跌倒后你能…

Win32ASM代码基本模块

;-------------------------------------------------------------------------------- ;程序环境设置 .386 .model flat,stdcall option casemap:none ;-------------------------------------------------------------------------------- ;头文件与库文件导入 include windo…

ORA-16038: log 3 sequence# 103 cannot be archived

[sizelarge]今天在自己机器做了个实验&#xff0c;插入10万条&#xff0c;由于空间少&#xff0c;重启数据库时出现&#xff1a; [sizex-large]SQL> startup ORACLE instance started. Total System Global Area 188743680 bytes Fixed Size 1218460 byte…

Win32ASM学习[23]:RadASM快捷键

RadASM快键操作 一.书签 SHIFTF8为所在行下书签或删除书签(Crtl0-9能定义存于文件中的10个书签)&#xff0c; 可通过编辑\书签\开关书签。&#xff08;CRTLF8为下一书签&#xff0c;F8为上一书签&#xff09; 二、列选择&#xff1a; 拉框时用到&#xff0c;CRTLB为切换行…

SAP MM/FI 自动过账实现 OBYC 接口执行

一. 自动过账原理 在MM模块的许多操作都能实现在FI模块自动过账&#xff0c;如PO收货、发票验证(LIV)、工单发料、向生产车间发料等等。不用说&#xff0c;一定需要在IMG中进行配置才可以实现自动处理。但SAP实现的这种自动配置的机制是怎样的呢&#xff1f;其实也并不复杂&…