串操作

https://www.sogou.com/tx?query=%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E4%BD%BF%E7%94%A8%E5%AF%BF%E5%91%BD%E6%98%AF%E5%A4%9A%E4%B9%85&ie=utf8&_ast=1512310656&_asf=null&w=01029901&hdq=sogou-site-c91e3483cf4f9005-1025&duppid=1&cid=&s_from=result_up&sut=13565&sst0=1512379322505&lkt=0%2C0%2C0&sugsuv=002C75213B442B9159E31810970AD202&sugtime=15123793225051   串指令

    80X86有5个用于串操作的指令:

movs(串传送):把一个串从存储器的一个位置复制到另外一个位置。

cmps(串比较):用于比较两个串的内容。

scas(串扫描)查找串中某个特定的值

stos(存入串):存储一个新的值到串的某个位置

和Lods(从串取):复制出串的某个位置的值

串的定义方法:

 response    byte    20  dup(?)


注意:串和数组表面上不同,实际上他们是相同的 。

每一条指令需要一个串源,一个目的串,或者两者都需要。串指令出处理串时,一次处理串中的一条字节,字,或者双字。

寄存器间接寻址用来定位单独的字节,字,或者双字元素

80x86指令使用源索引寄存器ESI的地址来访问源串中的元素,使用目的索引器EDI的地址来访问目的串中的元素。如果程序使用 的是分段储存模式,侧应该知道源串的元素在数据段中(地址为DS:ESI),同时,目的串的元素在附加段(地址为DS:ESI)中。

在平面储存模式的程序中,段寄存器有相同的段号,各个段之间无差别。  00

如果没有任何操作数,汇编器不能判断串的 长度。


微软的宏编译对此提供了两种方法,第一钟方法是使用目的操作数和源操作数,但必须知道操作数的类型,否则操作数将被忽略。

第二种使用特殊的助记符来定义元素的长度,字节操作串指令使用b后缀,字长操作的指令使用w后缀,双字的串指令使用d后缀

串指令虽然一次只能操作一个元素,但已对下一个元素的操作做好准备。

移动的方向由方向标志DF决定:DF=1递减,从右到左对串进行操作,DF=0递增,从左到右对串进行操作。cld将DF清零,std将DF清为1.

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



详细论述以上指令:

1  movs指令


  把一个串的元素从源串传送到目的串,即指令DS:ESI指向的源元素被复制到ES:EDI。具有具有movsb.movsw,movsd三种形式。

movs指令过程中使用了strcopy函数,该过程有两个通过栈传递的参数,这两个参数给出了字节串或者字符串的源地址和目的地址。

该过程仅使用了EDI,ESI寄存器,在堆栈中保存了他们的值和标志寄存器,因而过程返回时不会改变他们的值,索引寄存器EDI,ESI必须被初始化为待处理串的第一个字节的地址。ESI和EDI作为参数入栈,方向标志清零,从左到右复制串。

,k





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值