串操作指令一
- 格式:ppt
- 大小:281.00 KB
- 文档页数:13
串操作指令的使用一、串操作指令概述所谓串就是内存中一段地址相连的字节或字。
串操作就是对串中各项数据进行某种运算,也叫数据块操作。
8086/8088有5种基本串操作:⏹MOVS(Move string)串传送指令⏹CMPS(Compare string)串比较指令⏹SCAS(Scan string)串扫描指令⏹LODS(Load from string)从串取指令⏹STOS (Store in to string)存入串指令可以使用3种重复前缀:⏹REP(Repeat)无条件重复⏹REPE/REPZ(Repeat while equal/zero)相等/为零则重复⏹REPNE/REPNZ(Repeat while not equal/not zero)不相等/不为零则重复二、串操作指令详解★MOVS 串传送格式:MOVS dest,srcMOVSB(字节传送)MOVSW(字传送)功能:把DS:SI所指向的内存单元中的一个字或字节的内容取出复制到ES:DI所指向的字或字节内存单元中。
同时SI±1、DI±1或SI±2、DI±2,方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。
说明:☆单条MOV指令不能完成存储单元之间的数据传送;MOVS指令就是为解决内存储单元之间数据传送而设置的。
☆所涉及到的源内存单元和目的内存单元的地址分别存放在DS:SI和ES:DI中。
✧MOVS串传送指令不影响标志寄存器。
★LODS 从串取指令格式:LODS srcLODSB (取字节)LODSW(取字)功能:把DS:SI所指向的内存单元中的字或字节内容传送到AX或AL寄存器中。
同时SI 加减1或2;方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。
说明:☆LODS指令可用于取出指定的内存单元中的内容。
✧默认目的寄存器为AX或AL寄存器。
汇编-串操作指令串传输指令基础知识简介1. 系统标志寄存器EFLAGSDF: ⽅向标志位。
在串处理指令中,控制每次操作后si, di的增减DF=0 每次操作后si,di递增DF=1 每次操作后si,di递减2. std指令功能将系统标志寄存器EFLAGS中的DF(⽅向标志)置为1,即 DF=13. cld指令功能将系统标志寄存器EFLAGS中的DF(⽅向标志)置为0,即 DF=04. movs:串传送指令语法格式:movsb、movsw说明:(1)将DS:[SI]的内容传送到ES:[DI](2)若DF=0,则DI增加1,2、4。
否则DI减少1,2、45. stos:串存储指令语法格式:stosb、stosw、stosd说明:(1)将AL\AX\EAX寄存器的值复制到ES:DI所指的内存单元(2)若DF=0,则DI增加1,2、4。
否则DI减少1,2、46. scas:串扫描指令语法格式:scasb、scasw说明:(1)将ES:[DI]所指向的内容与AL/AX/EAX(字节/字/双字)进⾏⽐较,并依据所得到的差值来设置相关标志位。
受影响的标志位: AF,CF,OF,PF,SF,ZF(2)若DF=0,则DI增加1,2、4。
否则DI减少1,2、47. rep:重复前缀指令rep指令重复其后指定的字符串操作指令,重复的次数由计数寄存器cx来决定8. 使⽤串相关指令的⽅法:(1)传送的原始位置:ds:si(2)传送的⽬的位置:es:di(3)传送的⽅向:DF(4)传送长度:cx9. 算数和逻辑操作地址10. ⽰例如下:(1)#define copy_page(from,to) \__asm__("cld ; rep ; movsl"::"S" (from),"D" (to),"c" (1024)) // 从from处复制1页内存到to处(4K字节)(2)unsigned long get_free_page(void){register unsigned long __res asm("ax");__asm__("std ; repne ; scasb\n\t" // 置⽅向位,al(0)与对应每个页⾯的(di)内容⽐较"jne 1f\n\t" // 如果没有等于0的字节,则跳转结束(返回0)."movb $1,1(%%edi)\n\t" // 1 => [1+edi],将对应页⾯内存映像bit位置1."sall $12,%%ecx\n\t" // 页⾯数*4k = 相对页⾯其实地址"addl %2,%%ecx\n\t" // 再加上低端内存地址,得页⾯实际物理起始地址"movl %%ecx,%%edx\n\t" // 将页⾯实际其实地址->edx寄存器。
3.3.4 串操作指令串或字符串是指在内存中连续存放的由字节或字组成的数据串,可以是数值型或字符型数据。
我们常常要从数据串中查找特定数据;或者比较两个串是否相同等,或者把一个串从内存的一个区域传送到另一个区域等操作;使用串操作指令就是最佳选择。
串操作指令对串中数据进行相同的操作,可以以字节为单位或以字为单位,可操作的最大串长度为64K。
串操作指令包括:MOVS 串传送CMPS 串比较SCAS 串扫描STOS 存入串LODS 取串这五种串操作指令都是隐含指令,说明如下:①源操作数(源串)默认由DS:SI指定,即源串默认在数据段,允许段超越为CS、ES 和SS。
偏移地址指针SI自动修改。
②目的操作数(目的串)默认由ES:DI指定,即目的串默认在附加数据段。
不允许段超越。
偏移地址指针DI自动修改。
③通过设定标志寄存器中的方向标志位DF的值,可以控制串操作的方向。
DF设定为0,偏移地址指针SI和DI自动增量,如果串操作为字节操作,每次偏移地址指针加1,如果为字操作,每次偏移地址指针加2。
DF设定为1,偏移地址指针自动减量。
如果串操作为字节操作,每次偏移地址指针减1,如果为字操作,每次偏移地址指针减2。
如图3-9所示。
④串操作指令本身只操作一次,例如指令MOVSB的功能为将DS:SI指明的一个字节传送到ES:DI指明的内存单元中。
如果要使整个的源串数据全部传送到目的串中,需要再加一个重复前缀REP。
用于串操作指令的重复前缀有三种,分别是:REP:无条件重复前缀REPE:相等时重复(ZF=1),REPZ:比较结果为0时重复REPNE:不相等时重复(ZF=0),REPNZ:比较结果不为0时重复⑤带重复操作前缀的串操作指令,需要指明重复次数。
用计数器CX指定串长度,即重复次数,每次串操作后CX自动减1,直到CX=0,串操作结束。
综上所述:在使用串操作指令前应预先设置源串指针DS:SI,目的串指针ES:DI,计数器CX 和标志位DF。
一、概述1)串和串操作存储器中的地址连续的若干单元的字符或数据称为字符串或数据串。
串操作指令就是用来对串中每个字符或数据进行操作的指令。
串指令既可处理字节串,也可处理字串,并在每完成一个字节(或字)的操作后,能够自动修改指针,以便执行下一个字节(或字)的操作。
串指令可完成两个存储单元之间的传送和比较操作(也只有串指令才可以)。
2)串操作的共同点l 源串(源操作数)默认在数据段中:段基地址由DS指定(但允许段超越),偏移地址由SI指定。
即源串指针为DS:SI;l 目的串(目的操作数)默认在附加段中,段基地址由ES指定,偏移地址由DI指定。
即目的串指针为ES:DI;l 若要使用重复前缀,则应把串长度放在CX中;l 在对串中的每个字节(或字)操作后,SI和DI中的串地址都会自动修改:±1或±2。
其中±由方向标志DF决定:若DF=0,取“+”;若DF=1,取“-”。
增减量大小由操作数类型决定:字节操作增减量为1,字操作增减量为2。
若使用了重复前缀,CX的内容也会每次自动减1。
3)串指令的操作①执行规定的操作;② SI和(或)DI自动增量(或减量);③若有重复前缀,CX自动减1。
由上可知,使用串操作指令之前应该设置:方向标志(DF)、源串指针(DS:SI)、目的串指针(ES:DI)和重复次数(CX)。
显然,串操作指令可以处理的最大串长度为65535字节(或字)。
二、重复操作前缀串操作指令前面允许带有一个重复操作前缀(简称重复前缀),使该指令能重复执行。
重复前缀使得串操作指令在每完成一次操作后自动修改CX的值,直到CX=0或满足指定的条件为止。
重复前缀包括:REP CX≠0时重复执行指令规定的操作(无条件重复前缀)REPE/REPZ CX≠0∧ZF=1时重复执行指令规定的操作REPNE/REPNZ CX≠0∧ZF=0时重复执行指令规定的操作重复前缀可单独写为一行,也可写在串指令前面(但要用空格分开)。
串操作指令串操作指令串操作指令就是用一条指令实现对一串字符或数据的操作。
8086的串操作指令的特点是:◆通过加重复前缀来实现重复操作。
重复的次数取决于C X寄存器的内容(在字符串比较和字符串检索指令中还与Z F标志有关)。
◆可以对字节串进行操作,也可以对字串进行操作。
◆所有的串操作指令都用寄存器S I对源操作数进行间接寻址,默认段寄存器为D S;所有的串操作指令都用寄存器D I为目的操作数进行间接寻址,默认段寄存器为E S。
串操作指令是唯一的一组源操作数和目的操作数都在存储器中的指令。
◆串操作时,地址指针的修改与方向标志D F有关,当D F=1时,S I和D I作自动减量修改,当D F=0时,S I和D I作自动增量修改。
串操作指令一共有5条:◆字符串传送指令M O V S B/M O V S W◆字符串比较指令C M P S B/C M P S W◆字符串检索指令S C A S B/S C A S W◆取字符串指令L O D S B/L O D S W◆存字符串指令S T O S B/S T O S W与上面串操作指令配合使用的重复前缀有:◆重复R E P◆相等则重复/为零则重复R E P E/R E P Z◆不相等则重复/不为零则重复R E P N E/R E P N Z在串操作指令的前面加上重复前缀,使C P U能重复执行该指令,这使处理长字符串比用软件循环处理快得多。
在执行有重复前缀的串操作指令时,C X寄存器控制重复次数,每重复执行一次,C X 内容减1,C X减为0结束;此外,还可以按规定的条件(Z F=1或Z F =0)结束重复过程。
重复前缀对规定条件的检测,是在每次进入串操作以前进行的。
所以若初始化使操作次数C X为0,它将不会引起任何操作。
一、字符串传送指令M O V S B/M O V S W字符串传送指令M O V S B/M O V S W将位于D S段的、由S I所指出的存储单元的内容传送到位于E S段、由D I所指的存储单元中,再修改S I和D I,从而指向下一个元素,M O V S B用于字节传送,M O V S W用于字传送。