《作业与子程序》PPT课件.ppt
《《作业与子程序》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《作业与子程序》PPT课件.ppt(41页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、1.1.作业讲评作业讲评2.2.子程序:子程序:关注入口参数、出口参数、传递方式。特别注意堆栈的使用及其内容。能描述堆栈变化。本次课内容本次课内容 统计统计AXAX中中1 1的个数送到的个数送到CL,0CL,0的个数送到的个数送到CH.CH.分析分析 逐位处理逐位处理,一般可以用移位指令完成一般可以用移位指令完成.无论哪种移位无论哪种移位,所移出的位都会放在所移出的位都会放在CFCF中中.问题问题:“广泛流传”的版本code segmentassume cs:codestart:movxor bx,bxmov cx,16circle:rol ax,1怎么会有两个loop circle?jc B
2、itSetinc bhloop circlejmp countoverBitSet:inc blloop circle其实16位可以一块送countover:mov ch,bhmov cl,blmov ax,4c00hint 21hcode endsend该流程图虽然可行,但仍该流程图虽然可行,但仍有以下问题:有以下问题:1.有必要两处判断有必要两处判断CX=0吗吗?2.同样的代码同样的代码(loop circle)写了两次写了两次.3.分支与循环结构交叉,分支与循环结构交叉,易出现错误易出现错误.此流程图需要完善。此流程图需要完善。CF=0?BL-BL+1CX-CX-1YN开始开始AX-数数
3、CX-16CX=0?YENDAX左移一左移一位位CX=0?YNNBH-BH+1CX-CX-1CX-BXcircleBitSetcountover完善流程图流程图本身不是目的,而是将想法表达为算法,为编写程序代码做准备。在流程图阶段,应当检查有没有原则性错误。好的流程图不应当出现交叉的程序结构,更不应存在逻辑错误。优化流程图,可以提高代码效率。该流程图合乎规范,表现该流程图合乎规范,表现在:在:1.同样的代码同样的代码(loop circle)只写了一次,效率提高了只写了一次,效率提高了.2.分支与循环结构不再交分支与循环结构不再交叉,分支结构完全嵌套在叉,分支结构完全嵌套在循环结构中,不易出现
4、错循环结构中,不易出现错误误.本流程图很容易转换成代本流程图很容易转换成代码。码。CF=0?BL-BL+1YN开始开始AX-数数CX-16YENDAX左移一左移一位位CX=0?NBH-BH+1CX-BXcircleBitSetcountoverCX-CX-1Y修改后的程序code segmentassume cs:codestart:movxor bx,bxmov cx,16circle:rol ax,1分支在循环结构里面jc BitSetinc bhjmp countoverBitSet:inc blcountover:loop circle现在程序简洁了mov cx,bxmov ax,4c
5、00hint 21hcode endsend调试程序1.不要急于输入输出,在DEBUG中也可以查看程序的执行结果,而且更全面。2.记录程序运行的中间结果,分析其是否正确。如果不正确,要找出问题所在。3.尽量列表格说明程序执行情况,用直观的手段说明你的观点。例说明刚才程序的执行结果:至少要列举3种情况AXCHCL000000000000000010H(16)01111111111111111010H(16)010010011010100197串串(string):顺序放在内存中一组相同类型数据顺序放在内存中一组相同类型数据(字字/字节字节)串操作串操作:对串中的元素进行相同的操作。对串中的元素进
6、行相同的操作。串操作的寻址方式(隐含):串操作的寻址方式(隐含):源源操作数指针操作数指针DS:SI 目的目的操作数指针操作数指针ES:DI(同一段内操作则须同一段内操作则须ES=DS)每次串操作后自动修改指针每次串操作后自动修改指针SI和和DI :字节字节串操作后自动串操作后自动1,字字串操作后自动串操作后自动2 (指下一个指下一个)CLD令令DF=0作作,STD令令DF=1作作 。重复前缀:重复前缀:REP CX0 则重复执行则重复执行 MOVS/STOS CX减减1 REPE/REPZ CX0ZF=1则重复执行则重复执行CMPS/SCAS CX减减1 上次比较上次比较相等相等则继续重复则
7、继续重复 直至直至CX=0CX=0为止为止REPNE/REPNZ CX0ZF=0则重复执行则重复执行CMPS/SCAS CX减减1 上次比较上次比较不相等不相等则继续重复则继续重复 直至直至CX=0CX=0为止为止3.3.5 3.3.5 串操作指令串操作指令 P.67 P.67 串操作指令串操作指令 串是由字节、字、或双字组成的字符或数据序列,存放在存储器中。串是由字节、字、或双字组成的字符或数据序列,存放在存储器中。基本指令集处理的串长度不超过基本指令集处理的串长度不超过64K。串操作常用于数据块的快速移动、比较、搜索和存取,执行一次操作串中一个元串操作常用于数据块的快速移动、比较、搜索和存
8、取,执行一次操作串中一个元 素,配上重复前缀可按条件完成对整个串的操作。素,配上重复前缀可按条件完成对整个串的操作。重复前缀重复前缀 重复前缀指令的名称、汇编格式、重复条件、后续的串指令及操作见下表。重复前缀指令的名称、汇编格式、重复条件、后续的串指令及操作见下表。重复前缀也是一条指令,但不能单独使用,需加在串操作指令之前,使重复前缀也是一条指令,但不能单独使用,需加在串操作指令之前,使 串操作指令重复或条件重复执行,相当于运行一个循环程序;串操作指令重复或条件重复执行,相当于运行一个循环程序;取串指令取串指令LODS一般不加重复前缀,因为重复取出串中的元素送到累加一般不加重复前缀,因为重复取
9、出串中的元素送到累加 器器Acc无意义(后面取出的数冲掉前面取出的数)。无意义(后面取出的数冲掉前面取出的数)。串指令使用的一般方法串指令使用的一般方法设置源串地址设置源串地址设置目标串地址设置目标串地址设置串长度设置串长度设置操作方向设置操作方向DF串指令串指令 MOV SI,源串首地址源串首地址(或(或LEA SI,源串)源串)MOV DI,目的串首地址目的串首地址(或(或LEA DI,目的串)目的串)MOV CX,串长度串长度CLD(或(或STD)加重复前缀或循环编程实现批处理加重复前缀或循环编程实现批处理重复执行?重复执行?MOVSB :(ES:DI)(DS:SI)(ES:DI)(DS
10、:SI),SI SI1,DI1 MOVSW:(ES:DI+1(ES:DI+1、DI)(DS:SI+1DI)(DS:SI+1、SI),SISI),SI2,DI2 例例 将将10001000个字符的字符串从内存的个字符的字符串从内存的BUFFER1BUFFER1搬移到内存的搬移到内存的BUFFER2BUFFER2中去。中去。MOV SI MOV SI,OFFSET BUFFER1 OFFSET BUFFER1 ;BUFFER1BUFFER1偏移地址送偏移地址送SI SI MOV DI MOV DI,OFFSET BUFFER2 OFFSET BUFFER2 ;BUFFER2BUFFER2偏移地址送
11、偏移地址送DI DI MOV CX MOV CX,10001000 ;传送个数送传送个数送CXCX CLD CLD ;令令DF=0DF=0,地址自动递增地址自动递增LR:REP LR:REP MOVSBMOVSB ;重复搬移重复搬移10001000个字节个字节LC:.LC:.3.3.5 3.3.5 1.1.串传送指令串传送指令 MOVSB/MOVSW CLD CLDLR:LR:MOVSBMOVSB DEC CXDEC CX JNZ LR JNZ LR LC:.LC:.用串传送指令实现数据块传送用串传送指令实现数据块传送MOVSB :(ES:DI)(DS:SI)(ES:DI)(DS:SI),SI
12、 SI1,DI1 MOVSW:(ES:DI+1(ES:DI+1、DI)(DS:SI+1DI)(DS:SI+1、SI),SISI),SI2,DI2 例例 将将10001000个字符的字符串从内存的个字符的字符串从内存的BUFFER1BUFFER1搬移到内存的搬移到内存的BUFFER2BUFFER2中去。中去。MOV SI MOV SI,OFFSET BUFFER1 OFFSET BUFFER1 ;BUFFER1BUFFER1偏移地址送偏移地址送SI SI MOV DI MOV DI,OFFSET BUFFER2 OFFSET BUFFER2 ;BUFFER2BUFFER2偏移地址送偏移地址送DI
13、 DI MOV CX MOV CX,10001000 ;传送个数送传送个数送CXCX CLD CLD ;令令DF=0DF=0,地址自动递增地址自动递增LR:REP LR:REP MOVSBMOVSB ;重复搬移重复搬移10001000个字节个字节LC:.LC:.3.3.5 3.3.5 1.1.串传送指令串传送指令 MOVSB/MOVSW (move)LR:AND CX,CX JZ LC MOV 暂存,暂存,SI MOV DI,暂存暂存 INC SI INC DI DEC CX JMP LRLC:.CMPSB:(DS:SI)(DS:SI)(ES:DI)(ES:DI),SI SI1,DI1 CMP
14、SW:(DS:SI+1(DS:SI+1、SI)SI)(ES:DI+1(ES:DI+1、DI)DI),SISI2,DI2 例例 比较比较DESTDEST和和SOURCESOURCE中的中的500500个字节,找出第一个不相同的字节,个字节,找出第一个不相同的字节,如果找到,则将如果找到,则将SOURCESOURCE中的这个数送中的这个数送ALAL中。中。LEA DI LEA DI,DEST DEST;DEST DEST偏移地址送偏移地址送DI DI LEA SI LEA SI,SOURCE SOURCE;SOURCE SOURCE偏移地址送偏移地址送SI SI MOV CX MOV CX,500
15、500;比较次数送比较次数送CXCX CLDCLD;令令DF=0DF=0,地址自动递增地址自动递增 REPE REPE CMPSBCMPSB;相同则重复比较直至最后相同则重复比较直至最后 JZ NEXTJZ NEXT;遇不同或比完遇不同或比完:判相同则不存判相同则不存MACH:DEC SIMACH:DEC SI;SI;SI退指最后比较不同的那个源数退指最后比较不同的那个源数 MOV AL MOV AL,SISI;送送ALALNEXTNEXT:.本指令可用来检查两个串是否相等本指令可用来检查两个串是否相等3.3.5 3.3.5 2.2.串比较指令串比较指令 CMPSB/CMPSW(compare
16、)SCASB:(AL)(AL)(ES:DI)(ES:DI),DI1 (search)SCASW:(AX)(AX)(ES:DI+1(ES:DI+1、DI)DI),DI2 例例 在包含在包含100100个字符的字符串中寻找第一个回车符个字符的字符串中寻找第一个回车符CRCR(其其ASCIIASCII码码为为0 0DHDH),),找到后将其地址保留在(找到后将其地址保留在(DSDS:DIDI)中,并在屏幕上显示中,并在屏幕上显示“Y”Y”,否则显示否则显示“N”N”。LEA DI LEA DI,STRING STRING ;STRING STRING偏移地址送偏移地址送DI DI MOV AL MO
17、V AL,0DH 0DH ;关键字送关键字送AL AL MOV CX MOV CX,100100 ;比较次数送比较次数送CXCX CLDCLD;令令DF=0DF=0,地址自动递增地址自动递增 REPNE REPNE SCASBSCASB;不同则重复比较直至最后不同则重复比较直至最后 JZ FOUNDJZ FOUND ;遇相同或比完遇相同或比完:判相同则转判相同则转 MOV DL MOV DL,NN;不存在回车:显示不存在回车:显示“N”N”JMP DSPYJMP DSPYFOUND:DEC DIFOUND:DEC DI;SI;SI退指找到回车的那个单元退指找到回车的那个单元 MOV DL MO
18、V DL,YY;显示显示“Y”Y”DSPYDSPY:MOV AHMOV AH,02H02H;调用调用2 2号软中断输出显示号软中断输出显示 INT 21H INT 21H .本指令用于在串中查找指定的信息本指令用于在串中查找指定的信息3.3.5 3.3.5 3.3.串搜索串搜索(扫描扫描)指令指令 SCASB/SCASWMOV AX,DATAMOV AX,DATAMOV DS,AXMOV DS,AXMOV ES,AXMOV ES,AX;在在100个字符中找回车符个字符中找回车符.MODEL SMALL ;小模式小模式.DATA ;数据段数据段STRING DB HOW DO YOU DO!,0
19、DH,34H,43H,37H,41H,0DH.STACK 200;堆栈段,预留堆栈段,预留200字节字节.CODE ;代码段代码段START:MOV AX,DATA MOV DS,AX;数据段赋值数据段赋值MOV ES,AX;附加段赋值附加段赋值MOV DI,OFFSET STRING;STRING偏移地址送偏移地址送DI MOV AL,0DH;关键字送关键字送AL MOV CX,100;比较次数送比较次数送CX CLD;令令DF=0,地址自动递增地址自动递增 REPNE SCASB;不同则重复比较直至最后不同则重复比较直至最后 JZ FOUND;遇相同或比完遇相同或比完:判相同则转判相同则转
20、 MOV DL,N;不存在回车:显示不存在回车:显示“N”JMP DSPYFOUND:DEC DI;SI退指找到回车的那个单元退指找到回车的那个单元 MOV DL,Y;显示显示“Y”DSPY:MOV AH,02H;调用调用2号软中断输出显示号软中断输出显示 INT 21H MOV AH,4CH ;返回返回DOS INT 21H END START;汇编结束汇编结束LODSB:(AL)(DS:SI)(AL)(DS:SI),SI SI1LODSW:(AX)(DS:SI+1(AX)(DS:SI+1、SI)SI),SISI2例例 内存中以内存中以BUFFERBUFFER为首址的缓冲区有为首址的缓冲区有
21、1010个以非压缩型个以非压缩型BCDBCD码形式码形式存放的十进制数,它们的值可能是存放的十进制数,它们的值可能是0909中的任意一个,将这些十进中的任意一个,将这些十进制数按顺序显示在屏幕上。制数按顺序显示在屏幕上。LEA SILEA SI,BUFFER BUFFER;BUFFERBUFFER偏移地址送偏移地址送DI DI MOV CXMOV CX,1010;数据个数送数据个数送CXCXMOV AHMOV AH,02H02H;置置2 2号号DOSDOS功能调用功能调用 CLDCLD ;令令DF=0DF=0,地址自动递增地址自动递增GETGET:LODSBLODSB ;用串装入指令取一个用串
22、装入指令取一个BCDBCD码到码到ALAL OR AL,30HOR AL,30H;转换为转换为ASCIIASCII码码 MOV DLMOV DL,ALAL;送送DLDLINT 21HINT 21H;输出显示输出显示DEC CXDEC CX;循环计数循环计数 JNZ JNZ GETGET;未完继续未完继续MOV AH,4CHMOV AH,4CH;返回返回DOSINT 21HINT 21H .3.3.53.3.5 4.4.串装入指令串装入指令 LODSB/LODSW (load)从内存串数据逐个装入到从内存串数据逐个装入到CPUCPU的的ALAL里来,使用重复前缀没有意义里来,使用重复前缀没有意义
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作业与子程序 作业 子程序 PPT 课件
限制150内