汇编语言串指令课件

上传人:txadgkn****dgknqu... 文档编号:241582809 上传时间:2024-07-06 格式:PPT 页数:37 大小:485.64KB
返回 下载 相关 举报
汇编语言串指令课件_第1页
第1页 / 共37页
汇编语言串指令课件_第2页
第2页 / 共37页
汇编语言串指令课件_第3页
第3页 / 共37页
点击查看更多>>
资源描述
7.2 串操作串操作 汇编语言中的“串”是指内存中连续存放的若干个字节型或字型数据构成的一个整体,相当于一个数组。8088为这种“数组”的操作提供了专门的串操作指令,这些指令与循环或附加在串指令上的前缀配合,可以依次对串中的数据进行处理。串操作指令都要求先把数组首元素(或者最后一个元素)的地址放在指定的变址寄存器中,每处理一个数组元素,串指令本身自动把变址寄存器的内容做相应的变化,使其指向下一个待处理的元素。根据实际需要,串操作指令可以按数组存放的内存地址从小到大进行处理,也可以从大到小处理,CPU在完成串指令时,会根据标志寄存器中的DF标志位选择处理的方向。.7.2 串操作.1 7.2.1 DF标志位标志位 DF是8088中的一个重要的控制标志位,它决定了串指令的处理方向。当CPU执行到一条串操作指令时,如果DF的值是0,CPU会把指令相应的变址寄存器的值增加,按地址由小到大的方向处理;反之如果DF的值是1,CPU会把变址寄存器的值减小,按地址由大到小的方向处理。8088提供有两条专用指令设置DF,分别是CLD和STD指令。【指令格式】CLD 【功能】把标志位DF清0。【指令格式】STD 【功能】把标志位DF置1。.7.2.1 DF标志位.2 7.2.2 串操作指令串操作指令 8088指令系统中共设计有5条串操作指令,分别用于完成从串中取出数据、往串中存入数据、串复制、串比较等操作。7.2.2.1 LODS指令指令从串中取出数据从串中取出数据 按照串中存放的是字节型数据还是字型数据,有两条指令分别用于从串中取出一个元素。【指令格式】LODSB 或 LODSW 【功能】(1)LODSB进行字节型串操作,从内存中DS:SI所确定的逻辑地址处取出一个字节的数据,送到AL中。当DF0时,令SISI1,当DF1时,令SISI1。.7.2.2 串操作指令.3 (2)LODSW进行字型串操作,从内存中DS:SI所确定的逻辑地址处取出一个字型数据,送到AX中。当DF0时,令SISI2,当DF1时,令SISI2。本书中把LODSB指令和LODSW指令统称作LODS指令,以下各串操作指令也做类似处理。LODS指令要求把串放在DS所指向的段中,SI则存放将要处理的元素的偏移地址。对字节型的串,每个元素占1字节,所以执行一次LODSB指令,SI中的值会根据DF的情况自动加1或减1;而字型的串中每个元素占2字节,SI需要加2或减2后才能指向下一个元素。串指令LODS实际上是把一条MOV指令和一条ADD(或SUB、INC、DEC等)指令综合在一起,可以说,没有串指令同样可以编写数组操作的程序,但串指令会使这种操作简化。.(2)LODSW进行字型串操作,从内存中DS:SI4 【例7.3】设DS段中的变量arr中存放了一个带符号的字型数组,元素个数已放在字型变量arrlen中(0)。编写程序段,利用串操作指令,统计出该数组中正数、0和负数各多少个,结果分别放在DS段中的字型变量countp、count0和countn中。【解】MOV CX,arrlenMOV countp,0MOV count0,0MOV countn,0LEA SI,arr ;DS已有正确值,只要把SI 指向串首地址 CLD ;清方向标志.【例7.3】设DS段中的变量arr中存放了一个带符号的字5lab1:LODSWCMP AX,0JG lab2;大于0转JL lab3;小于0转INC count0JMP lab4lab2:INC countpJMP lab4lab3:INC countnlab4:LOOP lab1.lab1:LODSW.6 7.2.2.2 STOS指令指令往串中存入数据往串中存入数据 【指令格式】STOSB 或 STOSW 【功能】(1)STOSB进行字节型串操作,把AL的值送往内存中由ES:DI所确定的内存中。当DF0时,令DIDI1,当DF1时,令DIDI1。(2)STOSW进行字型串操作,把AX的值送往内存中由ES:DI所确定的内存中。当DF0时,令DIDI2,当DF1时,令DIDI2。STOS指令主要用于把一段连续的存储区域以AL或AX中的值填充,特别的是,存储区的段地址必须放在附加段寄存器ES中。STOS与LODS指令配合,还可以从一个串中取出数据,有选择地存到另一个串中。.7.2.2.2 STOS指令往串中存入数据.7 【例7.4】设DS段中的变量arr1中存放了一个带符号的字型数组,元素个数已放在字型变量arr1len中(0)。编写程序段,试利用串操作指令,把该数组中非0元素复制到DS段中的另一个字型变量arr2中,要求在arr2中连续存放,并统计出非0元素的个数填在变量arr2len中。【分析】首先把DS、SI、ES和DI指向正确的位置,然后利用循环指令,每次从arr1中取出一个数,若不是0,则存往arr2。由于是字型数据,循环结束后DI的值减去arr2的偏移地址可得到保存下来的数据占据了多少字节,除以2后即得元素个数。.【例7.4】设DS段中的变量arr1中存放了一个带符号8【解】【解】PUSH DSPOP ES;令ESDSLEA SI,arr1LEA DI,arr2MOV CX,arr1lenCLD;准备好取出数据的串和存入数据的串的首地址.【解】.9lab1:LODSWTEST AX,AXJZ lab2;AX为0转STOSWlab2:LOOP lab1SUB DI,OFFSET arr2SHR DI,1;除以2MOV arr2len,DI.lab1:LODSW.10 7.2.2.3 MOVS指令指令串复制串复制 【指令格式】MOVSB 或 MOVSW 【功能】(1)MOVSB进行字节型串复制,把DS:SI所指向的一个字节型数据送往ES:DI所指向的内存中。当DF0时,令SISI1,DIDI1;当DF1时,令SISI1,DIDI1。(2)MOVSW进行字型串复制,把DS:SI所指向的一个字型数据送往ES:DI所指向的内存中。当DF0时,令SISI2,DIDI2;当DF1时,令SISI2,DIDI2。.7.2.2.3 MOVS指令串复制.11 MOVS指令可以实现把内存中的一个数据,不经过寄存器的过渡由一处复制到另一处。这一点是MOV指令做不到的。MOVS指令与循环控制指令配合,可以完成数据块的复制。被复制的数据串称为源串,复制到的目的地称为目标串。如果源串与目标串所占据的内存是完全分离的,数据传递可以按由串首至串尾的次序进行,也可以按相反的方向进行。但是,当两者占据的内存区域有部分重叠时,需要注意用DF控制方向,当源串首地址小于目标串首地址时,应由尾至首进行传送,源串首址大于目标串首址时,则由首至尾传送。.MOVS指令可以实现把内存中的一个数据,不经12 【例7.5】设字节型变量str中存放了100个字符,编写程序段完成下列操作:(1)删除串中前5个字符,并把后续字符前移。(2)把串中各字符向后移一个字节,在串首插入一个空格符。【分析】第(1)题要把串的后95个字节向前移动,是源串首址大于目标串首址的情况,需要自首至尾进行移动;第(2)题正相反,源串首址小于目标串首址,只能按由尾至首的方向移动。.【例7.5】设字节型变量str中存放了100个字符,13【解】(1)MOV AX,SEG str;取变量str所在的段地址MOV DS,AXMOV ES,AXLEA SI,str+5;取源串首偏移地址LEA DI,str;取目标串首偏移地址MOV CX,95;置复制字节数CLDlab:MOVSB;字节型复制LOOP lab.【解】.14(2)MOV AX,SEG strMOV DS,AXMOV ES,AXLEA SI,str+99;取源串尾的偏移地址LEA DI,str+100;取目标串尾的偏移地址MOV CX,100;复制100个字节STDlab:MOVSBLOOP labMOV str,.(2)MOV AX,SEG str.15 7.2.2.4 CMPS指令指令串比较串比较 【指令格式】CMPSB 或 CMPSW 【功能】(1)CMPSB进行字节型串比较,把DS:SI所指向的一个字节型数据与ES:DI所指向的一字节相减,把相减结果反映到条件标志位上。当DF0时,令SISI1,DIDI1;当DF1时,令SISI1,DIDI1。(2)CMPSW进行字型串比较,把DS:SI所指向的一个字型数据与ES:DI所指向的一个字相减,相减结果反映到条件标志位上。当DF0时,令SISI2,DIDI2;当DF1时,令SISI2,DIDI2。程序设计中经常会遇到比较问题,比较两个符号串是否完全相同,或者比较两个串按字典顺序的大小,这一类问题正是CMPS指令发挥作用的地方。.7.2.2.4 CMPS指令串比较.16 【例7.6】编写子程序,按字典排序法,比较两个已知长度的字符串的大小。【解】;入口参数:DS:SI和ES:DI分别存放第1个串和第2个串的起始逻辑地址 ;CX和DX分别放两个串的串长 ;出口参数:AL为1表示第1个串大,AL为-1表示第2个串大,AL为0表示两者相等 ;破坏寄存器:AH,CX,SI,DI.【例7.6】编写子程序,按字典排序法,比较两个已知长度17strcmp PROC NEAR CLD MOV AH,0 ;记载串长1串长2 CMP CX,DX JB lab1 MOV AH,1 ;记载串长相等 JE lab1 MOV CX,DX ;按第2个串的长度进行比较 MOV AH,2 ;记载串长1串长2 lab1:JCXZ lab2 CMPSB JA lab3 ;串1串2转 JB lab4 ;串1串2转 LOOP lab1.strcmp PROC NEAR.18 lab2:CMP AH,1 JB lab4;串1串2转 JA lab3;串1串2转 MOV AL,0 JMP lab5 lab3:MOV AL,1 JMP lab5 lab4:MOV AL,-1 lab5:RET strcmp ENDP.lab2:CMP AH,1.19 7.2.2.5 SCAS指令指令串扫描串扫描 【指令格式】SCASB 或 SCASW 【功能】(1)SCASB把AL与字节型串中数据比较,用AL减去ES:DI所指向的一个字节型数据,相减结果反映到条件标志位上。当DF0时,令DIDI1;当DF1时,令DIDI1。(2)SCASW把AX与字型串中数据比较,用AX减去ES:DI所指向的一个字,结果反映到条件标志位上。当DF0时,令DIDI2;当DF1时,令DIDI2。SCAS指令通常用于查找一个数组中是否存在某个指定的值。该指令不改变数组中的任何数据,也不改变AX或AL的值,可以用循环控制的方法连续查找。.7.2.2.5 SCAS指令串扫描.20 【例7.7】编写子程序,查找一个字型数组中是否存在一个给定的值。【解】;入口参数:ES:DI存放字型数组的首地址,CX中放串中元素个数 ;AX放指定查找的值 ;出口参数:CF为1表示找到,CF为0表示没找到 ;破坏寄存器:CX,DI.【例7.7】编写子程序,查找一个字型数组中是否存在一个21search PROC NEAR JCXZ lab0 CLD lab1:SCASW JE lab2 LOOP lab1 lab0:CLC JMP lab3 lab2:STC lab3:RET search ENDP.search PROC NEAR.22 7.2.3 串重复前缀串重复前缀 串操作指令是对内存中连续存放的一批数据进行处理的一种高效、快捷的方法,它往往需要循环控制指令的配合。对于那些单纯是数据块复制、查找、比较的操作,汇编语言中还设计有3个串操作重复前缀,以进一步提高编程和数据处理的效率。串操作前缀是附加在串操作前面的指令,它是一种以CX为计数器的重复操作指示器,用以简化循环操作控制。使用串操作前缀的一般格式是:串前缀 串操作指令.7.2.3 串重复前缀.23 7.2.3.1 REP前缀前缀 【功能】当CX的值不是0时,重复执行后面的串操作指令,每执行一次,把CX的值减1,直到CX0为止。图7.6描述了REP串前缀的功能。REP前缀将使它后面的串操作指令重复执行,每执行一次串指令就把CX的值减1,直到CX减到0为止。图7.6描述了带有REP前缀的串指令的执行方式。可以看到,这是一种先判断后重复的循环,如果CX的值是0,则串操作指令一次都不执行,这与LOOP指令控制的循环是不同的。.7.2.3.1 REP前缀.24CX=0?CX CX-1 执行一次后面的串指令 YN完成 图7.6 REP前缀的功能 REP前缀通常加在MOVS或STOS串指令的前面,可以用一条指令把一个串复制到内存的另一个地方,或者把一段内存区域用一个特定值填充。REP前缀一般不与另外3条串指令连用。.CX=0?CX CX-1 执行一次后面的串25 7.2.3.2 REPZ和和REPNZ前缀前缀 REPZ和REPNZ也是串指令前缀,与REP一样都是用于控制后面的串指令重复执行,但重复执行不仅依赖于CX的值,还依赖于标志寄存器中的ZF标志位。【功能】带有REPZ前缀的串指令按下列方式执行:(1)若CX0,则结束指令的执行,否则转(2)。(2)CX CX1。(3)执行一次串指令。(4)若ZF0,则结束指令的执行,否则转(1)。REPNZ的功能与REPZ仅在第(4)项不同,REPZ是在ZF1时控制串操作重复执行,而REPNZ则是在ZF0时控制串操作重复执行。REPZ和REPNZ的功能可以用图7.7描述。.7.2.3.2 REPZ和REPNZ前缀.26CX=0?CX CX-1 执行一次后面的串指令 ZF=1?YNNY完成(a)REPZ串前缀的功能.CX=0?CX CX-1 执行一次后面的串指令27CX=0?CX CX-1 执行一次后面的串指令 ZF=0?YNNY完成(b)REPNZ串前缀的功能 REPZ和REPNZ前缀通常加在CMPS或SCAS串指令的前面,完成连续比较操作。这两个前缀各自又有一种功能完全相同的变形,REPZ可以写作REPE,REPNZ可以写作REPNE。.CX=0?CX CX-1 执行一次后面的串指令28 7.2.3.3 串前缀的应用串前缀的应用 根据串前缀与串指令的功能,什么样的串指令前面配什么样的串前缀是有一定限制的。表7.1列出了串前缀与串指令之间的配合关系,其中的“”表示对应的串指令与串前缀可以配合使用,“”表示不能,“”表示相应的用法没有实用价值。.7.2.3.3 串前缀的应用.29 串前缀串指令REPREPZ(REPE)REPNZ(REPNE)LODSSTOSMOVSCMPSSCAS表7.1 串前缀与串指令之间的配合关系.串前缀REPREPZREPNZLODSS30 从表7.1中可以看到,LODS指令一般不与串前缀配合使用,因为LODS是从串中取出数据放到AL或AX中,每取一个数据就应该做适当的处理,然后再去取下一数据,否则后取出的数据将取代AL或AX中的原有数据,使得只有最后一次取出的数据被保留下来。画有“”的部分是指根本不存在这样配合的用法。实际上,8088的指令系统中只有两个机器码与串前缀对应,并且,对于MOVS、STOS和LODS,不论串指令的前面加的是什么前缀,都按REP进行处理,汇编程序在翻译时既不报错也不警告;对CMPS和SCAS指令,如果前面加上了前缀REP,汇编程序将按REPZ进行翻译。串前缀的用途在于代替控制串操作的循环结构,下面的例7.8和例7.9就是这种简化的典型用法。.从表7.1中可以看到,LODS指令一般不与串前31 【例7.8】把字型变量v1中存放的50个整数复制到变量v2中,先用LOOP指令编写程序段完成复制操作,再用带前缀的串指令简化。【解】用循环控制方法编写的程序段如下:MOV AX,SEG v1 MOV DS,AX ;准备源串的段地址 MOV SI,OFFSET v1 ;准备源串的起始偏移地址 MOV AX,SEG v2 MOV ES,AX ;准备目标串的段地址 LEA DI,v2 ;准备目标串的起始偏移地址 MOV CX,50.【例7.8】把字型变量v1中存放的50个整数复制到变量32lab:MOV AX,SI MOV ES:DI,AX LOOP lab该程序段的最后3行可以用一个带前缀的串指令简化,写作:REP MOVSW.lab:MOV AX,SI.33 【例7.9】编写一个子程序,判断一个数据串中是否存在一个给定的值。要求子程序对字节型和字型的串都能判断,以CF作为出口参数,如果在串中找到目标值,在CF位置1,否则令CF清0。【解】;入口参数:ES:DI数据串的首地址 ;AX查找目标值,字节型数据串则以AL存放目标值 ;CX串中元素个数 ;CF0表示串中元素是字型,1则表示串中元素是字节型.【例7.9】编写一个子程序,判断一个数据串中是否存在一34 ;出口参数:CF1表示在串中找到了给定值,0表示没找到 ;破坏寄存器:CX,DI search PROC NEAR JCXZ s2 ;串长为0,串中不存在给定数据,转 CLD ;清方向标志,准备按增量方向查找 JC s3 ;入口参数CF为1转字节型查找 REPNZ SCASW ;字型查找 JZ s1 ;找到转 JMP s2 ;未找到转.;出口参数:CF1表示在串中找到了给定值,0表示没找35 s3:REPNZ SCASB ;字节型查找 JZ s1 ;找到转 s2:CLC ;置未找到标记 JMP s4 s1:STC ;置找到标记 s4:RET search ENDP.s3:REPNZ SCASB 36 从图7.7的流程图可以看到,带有REPZ和REPNZ前缀的串指令可以在两种情况下结束串操作,一是已执行到CX为0时,二是当ZF不符合要求时。例7.9中,在带有REPNZ前缀的串扫描指令的后面用条件跳转指令进行判断,此时必须能够分辨出是哪一种情况导致串操作结束。可以想到的指令除了JZ、JNZ之外,还有JCXZ,究竟用哪一个为好呢?如果串指令执行完后CX的值不是0,可以肯定是由于ZF不满足重复条件而导致串操作提前结束的,对例7.9就可以知道找到了目标值。这种情况下JCXZ或JZ、JNZ指令都可使用;反之若CX的值是0,表示串操作已经处理到串的最后一个元素,并且最后一次处理的结果已设置在ZF上,但这时如果用JCXZ指令进行判断,就不能分辨最后一次串操作比较或查找的结果是相等还是不等。总之,在带有REPZ或REPNZ前缀的串指令的后面,必须用JZ、JNZ指令判断比较或查找的情况,而不能用JCXZ指令。.从图7.7的流程图可以看到,带有REPZ和R37
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


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

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


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