华科-汇编语言程序设计课件第5章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《华科-汇编语言程序设计课件第5章.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华科 汇编语言 程序设计 课件
- 资源描述:
-
1、第五章第五章 程序设计的其它方法与技术程序设计的其它方法与技术一、本章的学习内容一、本章的学习内容:本章学习汇编语言的高级程序设计技术:本章学习汇编语言的高级程序设计技术: (1 1)串操作指令串操作指令的使用格式及功能的使用格式及功能; (2 2)宏指令的定义宏指令的定义与与调用调用方式方式; (3 3)模块程序设计方法及连接技术。模块程序设计方法及连接技术。 通过本章的学习,能提高编程的效率和质量,通过本章的学习,能提高编程的效率和质量,简化程序设计的工作,这是汇编语言中最具特色简化程序设计的工作,这是汇编语言中最具特色的部分的部分。第五章第五章 程序设计的其它方法与技术程序设计的其它方法
2、与技术二、本章的学习重点二、本章的学习重点: (1 1)串操作指令)串操作指令MOVS、CMPS、SCAS的的 使用格式及功能使用格式及功能; (2 2)简单简单宏指令的定义宏指令的定义与与调用调用方式方式; (3 3)模块程序设计)模块程序设计的的方法。方法。第五章第五章 程序设计的其它方法与技术程序设计的其它方法与技术三、本章学习的难点三、本章学习的难点: (1 1)MOVS与与MOV、CMPS与与CMP功能上功能上 的差别及串操作指令的正确使用方法的差别及串操作指令的正确使用方法; (2 2)宏指令的定义)宏指令的定义与与调用调用方式方式; (3 3)模块)模块之间的组合、定位及通信方式
3、;之间的组合、定位及通信方式; (4 4)模块化程序设计技术。)模块化程序设计技术。第五章第五章 程序设计的其它方法与技术程序设计的其它方法与技术5.1 5.1 字符串操作指令字符串操作指令5.2 5.2 宏功能程序设计宏功能程序设计5. .1 字符串操作指令字符串操作指令(1) 1) 串传送指令串传送指令 MOVS(2 2)串比较指令串比较指令 CMPS(3 3)串搜索指令串搜索指令 SCAS(4 4)取字节取字节/ /字字/ /双字串指令双字串指令 LODS(5 5)存储字节存储字节/ /字字/ /双字双字串串指令指令 STOS ( 6 ) 总结总结(1) 1) 串传送指令串传送指令 MO
4、VS格式格式: :MOVS OPD,OPS 或或功能功能:(:(1) (1) (DS:SI/ESIDS:SI/ESI) ) ES:DI/EDIES:DI/EDI (2)(2) 修改串指针,使之指向下一元素。修改方式为:修改串指针,使之指向下一元素。修改方式为: .当当DFDF0 0时,时,(SI)/(ESI)(SI)/(ESI)增量增量1(1(字节操作字节操作) )或或2(2(字操作字操作) ) 或或4(4(双字操作双字操作) ) .当当DFDF1 1时,时,(SI)/(ESI)(SI)/(ESI)减量减量1(1(字节操作字节操作) )或或2(2(字操作字操作) ) 或或4(4(双字操作双字操
5、作) ) 说明说明:(1) :(1) 该指令可带的重复前缀为:该指令可带的重复前缀为:REP 即当即当(CX/ECX)(CX/ECX)0 0时连续传送,直至时连续传送,直至(CX/ECX)=0(CX/ECX)=0。 (2) (2) 源串应在当前数据段,指针为源串应在当前数据段,指针为SI/ESISI/ESI;目的串应在;目的串应在 当前附加数据段指针为当前附加数据段指针为DI/EDIDI/EDI。MOVSD 双字串传送双字串传送MOVSB 字节串传送字节串传送MOVSW 字串传送字串传送(1) 1) 串传送指令串传送指令 MOVS例例1 1:将以:将以STR1STR1为首址的字节存储区中存放的
6、字符串传送到以为首址的字节存储区中存放的字符串传送到以 STR2STR2为首址的字节存储区中。为首址的字节存储区中。 .386.386 DATA SEGMENT USE16 DATA SEGMENT USE16 STR1 DB ABCDEFGHIJKLM STR1 DB ABCDEFGHIJKLM ;输出缓冲区;输出缓冲区BUF1BUF1 COUNT EQU $-BUF1 COUNT EQU $-BUF1 ;BUF1BUF1中的字符个数中的字符个数 STR2 DB COUNT DUPSTR2 DB COUNT DUP(O O) ;输入缓冲区;输入缓冲区BUF2BUF2 DATA ENDS DA
7、TA ENDS STACK SEGMENT USE16 STACK STACK SEGMENT USE16 STACK DB 200 DUP(0) DB 200 DUP(0) STACK ENDS STACK ENDS CODE SEGMENT USE16 CODE SEGMENT USE16 ASSSUME DS:DATA,ES:DATA,CS:CODE,SS:SATCK ASSSUME DS:DATA,ES:DATA,CS:CODE,SS:SATCK START:MOV AXSTART:MOV AX,DATADATA MOV DS MOV DS,AX AX ;当前数据段和当前附加数据段重合
8、;当前数据段和当前附加数据段重合 MOV ESMOV ES,AXAX LEA SILEA SI,STR1STR1 ;源串首址送;源串首址送SISI LEA DI, STR2LEA DI, STR2 ;目的串首址送;目的串首址送DIDI MOV CXMOV CX,COUNTCOUNT ;串长度送;串长度送CXCX CLD CLD ;将;将DFDF清清0 0 REP MOVSB ;重复传送直至;重复传送直至CX=0CX=0 MOV AH MOV AH,4CH 4CH INT 21H INT 21H CODE ENDSCODE ENDS END START END START(1) 1) 串传送指令
9、串传送指令 MOVS16CX数据段数据段BUF1BUF2 A B C D E F GH I J K L MA B C D E F GH I J K L M“ “ REP MOVSB”REP MOVSB”语句代替了以下程语句代替了以下程序段序段: :P: MOV AL, SI P: MOV AL, SI MOV DI, AL MOV DI, AL INC SI INC SI INC DI INC DI LOOP P LOOP P 由于每个汇编源程序的开始时由于每个汇编源程序的开始时, DF=0, DF=0为默认状态为默认状态, ,一次不用专门使用一次不用专门使用CLDCLD指指令。令。 反向操作
10、的源程序反向操作的源程序: :STDSTD LEA SI,BUF1+COUNT-1 LEA SI,BUF1+COUNT-1LEA DI,BUF2+COUNT-1LEA DI,BUF2+COUNT-1MOV CX,COUNTMOV CX,COUNT REP MOVSB REP MOVSB 语句代替了以下程序段语句代替了以下程序段P: MOV AL, SI P: MOV AL, SI MOV DI,AL MOV DI,AL DEC SI DEC SI DEC DI DEC DI LOOP P LOOP P 由于由于DF=0DF=0为默认状态为默认状态, ,故须使用故须使用STDSTD指令设置指令设
11、置DF=1,DF=1,才能反向操作才能反向操作. . (2 2)串比较指令)串比较指令 CMPSCMPS格式格式: :CMPS OPDCMPS OPD,OPSOPS 或功能:功能: ( (DSDS:SI/ESI)SI/ESI)( (ESES:DI/EDI)DI/EDI),即将,即将SI/ESISI/ESI所指的源串中的所指的源串中的 一个字节一个字节( (或字、双字或字、双字) )中的数与中的数与DIDI、EDIEDI所指的目的串中的一个字节所指的目的串中的一个字节 ( (或字、双字或字、双字) )中的据相减,并根据相减的结果设置标志位,结果并不中的据相减,并根据相减的结果设置标志位,结果并不
12、 保存。保存。 修改串指针,使之指向串中的下一个元素。修改方式为修改串指针,使之指向串中的下一个元素。修改方式为: : i. i. 当当DFDF0 0时,时,(SI)/(ESI)(SI)/(ESI)和和(DI)/(EDI)(DI)/(EDI)增量增量1(1(字节操作字节操作) )或或2(2(字操字操 作作) )或或4(4(双字操作双字操作) )。 ii. ii. 当当DFDF1 1时,时,(SI)/(ESI)(SI)/(ESI)和和(DI)/(EDI) (DI)/(EDI) 减量减量1(1(字节操作字节操作) )或或2(2(字操字操 作作) ) 或或4(4(双字操作双字操作) )。 CMPSB
13、CMPSB 字节串比较字节串比较 CMPSWCMPSW 字串比较字串比较CMPSDCMPSD 双字串比较双字串比较。(2 2)串比较指令)串比较指令 CMPSCMPS说明说明: : 源串放在当前数据段中源串放在当前数据段中, ,指针为指针为SI/ESI;SI/ESI;目的串放在目的串放在 当前附加数据段中当前附加数据段中, ,指针为指针为DI/EDI;DI/EDI; 该指令可带的重复前缀为该指令可带的重复前缀为: : a. a.REPEREPE/REPZ /REPZ 当当(CX/ECX)0(CX/ECX)0时时, ,如两串对应字符如两串对应字符 相等继续比较相等继续比较, ,不相等跳出循环不相
14、等跳出循环; ; b. b.REPNEREPNE/REPNZ/REPNZ 当当(CX/ECX)0(CX/ECX)0时时, ,如两串对应字符如两串对应字符 不相等继续比较不相等继续比较, ,相等跳出循环相等跳出循环; ;例例2(2 2)串比较指令)串比较指令 CMPS例例2 2 从键盘输入一字符串至从键盘输入一字符串至STR1STR1为首址的字节缓冲区中,试为首址的字节缓冲区中,试 比较该串与字节字符串比较该串与字节字符串STR2STR2是否相等,相等则是否相等,相等则0BX;0BX;不不 等等-1BX-1BX。.386 DATA SEGMENT USE16 STR1 DB 80 DB 0 DB
15、 80 DUP(0) STR2 DB WAN1ASM COUNT EQU -STR2 DATA ENDS STACK SEGMENT USE16 STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT USE16 ASSUME DS:DATA,ES:DATA,SS:STACK,CS:CODE 输入缓冲区输入缓冲区; ;待比较字符串待比较字符串; ;待比较字符串长度待比较字符串长度(2 2)串比较指令)串比较指令 CMPSSTART: MOV AX,DATA MOV DS,AX MOV ES,AX LEA DX,STR1 MOV AH,10 输入一串字符至输入一串
16、字符至STR1缓冲区缓冲区 INT 21H MOV AL,STR11 CMP AL,COUNT 比较两串长度是否相等,不等转比较两串长度是否相等,不等转EXIT JNE EXIT LEA SI,STR12 LEA DI,STR2 MOV CX,COUNT REPZ CMPSB ;逐一比较两串的对应字符是否相等;逐一比较两串的对应字符是否相等 JNE EXIT ;不等,转;不等,转EXIT MOV BX,0 ;相等,;相等,0BX JMP RETU EXIT: MOV BX,-1 RETU: MOV AH,4CH INT 21H CODE ENDS END START 当前数据段和当前附加数据段
17、重合当前数据段和当前附加数据段重合(3 3)串搜索指令)串搜索指令 SCAS格式格式: SCAS OPD 或或 功能功能: 字节操作:字节操作:(AL)-(AL)-(ESES:DI/EDIDI/EDI) 字操作:字操作: (AX)- (ES(AX)- (ES:DI/EDI)DI/EDI) 双字操作:双字操作:(EAX)-(ES(EAX)-(ES:DI/EDI)DI/EDI) 修改串指针使之指向下一元素修改串指针使之指向下一元素. .修改方式为修改方式为: : i. i.当当DFDF0 0时,时,(DI)/(EDI)(DI)/(EDI)增量增量1(1(字节操作字节操作) )或或 2(2(字操作字
18、操作) )或或4(4(双字操作双字操作) )。 ii.ii.当当DFDF1 1时,时,(DI)/(EDI)(DI)/(EDI)减量减量1(1(字节操作字节操作) )或或 2(2(字操作字操作) )或或4(4(双字操作双字操作) )。 修改循环变量修改循环变量(CX)/(ECX) -1 CX)/ECX(CX)/(ECX) -1 CX)/ECXSCASBSCASB 字节串搜索字节串搜索 SCASWSCASW 字串搜索字串搜索 SCASDSCASD 双字串搜索双字串搜索 (3 3)串搜索指令)串搜索指令 SCAS说明说明: : 待搜索串一定要是目的串待搜索串一定要是目的串, ,放在当前附加数据段中放
19、在当前附加数据段中, , 指针为指针为DI/EDI;DI/EDI; 该指令可带的重复指令为该指令可带的重复指令为: :i. i. REPZ/REPE REPZ/REPE 若若(CX/ECX)0(CX/ECX)0且相等时接着搜索且相等时接着搜索. .ii.ii.REPNZREPNZ/REPNE/REPNE 若若(CX/ECX)0(CX/ECX)0且不相等时接着搜索且不相等时接着搜索. .例例3(3 3)串搜索指令)串搜索指令 SCAS例例3 3 从键盘输入一串字符至从键盘输入一串字符至ASSASS区区, ,试用串搜索指令在该串中试用串搜索指令在该串中 搜索子串搜索子串AM出现的次数出现的次数BX
20、. . .386.386DATA SEGMENT USE16 ASS DB 80 DB 0 DB 79 DUP(0) DATA ENDS STACK SEGMENT USE16 STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT USE16 ASSUME DS:DATA,ES:DATA,SS:STACK, CS:CODE START: MOV AX,DATA MOV DS,AX MOV ES,AX 当前数据段和当前附加数据段重合当前数据段和当前附加数据段重合(3 3)串搜索指令)串搜索指令 SCASLEA DXLEA DX,ASS ASS MOV AHMOV
21、 AH,1010INT 21HINT 21HLEA DI,ASS+2LEA DI,ASS+2MOV CL,ASS+1MOV CL,ASS+1MOVZX CX,CL MOVZX CX,CL MOV ALMOV AL,AAMOV BXMOV BX,0 0 (CLDCLD) P P: REPNE SCASBREPNE SCASB JE A JE A JMP OUT1 JMP OUT1 A A: CMP CX,0CMP CX,0 JE OUT1 JE OUT1CMP BYTE PTR DI, MCMP BYTE PTR DI, MJNE BJNE B INC BX INC BX B B: JMP P
22、JMP P OUT1OUT1:MOV AHMOV AH,4CH 4CH INT 21H INT 21H CODE ENDS CODE ENDS END START END START ; ;输入串首址输入串首址DIDI; ;输入串长度输入串长度CXCX; ;计数器清零计数器清零; ;查找字符查找字符”A”A”; ;查到字符查到字符”A”A”转转A A处执行处执行; ;全部查完转结束全部查完转结束; ;所有判断完否所有判断完否; ;全部查完转结束全部查完转结束; ;判断判断”A”A”后的字符为后的字符为”M”M”否否; ;不是转不是转B B处执行处执行; ;是是”AM”AM”计数器加计数器加1
23、1; ;未完转未完转P P继续判断继续判断; ;返回操作系统返回操作系统(4 4)取字节)取字节/ /字字/ /双字串指令双字串指令 LODS格式格式: LODS OPS LODS OPS 或或 功能功能: 字节操作:字节操作:(DS(DS:SI/ESISI/ESI)ALAL 字操作:字操作: (DS(DS:SI/ESI) AXSI/ESI) AX 双字操作:双字操作: DSDS:SI/ESI) EAXSI/ESI) EAX 将将SI/ESISI/ESI所指的源串中的一个字节所指的源串中的一个字节( (或字、双字或字、双字) )存储单元中的数存储单元中的数据取出送入据取出送入AL(AL(或或A
24、XAX、EAX)EAX)中。中。 修改修改SI/ESI,SI/ESI,使之指向下一元素使之指向下一元素: : i. i.当当DFDF0 0时,时,(SI)/(ESI)(SI)/(ESI)增量增量1(1(字节操作字节操作) )或或2(2(字操作字操作) ) 或或 4(4(双字操作双字操作) )。 ii.ii.当当DFDF1 1时,时,(SI)/(ESI)(SI)/(ESI)减量减量1(1(字节操作字节操作) )或或2(2(字操作字操作) ) 或或 4(4(双字操作双字操作) )。 * 修改循环变量修改循环变量(CX)/(ECX) -1 CX)/ECX(CX)/(ECX) -1 CX)/ECX L
25、ODSBLODSB 从字节串中取数从字节串中取数 LODSWLODSW 从字串中取数从字串中取数 LODSDLODSD 从双字串中取数从双字串中取数 (4 4)取字节)取字节/ /字字/ /双字串指令双字串指令 LODS说明说明: :由于该指令的目的地址为一固定的寄存器,如果带上由于该指令的目的地址为一固定的寄存器,如果带上重复前缀,源串的内容将连续地送入重复前缀,源串的内容将连续地送入AL(AL(或或AXAX、EAX)EAX)中,操中,操作结束后,作结束后,AL(AL(或或AXAX、EAX)EAX)中只保存了串中最后一个元素的中只保存了串中最后一个元素的值,这是没有多大意义的,因此,该指令一
展开阅读全文