欢迎来到天天文库
浏览记录
ID:33510729
大小:307.00 KB
页数:38页
时间:2019-02-26
《《汇编语言编程》ppt电子课件教案05其他指令》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、汇编语言课件05其他指令串操作指令串操作:对内存中一个连续区域的数据(如数组、字符串等)进行传送、比较等操作。为了更好地支持这种数据串类型的操作,8086设计了串操作指令,同时还有重复前缀可以实现循环。串操作指令采用了特殊的寻址方式源操作数用寄存器SI间接寻址,段址在数据段DS中,目的操作数用寄存器DI间接寻址,段址在附加段ES中每执行一次串操作,源地址指针SI和目的地址指针DI将自动修改:±1或±2对于以字节为单位的数据串(指令助记符用B结尾)操作,地址指针应该±1对于以字为单位的数据串(指令助记符用W结尾)操作,地址指针应该±2当DF=0,指针自动加(可
2、用CLD指令清标志),当DF=1,指针自动减(可用STD指令置标志)数据串传送指令这组串操作指令实现对数据串的传送MOVS、存储STOS和读取LODS,可以配合REP重复前缀,它们不影响标志。串传送指令MOVS将数据段中的一个字节或字数据,传送至附加段的主存单元。MOVSB;字节串传送:ES:[DI]←DS:[SI];然后:SI←SI±1,DI←DI±1MOVSW;字串传送:ES:[DI]←DS:[SI];然后:SI←SI±2,DI←DI±2串存储指令STOS将AL或AX的内容存入附加段的主存单元:STOSB;字节串存储:ES:[DI]←AL;然后:DI←DI±
3、1STOSW;字串存储:ES:[DI]←AX;然后:DI←DI±2串读取指令LODS将数据段中的一个字节或字数据读到AL或AX寄存器:LODSB;字节串读取:AL←DS:[SI];然后:SI←SI±1LODSW;字串读取:AX←DS:[SI];然后:SI←SI±2复前缀指令REP用在MOVS,STOS,LODS指令前,利用计数器CX保存数据串长度,可以理解为“当数据串没有结束(CX≠0),则继续传送”:REP;每执行一次串指令,CX减1;直到CX=0,重复执行结束注意,串操作指令本身仅进行一个数据的操作,利用重复前缀才能实现连续操作,实际上与LODS联用不多。例
4、:将数据段的sbuf指示的1KB数据传送到附加段的dbuf缓冲区movcx,1024;;设置数据串长度(循环次数):movsi,offsetsbuf;SI指向数据段源缓冲区开始movdi,offsetdbuf;DI指向附加段目的缓冲区开始cld;规定DF=0,进行地址增量repmovsb;重复字节传送:ES:[DI]←DS:[SI];如果设置CX=512,则用REPMOVSW例:将附加段64KB主存区全部设置为0cldmovdi,0movax,0movcx,32*1024;CX←传送次数repstosw;重复字传送:ES:[DI]←0思考:如果不要cld行不行?
5、串比较和串搜索指令这组串操作指令实现对数据串的比较CMPS和扫描(查找)SCAS。由于串比较和扫描的实质是进行减法运算,所以它们像减法指令一样影响标志。这两个串操作指令可以配合重复前缀REPE/REPZ和REPNE/REPNZ,通过ZF标志说明两数是否相等。串比较指令CMPS用源数据串减去目的数据串,以比较两者间的关系:CMPSB;字节串比较:DS:[SI]-ES:[DI];然后:SI←SI±1,DI←DI±1CMPSW;字串比较:DS:[SI]-ES:[DI];然后:SI←SI±2,DI←DI±2串扫描指令SCAS用AL/AX内容减去目的数据串,以比较两者间的
6、关系:SCASB;字节串扫描:AL-ES:[DI];然后:DI←DI±1SCASW;字串扫描:AX-ES:[DI];然后:DI←DI±2时间:15+1//(rep)9+15/rep+1/rep重复前缀指令REPE(或REPZ)用在CMPS、SCAS指令前,利用计数器CX保存数据串长度,同时判断比较是否相等,可以理解为“当数据串没有结束(CX≠0),并且串相等(ZF=1),则继续比较”。REPE/REPZ;每执行一次串指令,CX减1;当CX=0或ZF=0,不再重复执行重复前缀指令REPNE(或REPNZ)用在CMPS、SCAS指令前,利用计数器CX保存数据串长度,
7、同时判断比较是否不相等,可以理解为“当数据串没有结束(CX≠0),并且串不相等(ZF=0),则继续比较”。REPNE/REPNZ;每执行一次串指令,CX减1;只要CX=0或ZF=1,不再重复执行例比较两个等长的字符串是否相同假设一个字符串string1在数据段,另一个字符串string2在附加段,都具有count字符个数。movsi,offsetstring1;leasi,string1movdi,offsetstring2;leasi,string2movcx,countcldrepzcmpsb;比较两个字符;最后判断ZF,若ZF=1,表示两个字符串相同;若Z
8、F=0,表示两个字符串不
此文档下载收益归作者所有