串操作类指令课件_第1页
串操作类指令课件_第2页
串操作类指令课件_第3页
串操作类指令课件_第4页
串操作类指令课件_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2.5串操作类指令串操作指令是8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,在操作主存连续区域的数据时,特别好用、因而常用重点掌握: MOVSSTOSLODS CMPSSCASREP一般了解: REPZ/REPEREPNZ/REPNE2.5串操作类指令串操作指令是8086指令系统中比较独特串数据类型串操作指令的操作数是主存中连续存放的数据串(String)——即在连续的主存区域中,字节或字的序列串操作指令的操作对象是以字(W)为单位的字串,或是以字节(B)为单位的字节串串数据类型串操作指令的操作数是主存中连续存放的数据串(Str串寻址方式源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:DS:[SI]目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:[DI]每执行一次串操作指令,SI和DI将自动修改:±1(对于字节串)或±2(对于字串)执行指令CLD指令后,DF=0,地址指针增1或2执行指令STD指令后,DF=1,地址指针减1或2串寻址方式源操作数用寄存器SI寻址,默认在数据段DS中,但允串传送MOVS(movestring)把字节或字操作数从主存的源地址传送至目的地址MOVSB

;字节串传送:ES:[DI]←DS:[SI] ;SI←SI±1,DI←DI±1演示MOVSW

;字串传送:ES:[DI]←DS:[SI] ;SI←SI±2,DI←DI±2演示串传送MOVS(movestring)把字节或字操作数从主例2.52:字节串传送

movsi,offsetsource movdi,offsetdestination movcx,100 ;cx←传送次数

cld ;置DF=0,地址增加again: movsb ;传送一个字节

deccx ;传送次数减1 jnzagain

;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束offset是汇编操作符,求出变量的偏移地址例2.52:字节串传送 movsi,offsetsour例2.52:字串传送

movsi,offsetsource movdi,offsetdestination movcx,50 ;cx←传送次数

cld ;置DF=0,地址增加again: movsb ;传送一个字

deccx ;传送次数减1 jnzagain

;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束例2.52:字串传送 movsi,offsetsourc串存储STOS(storestring)把AL或AX数据传送至目的地址STOSB

;字节串存储:ES:[DI]←AL ;DI←DI±1STOSW

;字串存储:ES:[DI]←AX ;DI←DI±2演示串存储STOS(storestring)把AL或AX数据传例2.53:串存储

movax,0 movdi,0 movcx,8000h

;cx←传送次数(32×1024) cld ;DF=0,地址增加again: stosw ;传送一个字 deccx ;传送次数减1 jnzagain ;传送次数cx是否为0可将CLD改为STD吗?如何改用STOSB?可不用给DI赋值吗?DI为偶数即可例2.53:串存储 movax,0可将CLD改为STD吗串读取LODS(loadstring)把指定主存单元的数据传送给AL或AXLODSB

;字节串读取:AL←DS:[SI] ;SI←SI±1LODSW

;字串读取:AX←DS:[SI] ;SI←SI±2演示串读取LODS(loadstring)把指定主存单元的数据例2.54:串读取-1

movsi,offsetblock movdi,offsetdplus movbx,offsetdminus

movax,ds moves,ax;数据都在一个段中,所以设置es=ds movcx,count ;cx←字节数 cld例2.54:串读取-1 movsi,offsetbloc例2.54:串读取-2go_on: lodsb

;从block取出一个数据 testal,80h ;检测符号位,判断是正是负 jnzminus ;符号位为1,是负数,转向minus

stosb ;符号位为0,是正数,存入dplus jmpagain ;程序转移到again处继续执行 jnzgo_on ;完成正负数据分离例2.54:串读取-2go_on: lodsb ;从blo例2.54:串读取-3minus: xchgbx,di

stosb

;把负数存入dminus xchgbx,diagain: deccx ;字节数减1 jnzgo_on ;完成正负数据分离例2.54:串读取-3minus: xchgbx,di串比较CMPS(comparestring)将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系CMPSB

;字节串比较:DS:[SI]-ES:[DI] ;SI←SI±1,DI←DI±1CMPSW

;字串比较:DS:[SI]-ES:[DI] ;SI←SI±2,DI←DI±2串比较CMPS(comparestring)将主存中的源操例2.55:比较字符串 movsi,offsetstring1 movdi,offsetstring2 movcx,count cldagain: cmpsb ;比较两个字符 jnzunmat ;有不同字符,转移 deccx jnzagain ;进行下一个字符比较 moval,0 ;字符串相等,设置00h jmpoutput ;转向outputunmat: moval,0ffh ;设置ffhoutput: movresult,al ;输出结果标记例2.55:比较字符串 movsi,offsetstri串扫描SCAS(scanstring)将AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系SCASB

;字节串扫描:AL-ES:[DI] ;DI←DI±1SCASW

;字串扫描:AX-ES:[DI] ;DI←DI±2串扫描SCAS(scanstring)将AL/AX减去至目例2.56:查找字符串

movdi,offsetstring moval,20h movcx,count cldagain: scasb

;搜索 jzfound ;为0(ZF=1),发现空格 deccx ;不是空格 jnzagain ;搜索下一个字符 ... ;不含空格,则继续执行found: ...例2.56:查找字符串 movdi,offsetstri重复前缀指令(repeat)串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在CX寄存器中重复前缀分2类,3条指令:配合不影响标志的MOVS、STOS(和LODS)指令的REP前缀配合影响标志的CMPS和SCAS指令的REPZ和REPNZ前缀重复前缀指令(repeat)串操作指令执行一次,仅对数据串中REP重复前缀指令REP前缀可以理解为:当数据串没有结束(CX≠0),则继续传送例2.52和例2.53中,程序段的最后3条指令,可以分别替换为: REPMOVSB和REPSTOSWREP ;每执行一次串指令,CX减1 ;直到CX=0,重复执行结束REP重复前缀指令REP前缀可以理解为:当数据串没有结束(C重复串传送(例2.52)

movsi,offsetsource movdi,offsetdestination movcx,100 ;cx←传送次数 cld repmovsbagain: movsb ;传送一个字节 deccx ;传送次数减1 jnzagain ;判断传送次数cx是否为0

;不为0(ZF=0),则转移again位置执行 ;否则,结束第2章演示重复串传送(例2.52) movsi,offsetsou重复串存储(例2.53)movax,0movdi,0movcx,8000hcldrepstoswagain: stosw ;传送一个字 deccx ;传送次数减1 jnzagain ;判断传送次数cx是否为0第2章演示重复串存储(例2.53)movax,0again: stoREPZ重复前缀指令REPZ/REPE前缀可以理解为:当数据串没有结束(CX≠0),并且串相等(ZF=1),则继续比较REPZ ;每执行一次串指令,CX减1 ;并判断ZF是否为0, ;只要CX=0或ZF=0,重复执行结束REPZ重复前缀指令REPZ/REPE前缀可以理解为:当数据REPNZ重复前缀指令REPNZ/REPNE前缀可以理解为:当数据串没有结束(CX≠0),并且串不相等(ZF=0),则继续比较REPZ ;每执行一次串指令,CX减1 ;并判断ZF是否为1, ;只要CX=0或ZF=1,重复执行结束REPNZ重复前缀指令REPNZ/REPNE前缀可以理解为:例2.57:比较字符串 movsi,offsetstring1 movdi,offsetstring2 movcx,count cld

repzcmpsb ;重复比较两个字符 jnzunmat ;字符串不等,转移 moval,0 ;字符串相等,设置00h jmpoutput ;转向outputunmat: moval,0ffh ;设置ffhoutput: movresult,al ;输出结果标记解释例2.57:比较字符串 movsi,offsetstri重复比较的解释指令repzcmpsb结束重复执行的情况①ZF=0,即出现不相等的字符②CX=0,即比较完所有字符:这种情况下,如果ZF=0,说明最后一个字符不等;而ZF=1表示所有字符比较后都相等,也就是两个字符串相同所以,重复比较结束后,jnzunmat指令的条件成立ZF=0,字符串不相等重复比较的解释指令repzcmpsb结束重复执行的情况例2.58:查找字符串

movdi,offsetstring moval,20h movcx,count cld

repnzscasb

;搜索 jzfound ;为0(ZF=1),发现空格 ... ;不含空格,则继续执行found: ...例2.58:查找字符串 movdi,offsetstri2.6处理机控制类指令对CPU状态进行控制的指令NOPCS:SS:DS:ES:LOCKHLTESCWAIT2.6处理机控制类指令对CPU状态进行控制的指令空操作指令NOP不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期NOP常用于程序调试在需要预留指令空间时用NOP填充代码空间多余时也可以用NOP填充还可以用NOP实现软件延时事实上,NOP和XCHGAX,AX的指令代码一样,都是90HNOP空操作指令NOPNOP段超越前缀指令在允许段超越的存储器操作数之前,使用段超越前缀指令,将采用指定的段寄存器寻址操作数CS:

;使用代码段的数据SS:

;使用堆栈段的数据DS:

;使用数据段的数据ES:

;使用附加段的数据段超越前缀指令在允许段超越的存储器操作数之前,使用段超越前缀封锁前缀指令 LOCK

;封锁总线这是一个指令前缀,可放在任何指令前这个前缀使得在这个指令执行时间内,8086处理器的封锁输出引脚有效,即把总线封锁,使别的控制器不能控制总线;直到该指令执行完后,总线封锁解除封锁前缀指令 LOCK ;封锁总线暂停指令

HLT

;进入暂停状态暂停指令使CPU进入暂停状态,这时CPU不进行任何操作。当CPU发生复位或来自外部的中断时,CPU脱离暂停状态HLT指令可用于程序中等待中断。当程序中必须等待中断时,可用HLT,而不必用软件死循环。然后,中断使CPU脱离暂停状态,返回执行HLT的下一条指令暂停指令 HLT ;进入暂停状态交权指令

ESC

6位立即数,reg/mem;把浮点指令交给浮点处理器执行浮点协处理器8087指令是与8086的整数指令组合在一起的,当8086发现是一条浮点指令时,就利用ESC指令将浮点指令交给8087执行实际编写程序时,一般采用易于理解的浮点指令助记符格式ESC6,[SI] ;实数除法指令:FDIVdwordptr[SI]ESC20H,AL ;整数加法指令:FADDST(0),ST第2章交权指令 ESC6位立即数,reg/mem第2章等待指令 WAIT

;进入等待状态8086利用WAIT指令和测试引脚实现与8087同步运行浮点指令经由8086处理发往8087,并与8086本身的整数指令在同一个指令序列;而8087执行浮点指令较慢,所以8086必须与8087保持同步等待指令 WAIT ;进入等待状态第2章总结本章详细而完整地介绍了8086的16位指令系统的每条指令希望大家进行一下整理(总结):寻址方式指令支持的操作数形式指令对标志的影响常见编程问题通过复习整理,形成指令系统的整体概念,进而掌握常用指令第2章总结本章详细而完整地介绍了8086的16位指令系统第2章教学要求(4)熟悉串操作寻址特点掌握基本指令:MOVS/LODS/STOS、REP熟悉特色指令:CMPS/SCAS、NOP了解不常使用的指令:REPZ/REPNZ、LOCK/HLT/ESC/WAIT习题4(p70)2.152.162.26⑶⑹⑺第2章教学要求(4)熟悉串操作寻址特点串传送MOVSB(正向DF=0)串传送MOVSB(正向DF=0)串传送MOVSW(反向DF=1)串传送MOVSW(反向DF=1)LODS

(正向DF=0)LODS(正向DF=0)STOS(正向DF=0)STOS(正向DF=0)REPSTOSB(正向DF=0)REPSTOSB(正向DF=0)REPMOVSB(正向DF=0)REPMOVSB(正向DF=0)课间休息课间休息2.5串操作类指令串操作指令是8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,在操作主存连续区域的数据时,特别好用、因而常用重点掌握: MOVSSTOSLODS CMPSSCASREP一般了解: REPZ/REPEREPNZ/REPNE2.5串操作类指令串操作指令是8086指令系统中比较独特串数据类型串操作指令的操作数是主存中连续存放的数据串(String)——即在连续的主存区域中,字节或字的序列串操作指令的操作对象是以字(W)为单位的字串,或是以字节(B)为单位的字节串串数据类型串操作指令的操作数是主存中连续存放的数据串(Str串寻址方式源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:DS:[SI]目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:[DI]每执行一次串操作指令,SI和DI将自动修改:±1(对于字节串)或±2(对于字串)执行指令CLD指令后,DF=0,地址指针增1或2执行指令STD指令后,DF=1,地址指针减1或2串寻址方式源操作数用寄存器SI寻址,默认在数据段DS中,但允串传送MOVS(movestring)把字节或字操作数从主存的源地址传送至目的地址MOVSB

;字节串传送:ES:[DI]←DS:[SI] ;SI←SI±1,DI←DI±1演示MOVSW

;字串传送:ES:[DI]←DS:[SI] ;SI←SI±2,DI←DI±2演示串传送MOVS(movestring)把字节或字操作数从主例2.52:字节串传送

movsi,offsetsource movdi,offsetdestination movcx,100 ;cx←传送次数

cld ;置DF=0,地址增加again: movsb ;传送一个字节

deccx ;传送次数减1 jnzagain

;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束offset是汇编操作符,求出变量的偏移地址例2.52:字节串传送 movsi,offsetsour例2.52:字串传送

movsi,offsetsource movdi,offsetdestination movcx,50 ;cx←传送次数

cld ;置DF=0,地址增加again: movsb ;传送一个字

deccx ;传送次数减1 jnzagain

;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束例2.52:字串传送 movsi,offsetsourc串存储STOS(storestring)把AL或AX数据传送至目的地址STOSB

;字节串存储:ES:[DI]←AL ;DI←DI±1STOSW

;字串存储:ES:[DI]←AX ;DI←DI±2演示串存储STOS(storestring)把AL或AX数据传例2.53:串存储

movax,0 movdi,0 movcx,8000h

;cx←传送次数(32×1024) cld ;DF=0,地址增加again: stosw ;传送一个字 deccx ;传送次数减1 jnzagain ;传送次数cx是否为0可将CLD改为STD吗?如何改用STOSB?可不用给DI赋值吗?DI为偶数即可例2.53:串存储 movax,0可将CLD改为STD吗串读取LODS(loadstring)把指定主存单元的数据传送给AL或AXLODSB

;字节串读取:AL←DS:[SI] ;SI←SI±1LODSW

;字串读取:AX←DS:[SI] ;SI←SI±2演示串读取LODS(loadstring)把指定主存单元的数据例2.54:串读取-1

movsi,offsetblock movdi,offsetdplus movbx,offsetdminus

movax,ds moves,ax;数据都在一个段中,所以设置es=ds movcx,count ;cx←字节数 cld例2.54:串读取-1 movsi,offsetbloc例2.54:串读取-2go_on: lodsb

;从block取出一个数据 testal,80h ;检测符号位,判断是正是负 jnzminus ;符号位为1,是负数,转向minus

stosb ;符号位为0,是正数,存入dplus jmpagain ;程序转移到again处继续执行 jnzgo_on ;完成正负数据分离例2.54:串读取-2go_on: lodsb ;从blo例2.54:串读取-3minus: xchgbx,di

stosb

;把负数存入dminus xchgbx,diagain: deccx ;字节数减1 jnzgo_on ;完成正负数据分离例2.54:串读取-3minus: xchgbx,di串比较CMPS(comparestring)将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系CMPSB

;字节串比较:DS:[SI]-ES:[DI] ;SI←SI±1,DI←DI±1CMPSW

;字串比较:DS:[SI]-ES:[DI] ;SI←SI±2,DI←DI±2串比较CMPS(comparestring)将主存中的源操例2.55:比较字符串 movsi,offsetstring1 movdi,offsetstring2 movcx,count cldagain: cmpsb ;比较两个字符 jnzunmat ;有不同字符,转移 deccx jnzagain ;进行下一个字符比较 moval,0 ;字符串相等,设置00h jmpoutput ;转向outputunmat: moval,0ffh ;设置ffhoutput: movresult,al ;输出结果标记例2.55:比较字符串 movsi,offsetstri串扫描SCAS(scanstring)将AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系SCASB

;字节串扫描:AL-ES:[DI] ;DI←DI±1SCASW

;字串扫描:AX-ES:[DI] ;DI←DI±2串扫描SCAS(scanstring)将AL/AX减去至目例2.56:查找字符串

movdi,offsetstring moval,20h movcx,count cldagain: scasb

;搜索 jzfound ;为0(ZF=1),发现空格 deccx ;不是空格 jnzagain ;搜索下一个字符 ... ;不含空格,则继续执行found: ...例2.56:查找字符串 movdi,offsetstri重复前缀指令(repeat)串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在CX寄存器中重复前缀分2类,3条指令:配合不影响标志的MOVS、STOS(和LODS)指令的REP前缀配合影响标志的CMPS和SCAS指令的REPZ和REPNZ前缀重复前缀指令(repeat)串操作指令执行一次,仅对数据串中REP重复前缀指令REP前缀可以理解为:当数据串没有结束(CX≠0),则继续传送例2.52和例2.53中,程序段的最后3条指令,可以分别替换为: REPMOVSB和REPSTOSWREP ;每执行一次串指令,CX减1 ;直到CX=0,重复执行结束REP重复前缀指令REP前缀可以理解为:当数据串没有结束(C重复串传送(例2.52)

movsi,offsetsource movdi,offsetdestination movcx,100 ;cx←传送次数 cld repmovsbagain: movsb ;传送一个字节 deccx ;传送次数减1 jnzagain ;判断传送次数cx是否为0

;不为0(ZF=0),则转移again位置执行 ;否则,结束第2章演示重复串传送(例2.52) movsi,offsetsou重复串存储(例2.53)movax,0movdi,0movcx,8000hcldrepstoswagain: stosw ;传送一个字 deccx ;传送次数减1 jnzagain ;判断传送次数cx是否为0第2章演示重复串存储(例2.53)movax,0again: stoREPZ重复前缀指令REPZ/REPE前缀可以理解为:当数据串没有结束(CX≠0),并且串相等(ZF=1),则继续比较REPZ ;每执行一次串指令,CX减1 ;并判断ZF是否为0, ;只要CX=0或ZF=0,重复执行结束REPZ重复前缀指令REPZ/REPE前缀可以理解为:当数据REPNZ重复前缀指令REPNZ/REPNE前缀可以理解为:当数据串没有结束(CX≠0),并且串不相等(ZF=0),则继续比较REPZ ;每执行一次串指令,CX减1 ;并判断ZF是否为1, ;只要CX=0或ZF=1,重复执行结束REPNZ重复前缀指令REPNZ/REPNE前缀可以理解为:例2.57:比较字符串 movsi,offsetstring1 movdi,offsetstring2 movcx,count cld

repzcmpsb ;重复比较两个字符 jnzunmat ;字符串不等,转移 moval,0 ;字符串相等,设置00h jmpoutput ;转向outputunmat: moval,0ffh ;设置ffhoutput: movresult,al ;输出结果标记解释例2.57:比较字符串 movsi,offsetstri重复比较的解释指令repzcmpsb结束重复执行的情况①ZF=0,即出现不相等的字符②CX=0,即比较完所有字符:这种情况下,如果ZF=0,说明最后一个字符不等;而ZF=1表示所有字符比较后都相等,也就是两个字符串相同所以,重复比较结束后,jnzunmat指令的条件成立ZF=0,字符串不相等重复比较的解释指令repzcmpsb结束重复执行的情况例2.58:查找字符串

movdi,offsetstring moval,20h movcx,count cld

repnzscasb

;搜索 jzfound ;为0(ZF=1),发现空格 ... ;不含空格,则继续执行found: ...例2.58:查找字符串 movdi,offsetstri2.6处理机控制类指令对CPU状态进行控制的指令NOPCS:SS:DS:ES:LOCKHLTESCWAIT2.6处理机控制类指令对CPU状态进行控制的指令空操作指令NOP不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期NOP常用于程序调试在需要预留指令空间时用NOP填充代码空间多余时也可以用NOP填充还可以用NOP实现软件延时事实上,NOP和XCHGAX,AX的指令代码一样,都是90HNOP空操作指令NOPNOP段超越前缀指令在允许段超越的存储器操作数之前,使用段超越前缀指令,将采用指定的段寄存器寻址操作数CS:

;使用代码段的数据SS:

;使用堆栈段的数据DS:

;使用数据段的数据ES:

;使用附加段的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论