实验4--jun.doc_第1页
实验4--jun.doc_第2页
实验4--jun.doc_第3页
实验4--jun.doc_第4页
实验4--jun.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南昌大学实验报告学生姓名: 学 号: 5 专业班级: 电三106 实验类型: 验证 综合 设计 创新 实验日期: 实验成绩: 实验4 循环程序设计实验一实验目的1掌握单重循环及多重循环的程序设计方法;2学会针对不同的问题,选用不同的组织循环的方法;3进一步熟悉利用DEBUG程序、CODEVIEW调试程序的方法,并检查和验证结果的正确性。二实验内容1. 已知字数组定义如下:ARRAY DW 12,78,55,4,125,96 MAX DW ? 编制程序求出该ARRAY数组中的最大数放入MAX单元。data segment array dw 12,78,55,4,125,96 max dw ?data endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov si,0 mov ax,arraysi ;把第一个数给max mov cx,5 ;然后逐个比较again: ;遇上比max更大的, add si,2 ;则把值给max。 dec cx jcxz exit cmp ax,arraysi ja again mov ax,arraysi jmp againexit: mov max,ax mov ah,4ch int 21hcode ends end start max里存放的结果为 7D 002. 预留字符串口令,输入口令串与预留密码串比较。若匹配则显示“MATCH!CONGRATULATION”,否则显示“NOMATCH!”,并让用户重新输入,程序能对口令进行测试,但测试次数最多3次,若3次输入密码皆错,给出相应的提示信息,程序退出。data segment password db abcdef$ count EQU 6 input db 20,?,20 dup(?) message1 db 0dh,0ah,Please input the password:$ message2 db 0dh,0ah,MATCH$ message3 db 0dh,0ah,NO MATCH!,PROGRAM TERMINATED!$ message4 db 0dh,0ah,Password input the wrong attain three, db and the program will be over$data ends ;相比实验三,增加了message4 code segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov di,3 ;多增加了一个di变量,使程序只能输错3次。begin: dec di lea dx,message1 ;输出提示 mov ah,09 int 21h lea dx,input ;输入字符串,保存在input里 mov ah,0ah int 21h mov si,0 mov al,inputsi+1 ;比较密码的长度 cmp al,count jnz output1 mov si,0 mov cx,count again: ;取出input里面的字符 mov al,passwordsi ;分别与password里的 mov bl,inputsi+2 ;字符作比较 cmp al,bl jnz output1 inc si loop again jmp output2 output1: ;密码错误 lea dx,message3 mov ah,09 int 21h cmp si,0 ja begin jmp tishioutput2: ;密码正确 lea dx,message2 mov ah,09 int 21h jmp exittishi: ;如果程序输错3次,则会输出提示信息 lea dx,message4 mov ah,09 int 21h mov ax,9999h ;用来延时yan: mov cx,9999h shi: loop shi dec ax jnz yanexit: mov ah,4ch int 21hcode ends end start3.有一个首地址为NUM的N字无序无符号整数数组,编制程序采用选择排序法使该数组中的数按照从小到大的次序排序输出。答:如果是N字无符号整数数组,则只需改变array dw N,然后把si的值改变成2N,最后再改变输出功能的bx的值就行了。data segment array dw 22,31,10,5,1,66,136,99data endscode segmentmain proc far assume cs:code,ds:datastart: mov ax,data mov ds,ax mov di,0 ;外循环的变量again:mov si,di ;就是第di/2个数next:mov ax,arraydi add si,2 ;内循环的变量 cmp si,16 ;比较si,要是大于所含字的字数,则di加2,继续循环 ja exit cmp ax,arraysi ;一个个的进行循环比较 jbe next ;找到第di小的数 xchg ax,arraysi ;就进行交换 mov arraydi,ax ;接着就继续做循环 jmp nextexit:add di,2 cmp di,16 jb again call shuchu mov ah,4ch int 21hmain endpshuchu proc near push ax push bx push cx push dx mov di,0step0: mov ax,arraybx mov cx,spstep1: mov dx,0 mov di,10 div di push dx cmp ax,0 ja step1step2: pop ax add ax,30h mov dl,al mov ah,02h int 21h cmp sp,cx jb step2 add bx,2 mov dx, ;输出,使结果更直观 mov ah,02 int 21h cmp bx,15 jbe step0 pop dx pop cx pop bx pop ax retshuchu endpcode ends end start4.设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程序,统计其中单词的个数,并查出单词SUN在该文中的出现次数,并以格式“SUN:”显示出次数。理论介绍:由于我只考虑了字符变量里面的$、逗号、句号、空格这4个符号,而*、&等都没有考虑,所以比较简单一些。 ah和cx是标志位,ah=0时,检测s;ah=1时,检测u;ah=2时,检测n;ah=3时,则检测字符sun后面是否为$、逗号、句号、空格,如果是,则si+1(si用来记录sun的个数),同时di+1(di用来记录单词的个数),如果不是,则si和di不进行任何操作。cx=0时,说明前面一位字符不是字母,cx=1时,说明前一位字符是字母。设置cx的主要用途是,防止sun*这类单词也被误认为是sun而si进行加1操作。data segment ENG db sun,sunshine sun.sun.sun$ sun db sun:$ number db Total number:$ N dw ? ;记录总的单词数 S dw ? ;记录总的sun单词数data endscode segmentmain proc far assume cs:code,ds:datastart: mov ax,data mov ds,ax;*;第一部分,计算,求出sun的个数,单词的总个数 mov cx,0 mov ah,0 mov di,0 mov si,0 mov bx,-1char: inc bx mov al,ENGbx cmp al,$ ;进行比较 je step1 ;判断是否为,/./$/空格 cmp al, ;然后跳到相应的地方继续执行 je step2 cmp al,. je step2 cmp al,20h je step2 cmp ah,3 jne next0 mov ah,0 cmp cx,0 jne char inc di jmp charnext0: cmp ah,0 ;判定标志位ah jne next1 ;然后跳到相应的地方继续执行 cmp al,s ;ah=0,测试字符s je step3 jmp char next1: cmp ah,1 ;ah=1,测试字符u jne next2 cmp al,u je step4 jmp charnext2: cmp ah,2 ;ah=2,测试字符n jne next3 cmp al,n je step5next3: jmp char ;ah=3,测试字符,/./$/空格step1: cmp cx,0 ;标志位cx je step1_1 ;cx=0,前一位字符不是字母,这时di可以进行加1操作 inc di ;cx=1,前一位字符为字母 step1_1: cmp ah,3 ;ah=3,说明前面3个字符是sun jne exit1 ;若满足sun$ inc si ;则si加1,用来记录sun的个数 jmp exit1 ;然后退出第一部分step2: cmp cx,0 ;比较cx,要是为1,则说明前一个字符为字母 je step2_1 ;这时di就可以进行加1操作 inc di step2_1: cmp ah,3 ;如果ah=3,则说明前面sun3个字符已经测试成功 jne step2_2 ;这时si就可以进行加1操作 inc si step2_2: mov ah,0 ;如果满足前面的条件,那么说明必定是sun,/sun./sun空格 mov cx,0 ;里面中的一个,这时把ah,cx清0 jmp char ;返回继续查找单词sunstep3: mov ah,1 ;把ah的值改为1,然后接着测试字符u mov cx,1 jmp charstep4: mov ah,2 ;把ah的值改为2,然后接着测试字符n mov cx,1 jmp charstep5: mov ah,3 ;把ah的值改为3,然后接着测试字符,/./$/空格 ; mov cx,1 jmp charexit1: mov S,si ;将sun的个数保存在S mov N,di ;将单词个数保存在N;*;第二部分,输出结果 lea dx,sun mov ah,09 int 21h mov ax,S call shuchu call huiche lea dx,number mov ah,09 int 21h mov ax,N call shuchu call huicheexit2: mov ah,4ch int 21hmain endp;*;子程序shuchu proc near ;功能:用来输出十进制数 push ax ;当sun或单词的总个数超过10个时 push bx ;这程序就为必须的 push cx push dx mov bx,spstep7: mov dx,0 mov cx,10 div cx push dx cmp ax,0 ja step7step8: pop ax add ax,30h mov dl,al mov ah,02h int 21h cmp sp,bx ja step8 pop dx pop cx pop bx pop ax retshuchu endphuiche proc near ;回车换行功能 mov dx,0dh mov ah,02h int 21h mov dx,0ah mov ah,02 int 21h rethuiche endpcode ends end start三实验要求1编写实验内容要求的四个程序,注意:习题2可以基于分支程序实验的习题3进行完善,习题3数组元素排序最后输出需要考虑进制转换问题,习题4选做。2熟悉源程序汇编、连接命令的使用方法。3认真完成上述习题,采用DEBUG或CODEVIEW进行调试,编辑实验方案,运行程序,并调试程序。4实验过程请认真记录,并对结果进行分析。四实验环境PC微机DOS操作系统或 Windows 操作系统MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境五实验步骤1 用EDIT或其它编辑软件,编写.ASM源程序, 2对其进行汇编及连接,产生.EXE文件。3. 在MS-DOS下运行这两个.EXE文件。4对.EXE文件进行调试运行。(1)用DEBUG调试运行,学会通过命令R、U、D等命令观察数据变化,学会T、G命令来实现程序的单步或断点调试调试。(2)用CODEVIEW调试运行,学会使用该集成环境中的各个窗口综合观察寄存器、内存单元等变化,学会使用功能键进行单步或断点调试。六实验报告要求1画出四个程序的流程图,列出相应的程序清单。程序中应有相应的注释信息。2在报告中说明本实验是如何利用DEBUG或CODEVIEW进行调试的。3编辑实验

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论