1、 南 昌 大 学 实 验 报 告学生姓名: 学 号: 5 专业班级: 电三 106 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 实验 4 循环程序设计实验一实验目的1掌握单重循环及多重循环的程序设计方法;2学会针对不同的问题,选用不同的组织循环的方法;3进一步熟悉利用 DEBUG 程序、CODEVIEW 调试程序的方法,并检查和验证结果的正确性。二实验内容1. 已知字数组定义如下:ARRAY DW 12,78,55,4,125,96MAX DW ?编制程序求出该 ARRAY 数组中的最大数放入 MAX 单元。data segmentarray dw 12,78,55,4,125
2、,96max dw ?data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov si,0mov ax,arraysi ;把第一个数给 maxmov cx,5 ;然后逐个比较again: ;遇上比 max 更大的,add si,2 ;则把值给 max。dec cxjcxz exitcmp ax,arraysija againmov ax,arraysijmp againexit:mov max,axmov ah,4chint 21hcode endsend start max 里存放的结果为 7D 002.
3、预留字符串口令,输入口令串与预留密码串比较。若匹配则显示“MATCH!CONGRATULATION ”,否则显示“NOMATCH!”, 并让用户重新输入,程序能对口令进行测试,但测试次数最多 3 次,若 3 次输入密码皆错,给出相应的提示信息,程序退出。data segment password db abcdef$count EQU 6input db 20,?,20 dup(?)message1 db 0dh,0ah,Please input the password:$ message2 db 0dh,0ah,MATCH$message3 db 0dh,0ah,NO MATCH!,PRO
4、GRAM TERMINATED!$message4 db 0dh,0ah,Password input the wrong attain three, db and the program will be over$data ends ;相比实验三,增加了 message4 code segmentassume cs:code,ds:datastart:mov ax,datamov ds,ax mov di,3 ;多增加了一个 di 变量,使程序只能输错 3 次。begin:dec dilea dx,message1 ;输出提示mov ah,09int 21hlea dx,input ;输入字
5、符串,保存在 input 里mov ah,0ahint 21hmov si,0mov al,inputsi+1 ;比较密码的长度cmp al,count jnz output1 mov si,0mov cx,count again: ;取出 input 里面的字符mov al,passwordsi ;分别与 password 里的mov bl,inputsi+2 ;字符作比较cmp al,bl jnz output1inc siloop againjmp output2 output1: ;密码错误lea dx,message3mov ah,09int 21hcmp si,0ja beginj
6、mp tishioutput2: ;密码正确lea dx,message2mov ah,09int 21hjmp exittishi: ;如果程序输错 3 次,则会输出提示信息lea dx,message4mov ah,09int 21hmov ax,9999h ;用来延时yan: mov cx,9999h shi: loop shidec axjnz yanexit:mov ah,4chint 21hcode ends end start3.有一个首地址为 NUM 的 N 字无序无符号整数数组,编制程序采用选择排序法使该数组中的数按照从小到大的次序排序输出。答:如果是 N 字无符号整数数组,
7、则只需改变 array dw N,然后把 si 的值改变成2N,最后再改变输出功能的 bx 的值就行了。data segmentarray dw 22,31,10,5,1,66,136,99data endscode segmentmain proc farassume cs:code,ds:datastart:mov ax,datamov ds,axmov di,0 ;外循环的变量again:mov si,di ;就是第 di/2 个数next:mov ax,arraydiadd si,2 ;内循环的变量cmp si,16 ;比较 si,要是大于所含字的字数,则 di 加 2,继续循环ja
8、exitcmp ax,arraysi ;一个个的进行循环比较jbe next ;找到第 di 小的数xchg ax,arraysi ;就进行交换mov arraydi,ax ;接着就继续做循环jmp nextexit:add di,2cmp di,16jb againcall shuchumov ah,4chint 21hmain endpshuchu proc near push ax push bx push cxpush dxmov di,0step0:mov ax,arraybxmov cx,spstep1:mov dx,0mov di,10div dipush dxcmp ax,0j
9、a step1step2:pop axadd ax,30hmov dl,almov ah,02hint 21hcmp sp,cxjb step2add bx,2mov dx, ;输出,使结果更直观mov ah,02int 21hcmp bx,15jbe step0pop dxpop cxpop bxpop axretshuchu endpcode endsend start4.设有一段英文,其字符变量名为 ENG,并以$字符结束。试编写一程序,统计其中单词的个数,并查出单词 SUN 在该文中的出现次数,并以格式“SUN:”显示出次数。理论介绍:由于我只考虑了字符变量里面的$、逗号、句号、空格这
10、 4 个符号,而*、记录总的单词数S dw ? ;记录总的 sun 单词数data endscode segmentmain proc farassume cs:code,ds:datastart:mov ax,datamov ds,ax;*;第一部分,计算,求出 sun 的个数,单词的总个数mov cx,0mov ah,0mov di,0mov si,0mov bx,-1char:inc bxmov al,ENGbxcmp al,$ ;进行比较je step1 ;判断是否为,/./$/空格cmp al, ;然后跳到相应的地方继续执行je step2cmp al,.je step2cmp al
11、,20hje step2cmp ah,3jne next0mov ah,0cmp cx,0jne charinc dijmp charnext0:cmp ah,0 ;判定标志位 ahjne next1 ;然后跳到相应的地方继续执行cmp al,s ;ah=0,测试字符 sje step3 jmp char next1: cmp ah,1 ;ah=1,测试字符 ujne next2cmp al,uje step4jmp charnext2:cmp ah,2 ;ah=2,测试字符 njne next3cmp al,nje step5next3:jmp char ;ah=3,测试字符,/./$/空格
12、step1:cmp cx,0 ;标志位 cxje step1_1 ;cx=0,前一位字符不是字母,这时 di 可以进行加 1 操作inc di ;cx=1,前一位字符为字母step1_1:cmp ah,3 ;ah=3,说明前面 3 个字符是 sunjne exit1 ;若满足 sun$inc si ;则 si 加 1,用来记录 sun 的个数jmp exit1 ;然后退出第一部分step2:cmp cx,0 ;比较 cx,要是为 1,则说明前一个字符为字母 je step2_1 ;这时 di 就可以进行加 1 操作inc distep2_1:cmp ah,3 ;如果 ah=3,则说明前面 su
13、n3 个字符已经测试成功jne step2_2 ;这时 si 就可以进行加 1 操作inc sistep2_2:mov ah,0 ;如果满足前面的条件,那么说明必定是 sun,/sun./sun 空格mov cx,0 ;里面中的一个,这时把 ah,cx 清 0jmp char ;返回继续查找单词 sunstep3:mov ah,1 ;把 ah 的值改为 1,然后接着测试字符 umov cx,1jmp charstep4:mov ah,2 ;把 ah 的值改为 2,然后接着测试字符 nmov cx,1jmp charstep5:mov ah,3 ;把 ah 的值改为 3,然后接着测试字符,/./
14、$/空格 ;mov cx,1jmp charexit1:mov S,si ;将 sun 的个数保存在 Smov N,di ;将单词个数保存在 N;*;第二部分,输出结果lea dx,sunmov ah,09int 21hmov ax,Scall shuchucall huichelea dx,number mov ah,09int 21hmov ax,Ncall shuchucall huicheexit2:mov ah,4chint 21hmain endp;*;子程序shuchu proc near ;功能:用来输出十进制数push ax ;当 sun 或单词的总个数超过 10 个时pus
15、h bx ;这程序就为必须的push cxpush dxmov bx,spstep7:mov dx,0mov cx,10div cxpush dxcmp ax,0ja step7step8:pop axadd ax,30hmov dl,almov ah,02hint 21hcmp sp,bxja step8pop dxpop cxpop bxpop axretshuchu endphuiche proc near ;回车换行功能mov dx,0dhmov ah,02hint 21hmov dx,0ahmov ah,02int 21hrethuiche endpcode endsend star
16、t三实验要求1编写实验内容要求的四个程序,注意:习题 2 可以基于分支程序实验的习题 3 进行完善,习题 3 数组元素排序最后输出需要考虑进制转换问题,习题 4 选做。2熟悉源程序汇编、连接命令的使用方法。3认真完成上述习题,采用 DEBUG 或 CODEVIEW 进行调试,编辑实验方案,运行程序,并调试程序。4实验过程请认真记录,并对结果进行分析。四实验环境PC 微机DOS 操作系统或 Windows 操作系统MASM.EXE, LINK.EXE,DEBUG.COM 或宏汇编集成环境五实验步骤1 用 EDIT 或其它编辑软件,编写.ASM 源程序, 2对其进行汇编及连接,产生.EXE 文件。
17、3. 在 MS-DOS 下运行这两个.EXE 文件。4对.EXE 文件进行调试运行。(1)用 DEBUG 调试运行,学会通过命令 R、U 、D 等命令观察数据变化,学会T、G 命令来实现程序的单步或断点调试调试。(2)用 CODEVIEW 调试运行,学会使用该集成环境中的各个窗口综合观察寄存器、内存单元等变化,学会使用功能键进行单步或断点调试。六实验报告要求1画出四个程序的流程图,列出相应的程序清单。程序中应有相应的注释信息。2在报告中说明本实验是如何利用 DEBUG 或 CODEVIEW 进行调试的。3编辑实验方案,运行程序,并调试程序,写出正确结果以及遇到的问题和解决方法。4实验报告应对实
18、验过程中出现的最终结果进行分析写出实验体会或意见。此部分将作为评价标准之一。七实验记录及程序清单八思考题习题 2 中当进行口令检查时,若要求不把用户从键盘上键入的密码串显示在屏幕上而只挨个显示“ * ”号,如何修改程序?答:只有 begin 下面的部分需要改动,增加了 inputzifu 和 inputover,其他的都可以不要修改。begin:dec dilea dx,message1 ;输出提示mov ah,09int 21hmov si,0 ;依次输入字符,保存在 input 里inputzifu: mov ah,07 ;用 7 号子功能不会显示输入的字符int 21hcmp al,0dh ;要是输入的是回车,则完成输入。je inputovermov inputsi,alinc simov dx,2ah ;输出*mov ah,02
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。