博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]汇编语言:MOVSB,MOVSW,MOVSD
阅读量:4550 次
发布时间:2019-06-08

本文共 917 字,大约阅读时间需要 3 分钟。

汇编语言:MOVSB,MOVSW,MOVSD

转自: 

 

 

目前80386系列的处理器提供几组处理字节、字和双字数值的指令,尽管这些指令成为基本字符串指令,但他们的用法并不局限于字符数组。 

     指令:                                           
     MOVSB, MOVSW, MOVSD 
                         
     描述: 
     移动字符串数据,复制由ESI寄存器寻址的内存地址处的数据至EDI寻址的内存地址处。 
     在保护模式程序中,也就是我们80386默认的启动模式,ESI自动作为由DS寻址的段内偏移,EDI自动作为由ES寻址的段内偏移,ES和DS总是具有同样的值且无法改变它们。(在实地址模式(8086)模式下ES和DS是我们程序员操纵的)。
     
     我们来看这三个指令:MOVSB, MOVSW, MOVSD   ,我们可以发现它们就最后一个字母不同,其实最后一个字母也就表示的是我们每次移动的数据字节大小。第一个MOVSB是每次一个字节,其次是一个字、接着一个双字。 我们从它的'B','W','D'就可以看出来。 B代表Byte,W代表WORD, D代表DWORD。
     上面这3个字符串操作指令本身每次只能处理一个或一对值,但如果增加一个重复前缀,指令就会使用ecx寄存器作为计数器进行重复。重复前缀可以仅用一条指令处理整个数组。
     重复前缀REP : 当ECX>0时重复 (和我们的loop循环相似)。 
     
     
     看了上面的理论,我们来个演示吧。 
     cld   ;方向标志 
     mov   esi, 内存地址1     ;(也就是存放字符串的内存地址) 
     mov   edi, 内存地址2     ;(要移动到目的处的地址) 
     mov   ecx, 要移动的数量 ; 
     rep   movsb 
    cld是来控制重复移动时候的esi 和edi的递增方式。 cld是将方向标志位DF设置为0,每次rep循环的时候,esi和edi自动+1。   std是将方向标志位DF设置为1,每次rep循环的时候,esi和edi自动-1。
   rep循环前缀在执行循环的时候,ecx寄存器是每次减1的。和我们的loop循环一样。 
   我们在进行字符串操作时,千万要记住要首先设置方向标志,否则会发生不可预料的结果。

转载于:https://www.cnblogs.com/nikosoft/p/4139071.html

你可能感兴趣的文章
!!!??? 2.3 核心模块与应用程序的对比
查看>>
jQuery介绍
查看>>
Embeded linux之gpio
查看>>
使用PG的部分索引
查看>>
十二 链表的实现
查看>>
struts2中web.xml转http://blog.csdn.net/gopain/article/details/40790523
查看>>
uva 101 POJ 1208 The Blocks Problem 木块问题 vector模拟
查看>>
Python 面向对象 特殊方法(魔法方法)
查看>>
WCF开发实战系列二:使用IIS发布WCF服务
查看>>
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
查看>>
从性能角度分析一下String,List,Map
查看>>
转载:使用sklearn进行数据挖掘
查看>>
第四章 Apk包测试用例编写(上)
查看>>
微信小程序wepy开发,$apply()不能更新页面数据的情况
查看>>
移动web端在线观看ppt
查看>>
02-vue学习篇-以正确的姿势使用vue
查看>>
第一个Azure应用
查看>>
Java 读写锁的实现
查看>>
分享、收藏、打印页面操作
查看>>
Vim 编辑器
查看>>