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