第7章-编程中的高级处理技术-汇编语言程序设计-教学课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第7章-编程中的高级处理技术-汇编语言程序设计-教学课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 中的 高级 处理 技术 汇编语言 程序设计 教学 课件
- 资源描述:
-
1、第第7章章 编程中的高级处理技术编程中的高级处理技术 7.1 移位指令与应用移位指令与应用 7.2 串操作串操作 7.3 宏宏*7.4 重复汇编重复汇编 本章要点本章要点 习题七习题七 返回章目录7.1 移位指令与应用移位指令与应用 7.1.1 逻辑左移逻辑左移 【指令格式】SHL d1,d2 【功能】把操作数d1的各个二进制位依次向左移动d2位,移动造成右边的空位填0,结果放回操作d1中。【说明】(1)操作数d1必须是通用寄存器或内存型寻址方式,必须有确定的类型,可以是字节型,也可以是字型,并且对内存型寻址方式可以使用段跨越。(2)操作数d2表示移动的位数,只能是立即数1或者寄存器CL,当移
2、动位数超过1位时,必须把移动位数放在CL中,以CL作为d2操作数。(3)操作数d1各位移动的情况如图7.1所示,从最高位起,将有d2位移到操作数d1之外,除了最后移出的一位放到标志位CF中之外,其余各位均被丢弃,移动造成右边的空位用0填充。位号:15/7 14/6 1 00 CF操作数d1 (4)移动后d1中的数据是在其原值的后面加了d2个0,即把原数值扩大了倍,当扩大后的值超过表示范围时,超过d1类型(字节或字)规定位数的高位部分会自动丢失。(5)该指令对其余标志位的影响情况是:移动后的结果为0则ZF置1,否则ZF清0;移动后d1最高位的值会复制到SF上;如果移动前后d1的最高位不同则OF置
3、1,否则OF清0。移位指令涉及数值计算问题,但并不复杂。比如AX的值是8D56H,CL的值是3,则下面几条指令是SHL指令的正确用法,后面也给出了移位后的结果:SHLAL,1 移位后,AL=0ACH,CF=0,AH不变SHLAX,1 移位后,AX=1AACH,CF=1SHLAH,CL 移位后,AH=68H,CF=0,AL不变SHLAX,CL 移位后,AX=6AD0H,CF=0 7.1.2 算术左移算术左移 【指令格式】SAL d1,d2 【说明】这是一条与SHL完全相同的指令,该指令与SHL指令是同一条机器指令的两种不同写法。7.1.3 逻辑右移逻辑右移 【指令格式】SHR d1,d2 【功能
4、】把操作数d1的各个二进制位依次向右移动d2位,移动造成左边的空位填0,结果放回操作数d1中。【说明】(1)对两个操作数的语法限制以及对标志位的设置情况都与SHL指令相同,见SHL指令说明的(1)、(2)和(5)。(2)SHR指令在位的移动方向上与SHL指令刚好相反,其它方面则很类似,向右移出的最后一位放到CF中,右移造成左边的空位以0填充,如图7.2所示。(3)移动后的值是把d1中的原值作为无符号数,除以的商。位号:15/7 14/6 1 0操作数d1 CF图7.2 逻辑右移指令SHR的功能 7.1.4 算术右移算术右移 【指令格式】SAR d1,d2 【功能】把操作数d1的各个二进制位依次
5、向右移动d2位,移动造成左边的空位填d1原值的最高位,结果放回操作d1中。【说明】SAR指令的功能基本上与SHR的一样,仅仅是移动造成的空位填充方式不同,如果操作数d1移动前最高位是1,则移动造成的空位以1填充,否则以0填充,如图7.3所示。SAR指令执行的结果是把d1中的原值作为带符号数,除以并把除法的商放回d1中。位号:15/7 14/6 1 0 操作数d1 CF 图7.3 算术右移指令SAR的功能 7.1.5 循环左移循环左移 【指令格式】ROL d1,d2 【功能】把操作数d1的各个二进制位向左移动d2位,从d1左端移出的每一位再依次移到右端空出的位上,最后移出的一位还要送到CF中。可
6、以把d1的各位看作是首尾相接的一个环状,如图7.4所示,把各位的值按逆时针方向旋转d2格,再从环原先的连接部断开,可以得到ROL指令执行后的结果。14/615/7CF01图7.4 循环左移指令ROL的功能 7.1.6 循环右移循环右移 【指令格式】ROR d1,d2 【功能】把操作数d1的各个二进制位向右移动d2位,从右端移出的各位再依次移到d1右端空出的位上,最后移出的一位还要送到CF中。ROR是循环右移指令,与ROL指令相比,只是移位的方向不同,把图7.4中的移动方向改为顺时针方向,从第0位上最后一次移出的位送到CF中,就是ROR指令的功能。7.1.7 带进位的循环左移带进位的循环左移 【
7、指令格式】RCL d1,d2 【功能】把操作数d1的各位与CF联合在一起,构成9个或者17个二进制位,向左移动d2位,从左端移出的各位再依次移到右端空出的位上。从功能上说,可以把d1的各位与CF一起,看作首尾相接的一个环状,如图7.5所示,把各位按逆时针方向旋转d2格,再从环原先的连接部断开,可以得到ROL指令执行后的结果,包括CF的设置情况。14/615/7CF01 图7.5 带有CF的循环左移指令RCL的功能 7.1.8 带进位的循环右移带进位的循环右移 【指令格式】RCR d1,d2 【功能】把操作数d1的各位与CF联合在一起,构成9个或者17个二进制位,向右移动d2位,从右端移出的各位
8、再依次移到左端空出的位上。带进位CF的循环右移指令的功能可以参照图7.5,把移动方向改为顺时针即可。逻辑移位与算术移位指令除了功能本身描述的二进制位的移动之外,还用于把一个字节型或字型数据乘以/除以2n。乘除法指令是所有8088指令中最耗时的,所花费的时间是加减法的2030倍,是移位指令的3550倍,因此如果能用移位指令和加减法指令代替乘除法指令,将大大提高程序的执行速度。【例7.1】编写程序段,把AX中的无符号数乘以8,如果有溢出,忽略超过16位的部分。【解】乘以8的操作可以通过在二进制数的后面加3个0完成,即左移3位,移出部分自动丢失。只需要在CL中放移动位数(3位),再用SHL指令移位即
9、可:MOV CL,3 SHL AX,CL 对于双字型数据,或者位数更多的复杂数据,也可以用移位指令与逻辑运算指令配合,简化乘除法的运算。【例7.2】编写程序段分别完成下列计算。(1)把(DX,AX)构成的无符号双字除以4,商放在(DX,AX)中,余数放BX中。(2)把(DX,BX)构成的无符号数乘以17,结果仍放在(DX,BX)中,忽略溢出。【解】(1)二进制无符号数除以4,就是把它向右移动两位,高位补0,原二进制数的最低两位就是余数。MOV BX,AX AND BX,3;取被除数的最低两位,作为余数 SHR DX,1;右移一位,移出位放到CF中 RCR AX,1;右移一位,最高位以CF的值,
10、即DX 的移出位填充 SHR DX,1 RCR AX,1 (2)17可以看作(16+1),因此可以把BX先左移4位,结果记在(DX,BX)中,再与原数据相加。MOV SI,BX;保存BX的原值MOV AX,BX;保存BX的原值MOV DI,DX;保存DX的原值MOV CL,4SHL BX,CL;低字BX左移4位SHL DX,CL;高字DX左移4位MOV CL,12SHR AX,CL;取原数据的低字的左4位,放在AX的 右4位上OR DX,AX;把AX中存放的数据加到DX中ADD BX,SIADC DX,DI 在例7.2的第(1)小题中,由于没有直接的指令把双字型数据移位,所以通过CF作为过渡,
11、连续做两次字型数据的移位,先把高字DX右移1位,移出位暂时放在CF中,再用带进位CF的循环右移指令,在把低字移位的同时,把暂存在CF中的那1位移到低字的最高位上。第(2)小题中移动的位数较多,如果用循环的方式实现就违背了提高处理速度的本意。程序段中用AX取出低字部分的值,右移12位,把应该从低字移到高字的4位放在了AX的最低4位上。再把高字DX用SHL指令左移4位,移出部分自动丢失,右4位补0,最后把AX中存放的4位数据用OR指令(也可以用ADD指令)放到DX的低4位上,从而实现双字(DX,BX)乘以16的操作。7.2 串操作串操作 汇编语言中的“串”是指内存中连续存放的若干个字节型或字型数据
12、构成的一个整体,相当于一个数组。8088为这种“数组”的操作提供了专门的串操作指令,这些指令与循环或附加在串指令上的前缀配合,可以依次对串中的数据进行处理。串操作指令都要求先把数组首元素(或者最后一个元素)的地址放在指定的变址寄存器中,每处理一个数组元素,串指令本身自动把变址寄存器的内容做相应的变化,使其指向下一个待处理的元素。根据实际需要,串操作指令可以按数组存放的内存地址从小到大进行处理,也可以从大到小处理,CPU在完成串指令时,会根据标志寄存器中的DF标志位选择处理的方向。7.2.1 DF标志位标志位 DF是8088中的一个重要的控制标志位,它决定了串指令的处理方向。当CPU执行到一条串
13、操作指令时,如果DF的值是0,CPU会把指令相应的变址寄存器的值增加,按地址由小到大的方向处理;反之如果DF的值是1,CPU会把变址寄存器的值减小,按地址由大到小的方向处理。8088提供有两条专用指令设置DF,分别是CLD和STD指令。【指令格式】CLD 【功能】把标志位DF清0。【指令格式】STD 【功能】把标志位DF置1。7.2.2 串操作指令串操作指令 8088指令系统中共设计有5条串操作指令,分别用于完成从串中取出数据、往串中存入数据、串复制、串比较等操作。7.2.2.1 LODS指令指令从串中取出数据从串中取出数据 按照串中存放的是字节型数据还是字型数据,有两条指令分别用于从串中取出
14、一个元素。【指令格式】LODSB 或 LODSW 【功能】(1)LODSB进行字节型串操作,从内存中DS:SI所确定的逻辑地址处取出一个字节的数据,送到AL中。当DF0时,令SISI1,当DF1时,令SISI1。(2)LODSW进行字型串操作,从内存中DS:SI所确定的逻辑地址处取出一个字型数据,送到AX中。当DF0时,令SISI2,当DF1时,令SISI2。本书中把LODSB指令和LODSW指令统称作LODS指令,以下各串操作指令也做类似处理。LODS指令要求把串放在DS所指向的段中,SI则存放将要处理的元素的偏移地址。对字节型的串,每个元素占1字节,所以执行一次LODSB指令,SI中的值会
15、根据DF的情况自动加1或减1;而字型的串中每个元素占2字节,SI需要加2或减2后才能指向下一个元素。串指令LODS实际上是把一条MOV指令和一条ADD(或SUB、INC、DEC等)指令综合在一起,可以说,没有串指令同样可以编写数组操作的程序,但串指令会使这种操作简化。【例7.3】设DS段中的变量arr中存放了一个带符号的字型数组,元素个数已放在字型变量arrlen中(0)。编写程序段,利用串操作指令,统计出该数组中正数、0和负数各多少个,结果分别放在DS段中的字型变量countp、count0和countn中。【解】MOV CX,arrlenMOV countp,0MOV count0,0MO
16、V countn,0LEA SI,arr ;DS已有正确值,只要把SI 指向串首地址 CLD ;清方向标志lab1:LODSWCMP AX,0JG lab2;大于0转JL lab3;小于0转INC count0JMP lab4lab2:INC countpJMP lab4lab3:INC countnlab4:LOOP lab1 7.2.2.2 STOS指令指令往串中存入数据往串中存入数据 【指令格式】STOSB 或 STOSW 【功能】(1)STOSB进行字节型串操作,把AL的值送往内存中由ES:DI所确定的内存中。当DF0时,令DIDI1,当DF1时,令DIDI1。(2)STOSW进行字型
17、串操作,把AX的值送往内存中由ES:DI所确定的内存中。当DF0时,令DIDI2,当DF1时,令DIDI2。STOS指令主要用于把一段连续的存储区域以AL或AX中的值填充,特别的是,存储区的段地址必须放在附加段寄存器ES中。STOS与LODS指令配合,还可以从一个串中取出数据,有选择地存到另一个串中。【例7.4】设DS段中的变量arr1中存放了一个带符号的字型数组,元素个数已放在字型变量arr1len中(0)。编写程序段,试利用串操作指令,把该数组中非0元素复制到DS段中的另一个字型变量arr2中,要求在arr2中连续存放,并统计出非0元素的个数填在变量arr2len中。【分析】首先把DS、S
18、I、ES和DI指向正确的位置,然后利用循环指令,每次从arr1中取出一个数,若不是0,则存往arr2。由于是字型数据,循环结束后DI的值减去arr2的偏移地址可得到保存下来的数据占据了多少字节,除以2后即得元素个数。【解】【解】PUSH DSPOP ES;令ESDSLEA SI,arr1LEA DI,arr2MOV CX,arr1lenCLD;准备好取出数据的串和存入数据的串的首地址lab1:LODSWTEST AX,AXJZ lab2;AX为0转STOSWlab2:LOOP lab1SUB DI,OFFSET arr2SHR DI,1;除以2MOV arr2len,DI 7.2.2.3 MO
19、VS指令指令串复制串复制 【指令格式】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。MOVS指令可以实现把内存中的一个数据,不经过寄存器的过渡由一处复制到另一处。这一点是MOV指令做不到的。MOVS指令与循环控制指令配合,可以完成数据块的复制。被复制的数据串称为源串
20、,复制到的目的地称为目标串。如果源串与目标串所占据的内存是完全分离的,数据传递可以按由串首至串尾的次序进行,也可以按相反的方向进行。但是,当两者占据的内存区域有部分重叠时,需要注意用DF控制方向,当源串首地址小于目标串首地址时,应由尾至首进行传送,源串首址大于目标串首址时,则由首至尾传送。【例7.5】设字节型变量str中存放了100个字符,编写程序段完成下列操作:(1)删除串中前5个字符,并把后续字符前移。(2)把串中各字符向后移一个字节,在串首插入一个空格符。【分析】第(1)题要把串的后95个字节向前移动,是源串首址大于目标串首址的情况,需要自首至尾进行移动;第(2)题正相反,源串首址小于目
21、标串首址,只能按由尾至首的方向移动。【解】(1)MOV AX,SEG str;取变量str所在的段地址MOV DS,AXMOV ES,AXLEA SI,str+5;取源串首偏移地址LEA DI,str;取目标串首偏移地址MOV CX,95;置复制字节数CLDlab:MOVSB;字节型复制LOOP lab(2)MOV AX,SEG strMOV DS,AXMOV ES,AXLEA SI,str+99;取源串尾的偏移地址LEA DI,str+100;取目标串尾的偏移地址MOV CX,100;复制100个字节STDlab:MOVSBLOOP labMOV str,7.2.2.4 CMPS指令指令串比
22、较串比较 【指令格式】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指令发挥作用的地方。【例
23、7.6】编写子程序,按字典排序法,比较两个已知长度的字符串的大小。【解】;入口参数:DS:SI和ES:DI分别存放第1个串和第2个串的起始逻辑地址 ;CX和DX分别放两个串的串长 ;出口参数:AL为1表示第1个串大,AL为-1表示第2个串大,AL为0表示两者相等 ;破坏寄存器:AH,CX,SI,DIstrcmp 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
24、lab3 ;串1串2转 JB lab4 ;串1串2转 LOOP lab1 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 7.2.2.5 SCAS指令指令串扫描串扫描 【指令格式】SCASB 或 SCASW 【功能】(1)SCASB把AL与字节型串中数据比较,用AL减去ES:DI所指向的一个字节型数据,相减结果反映到条件标志位上。当DF0时,令DIDI1;当DF1时,令DIDI1。(2)SCASW把AX与字
25、型串中数据比较,用AX减去ES:DI所指向的一个字,结果反映到条件标志位上。当DF0时,令DIDI2;当DF1时,令DIDI2。SCAS指令通常用于查找一个数组中是否存在某个指定的值。该指令不改变数组中的任何数据,也不改变AX或AL的值,可以用循环控制的方法连续查找。【例7.7】编写子程序,查找一个字型数组中是否存在一个给定的值。【解】;入口参数:ES:DI存放字型数组的首地址,CX中放串中元素个数 ;AX放指定查找的值 ;出口参数:CF为1表示找到,CF为0表示没找到 ;破坏寄存器:CX,DIsearch PROC NEAR JCXZ lab0 CLD lab1:SCASW JE lab2
展开阅读全文