第8讲-汇编串操作类指令.

上传人:艳*** 文档编号:181474472 上传时间:2023-01-14 格式:PPT 页数:25 大小:232KB
返回 下载 相关 举报
第8讲-汇编串操作类指令._第1页
第1页 / 共25页
第8讲-汇编串操作类指令._第2页
第2页 / 共25页
第8讲-汇编串操作类指令._第3页
第3页 / 共25页
点击查看更多>>
资源描述
将将数据段数据段source指示的指示的100个字节数传送到附加段个字节数传送到附加段destination指示的主存区指示的主存区mov si,offset sourcemov di,offset destinationmov cx,100again:mov al,si mov di,al inc si inc didec cxjnz again;判断传送次数;判断传送次数cxcx是否为是否为0 0;不为;不为0 0,则到,则到againagain位置执行指令位置执行指令;否则,结束;否则,结束第第8讲讲 串操作类指令串操作类指令串操作指令是串操作指令是80868086指令系统中比较独特的一类指指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,常用在操作令,采用比较特殊的数据串寻址方式,常用在操作主存连续区域的数据时主存连续区域的数据时主要熟悉:主要熟悉:MOVS STOS LODSCMPS SCAS REP一般了解:一般了解:REPZ/REPE REPNZ/REPNE串数据类型串数据类型串操作指令的操作数是串操作指令的操作数是主存中连续存放的数据串(主存中连续存放的数据串(String)即在连续的主存区域中,字节或字的序列即在连续的主存区域中,字节或字的序列串操作指令的串操作指令的操作对象是以字(操作对象是以字(W)为单位的字串,)为单位的字串,或是以字节(或是以字节(B)为单位的字节串)为单位的字节串串寻址方式串寻址方式源源操作数用寄存器操作数用寄存器SI寻址,默认在数据段寻址,默认在数据段DS中,但允中,但允许段超越:许段超越:DS:SI目的目的操作数用寄存器操作数用寄存器DI寻址,默认在附加段寻址,默认在附加段ES中,不中,不允许段超越:允许段超越:ES:DI每执行一次串操作指令,每执行一次串操作指令,SI和和DI将自动修改:将自动修改:n1(对于字节串)或(对于字节串)或2(对于字串)(对于字串)n执行指令执行指令CLD后,后,DF=0,地址指针,地址指针增增1或或2n执行指令执行指令STD后,后,DF=1,地址指针,地址指针减减1或或2串传送串传送MOVS(move string)把字节或字操作数从主存的源地址传送至目的地址把字节或字操作数从主存的源地址传送至目的地址MOVSB;字节串传送:;字节串传送:ES:DIDS:SIES:DIDS:SI;SISISISI1 1,DIDIDIDI1 1MOVSW;字串传送:;字串传送:ES:DIDS:SIES:DIDS:SI;SISISISI2 2,DIDIDIDI2 2将将数据段数据段source指示的指示的100个字节数传送到附加段个字节数传送到附加段destination指示的主存区指示的主存区mov si,offset sourcemov di,offset destinationmov cx,100;cxcx传送次数传送次数cld;置;置DF=0DF=0,地址增加,地址增加again:movsb;传送一个字节;传送一个字节dec cx;传送次数减;传送次数减1 1jnz again;判断传送次数;判断传送次数cxcx是否为是否为0 0;不为;不为0 0,则到,则到againagain位置执行指令位置执行指令;否则,结束;否则,结束例例2.52:字串传送:字串传送mov si,offset sourcemov di,offset destinationmov cx,50;cxcx传送次数传送次数cld;置;置DF=0DF=0,地址增加,地址增加again:movsw;传送一个字;传送一个字dec cx;传送次数减;传送次数减1 1jnz again;判断传送次数;判断传送次数cxcx是否为是否为0 0;不为;不为0 0,则到,则到againagain位置执行指令位置执行指令;否则,结束;否则,结束串存储串存储STOS(store string)把把AL或或AX数据传送至目的地址数据传送至目的地址STOSB;字节串存储:;字节串存储:ES:DIALES:DIAL;DIDIDIDI1 1STOSW;字串存储:;字串存储:ES:DIAXES:DIAX;DIDIDIDI2 2将附加段将附加段64KB主存区全部设置为主存区全部设置为0mov ax,0mov di,0mov cx,8000h;cxcx传送次数(传送次数(323210241024)cld;DF=0DF=0,地址增加,地址增加again:stosw;传送一个字;传送一个字dec cx;传送次数减;传送次数减1 1jnz again;传送次数;传送次数cxcx是否为是否为0 0 可将可将CLD改为改为STD吗?吗?如何改用如何改用STOSB?串读取串读取LODS(load string)把指定主存单元的数据传送给把指定主存单元的数据传送给AL或或AXLODSB;字节串读取:;字节串读取:ALDS:SIALDS:SI;SISISISI1 1LODSW;字串读取:;字串读取:AXDS:SIAXDS:SI;SISISISI2 2MOVS、STOS、LODS均不影响标志位均不影响标志位示例示例数据段数据段DS中有一个数据块,具有中有一个数据块,具有count字节,起字节,起始地址为始地址为block,现在要把其中的正数、负数分开,现在要把其中的正数、负数分开,分别存入同一个段的两个缓冲区,存放正数的,分别存入同一个段的两个缓冲区,存放正数的起始地址为起始地址为dplus,存放负数的起始地址为,存放负数的起始地址为dminus.mov si,offset blockmov di,offset dplusmov bx,offset dminusmov ax,dsmov es,axmov cx,countcld lodsbtest al,80hjnz minusstosbjmp againxchg bx,distosbxchg bx,didec cxjnz go_ongo_on:minus:again:串比较串比较CMPS(compare string)将主存中的源操作数减去至目的操作数,将主存中的源操作数减去至目的操作数,以便设置标以便设置标志,志,进而比较两操作数之间的关系进而比较两操作数之间的关系CMPSB;字节串比较:;字节串比较:DS:SIDS:SIES:DIES:DI;SISISISI1 1,DIDIDIDI1 1CMPSW;字串比较:;字串比较:DS:SIDS:SIES:DIES:DI;SISISISI2 2,DIDIDIDI2 2例例2.55:比较数据段中:比较数据段中string1字符串和附加段中字符串和附加段中string2字符串是否相同,相同的将字节变量字符串是否相同,相同的将字节变量result置为置为ffH,不同的话置为,不同的话置为0.mov si,offset string1mov di,offset string2mov cx,countcldcmpsb;比较两个字符;比较两个字符jnz unmat;有不同字符,转移;有不同字符,转移dec cxjnz again;进行下一个字符比较;进行下一个字符比较mov al,0;字符串相等,设置;字符串相等,设置00h00hjmp output;转向;转向outputoutputunmat:mov al,0ffh;设置;设置ffhffhoutput:mov result,al;输出结果标记;输出结果标记again:串扫描串扫描SCAS(scan string)将将AL/AX减去至目的操作数,减去至目的操作数,以便设置标志,以便设置标志,进进而比较而比较AL/AX与操作数之间的关系与操作数之间的关系SCASB;字节串扫描:;字节串扫描:ALALES:DIES:DI;DIDIDIDI1 1SCASW;字串扫描:;字串扫描:AXAXES:DIES:DI;DIDIDIDI2 2例例2.56:在字符串中查找:在字符串中查找“空格空格”mov di,offset stringmov al,20hmov cx,countcldagain:scasb;搜索;搜索jz found;为;为0 0(ZF=1ZF=1),发现空格),发现空格dec cx;不是空格;不是空格jnz again;搜索下一个字符;搜索下一个字符.;不含空格,则继续执行;不含空格,则继续执行found:.重复前缀指令重复前缀指令(repeat)串操作指令执行一次,仅对数据串中的一个字节或字串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但是串操作指令前,都可以加一个重复量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在前缀,实现串操作的重复执行。重复次数隐含在CX寄寄存器中存器中重复前缀分重复前缀分2类,类,3条指令:条指令:n配合配合不影响标志不影响标志的的MOVS、STOS(和(和LODS)指)指令的令的REP前缀前缀n配合配合影响标志影响标志的的CMPS和和SCAS指令的指令的REPZ和和REPNZ前缀前缀REP重复前缀指令重复前缀指令REP前缀可以理解为:当数据串没有结束前缀可以理解为:当数据串没有结束(CX0),则继续传送,则继续传送例例2.52和例和例2.53中,程序段的最后中,程序段的最后3条指令,可以条指令,可以分别替换为:分别替换为:REP MOVSB 和和 REP STOSWREP;每执行一次串指令,;每执行一次串指令,CXCX减减1 1;直到;直到CXCX0 0,重复执行结束,重复执行结束重复串传送重复串传送(例(例2.52)mov si,offset sourcemov di,offset destinationmov cx,100;cxcx传送次数传送次数cldrep movsbagain:movsb;传送一个字节;传送一个字节dec cx;传送次数减;传送次数减1 1jnz again;判断传送次数;判断传送次数cxcx是否为是否为0 0;不为;不为0 0(ZF=0ZF=0),则转移),则转移againagain位置执行位置执行;否则,结束;否则,结束重复串存储重复串存储(例(例2.53)mov ax,0mov di,0mov cx,8000hcldrep stoswagain:stosw;传送一个字;传送一个字dec cx;传送次数减;传送次数减1 1jnz again;判断传送次数;判断传送次数cxcx是否为是否为0 0REPZ重复前缀指令重复前缀指令REPZ/REPE前缀可以理解为:当数据串没有结束前缀可以理解为:当数据串没有结束(CX0),并且串相等,并且串相等(ZF1),则继续比较,则继续比较REPZ;每执行一次串指令,;每执行一次串指令,CXCX减减1 1;并判断;并判断ZFZF是否为是否为0 0,;只要;只要CXCX0 0或或ZFZF0 0,重复执行结束,重复执行结束REPNZ重复前缀指令重复前缀指令REPNZ/REPNE前缀可以理解为:当数据串没有结前缀可以理解为:当数据串没有结束束(CX0),并且串不相等,并且串不相等(ZF0),则继续,则继续比较比较REPNZ;每执行一次串指令,;每执行一次串指令,CXCX减减1 1;并判断;并判断ZFZF是否为是否为1 1,;只要;只要CXCX0 0或或ZFZF1 1,重复执行结束,重复执行结束例例2.57:比较字符串是否相等:比较字符串是否相等mov si,offset string1mov di,offset string2mov cx,countcldcmpsb;比较两个字符;比较两个字符jnz unmat;有不同字符,转移;有不同字符,转移dec cxjnz again;进行下一个字符比较;进行下一个字符比较mov al,0;字符串相等,设置;字符串相等,设置00h00hjmp output;转向;转向outputoutputunmat:mov al,0ffh;设置;设置ffhffhoutput:mov result,al;输出结果标记;输出结果标记again:repz cmpsb重复比较的解释重复比较的解释指令指令repz cmpsbrepz cmpsb结束重复执行的情况结束重复执行的情况 ZFZF0 0,即,即出现不相等的字符出现不相等的字符 CXCX0 0,即,即比较完所有字符:比较完所有字符:这种情况下,如果这种情况下,如果ZFZF0 0,说明最后一个字符不,说明最后一个字符不等;而等;而ZFZF1 1表示所有字符比较后都相等,也就表示所有字符比较后都相等,也就是两个字符串相同是两个字符串相同所以,重复比较结束后,所以,重复比较结束后,jnz unmat指令的条件成指令的条件成立立ZF0,字符串不相等,字符串不相等例例2.56:在字符串中查找:在字符串中查找“空格空格”mov di,offset stringmov al,20hmov cx,countcldagain:scasb;搜索;搜索jz found;为;为0 0(ZF=1ZF=1),发现空格),发现空格dec cx;不是空格;不是空格jnz again;搜索下一个字符;搜索下一个字符.;不含空格,则继续执行;不含空格,则继续执行found:.repnz scasb;搜索;搜索
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!