串操作指令
- 格式:ppt
- 大小:413.50 KB
- 文档页数:21
实验四串操作指令程序实验一、实验目的1. 熟悉五种串操作指令的功能,会编写常用的串操作应用程序。
2. 会使用DEBUG 命令查看串操作运行的结果。
二、实验环境1. 硬件:PC 微机2. 软件:Masm for Windows 汇编集成开发环境三、实验讲义串指连续存放在存储器中的一些数据字节、字或者双字。
串操作允许对程序连续存放的数据块进行操作。
这是唯一一种可以从存储器到存储器的指令。
源串一般存放在数据段,偏移地址由SI 指定;目标串必须在附加段,偏移地址由DI 指定。
在每次进行串操作后,SI 和DI 两个指针会自动修改。
修改的是增量方向还是减量方向由标志位DF 决定,DF=0 为增量操作,DF=1 为减量操作。
CX 中存放的是数据块的长度,可在CX 前加重复前缀标志,对串进行连续操作。
执行串指令之前,一般先进行如下操作:源串首地址(末地址)→ SI目的串首地址(末地址)→ DI串长度→ CX建立方向标志DF1. 重复前缀标志助记符判断条件说明REP CX 0 CX=CX-1,若CX 0 则重复REPE 或REPZ CX 0 且ZF=1 CX=CX-1,若CX 0 且ZF=1 则重复REPNE 或REPNZ CX=0 且ZF=0 EX=CX-1,若CX 0 且ZF=0 则重复2. 方向标志指令方向标志由标志位DF 决定,有CLD 和STD 两种指令。
CLD 将DF 置0,地址为增量操作。
STD 将DF 置1,地址为减量操作。
3. 串传送指令格式: [REP] MOVS DESTS, SRCS[REP] MOVSB/ MOVSW / MOVSD功能:将DS:SI 中的源串数据传送到ES:DI 规定的目的串单元中。
加重复前缀REP 可实现连续存放的数据块的传送。
例1:将源串中前三个字节的数据传送到目的串。
源串在数据段(DATAS)中,存放在SRC 单元中;目的串在附加数据段(EDATAS)中,存放在DEST 单元中。
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。
【汇编语⾔-4】字符串处理指令stosb、lodsb、movsw、scasb、rep⼀、字符串处理指令(1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装⼊AL或AX,然后根据DF标志增减SI(2) stosb、stosw:把AL或AX中的数据装⼊ES:DI指向的存储单元,然后根据DF标志增减DI(3) movsb、movsw:把DS:SI指向的存储单元中的数据装⼊ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI(4) scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI(5) cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI(6) rep:重复其后的串操作指令。
重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。
主要⽤在MOVS和STOS前。
⼀般不⽤在LODS前。
上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX涉及的标志位:DF、AF、CF、OF、PF、SF、ZF⼆、使⽤举例(1) 把当前数据段中偏移1000H开始的100个字节的数据传送到从偏移2000H开始的单元中CLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,100NEXT:LODSBSTOSBDEC CXJNZ NEXTCLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,100NEXT:MOVSBDEC CXJNZ NEXTCLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,3NEXT:MOVSBLOOP NEXTCLDPUSH DSPOP ESMOV SI,1000HMOV DI,2000HMOV CX,3REP MOVSB(2) 判断AL中的数字是否为16进制数STRING DB '0123456789ABCDEFabcdef' STRLEN EQU $-STRING...CLDMOV DX,SEG STRINGMOV ES,DXMOV CX,STRLENMOV DI,OFFSET STRING NEXT:SCASBLOOPNZ NEXTJNZ NOT_FOUNDFOUND:...NOT_FOUND:...(3) 其它实例start:mov ax,#BOOTSEGmov ds,axmov ax,#INITSEGmov es,axmov cx,#256sub si,sisub di,direpmovwmovl $1024*5,%ecxxorl %eax,%eaxxorl %edi,%edicld;rep;stoslmovl $pg0+7,_pg_dirmovl $pg1+7,_pg_dir+4movl $pg2+7,_pg_dir+8movl $pg3+7,_pg_dir+12movl $pg3+4092,%edimovl $0xfff007,%eaxstd1: stoslsubl $0x1000,%eaxjge 1b。