




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、综合实验报告( 2012 - 2013年度第 一 学期) 名 称: 汇编语言程序设计综合实验 实验2.1用表格形式显示字符 实验2.2查找匹配字符串 实验2.3分类统计字符个数 实验2.4查找电话号码 班 级: 学 号: 学生姓名: 指导教师: 王保义 设计周数: 一周 成 绩: 日期: 2013 年 1 月 6 日2实验2.1用表格形式显示字符1、 实验目的和要求:实验目的:学习用汇编语言设计与编写循环程序,掌握运用ASCII码输出字符的方法,以及格式输出的设计。 实验要求:按15行X16列的表格形式显示ASCII码为10H一100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显
2、示对应的字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。二、实验提示:1) 显示每个字符可使用功能号为 02 的显示输出功能调用,使用方法如下:MOV AH,02H MOV DL,输出字符的 ASCII 码 INT 21H2) 显示空白符时,用其 ASCII 码 0 置入 DL 寄存器。每行结束时,用显示回车(ASCII为 0dh)和换行符(ASCII为 0ah)来结束本行并开始下一行。3) 由于逐个显示相继的 ASCII 字符时,需要保存并不断修改DL 寄存器的内容,而显示空白、回车、换行符时也需要使用DL寄存器,为此可使用堆栈来保存相继的ASCII字符。具
3、体用法是:在显示空包或回车、换行符前用指令:PUSH DX把 DL的内容保存到堆栈中去;在显示空白或回车、换行符后用指令POP DX恢复DL 寄存器的原始内容。4) TEST DL,0FH来进行是否应该换行的判断,ZF=1则转至下一行。3、 实验结果: 程序代码:DATAS SEGMENT ;此处输入数据段代码 DATAS ENDSSTACKS SEGMENT ;此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX mov dl,10h;设置初始输出为A
4、SCII的10h mov cx,15;输出显示为15行 next1: push cx mov cx,16;设置循环次数,16,表示输出显示为16列 next: mov ah,02h int 21h;显示输出 inc dl;设置下一个元素 push dx;推入堆栈 mov dl,20h mov ah,02h;显示空白符 int 21h pop dx;将栈顶元素推出 loop next push dx mov dl,0dh mov ah,02h int 21h mov dl,0ah;输出换行 mov ah,02h int 21h pop dx;将栈顶元素推出 pop cx loop next1 M
5、OV AH,4CH INT 21HCODES ENDS end start实验运行结果:四、实验心得: 本实验达到了预期的实验要求,输出了正确的字符表。作为第一个汇编实验,本程序比较简单,很好的让我们熟悉了汇编环境。这样的小小成功给了自己很大信心,相信自己会做好后面的实验。本实验做得比较成功实验得到了15X16的表格形式显示的结果。实验设计思想比较简单,只要注意dx的压栈和出栈的操作,程序实现比较简单。但也想到了一些问题,程序要求输出的是10h-100h的所有ASCII码,我开始写出程序发现只输出了240个字符,后经仔细思考100h并不是字符的ASCII码,问题得以解决,虽然此次实验不是很难,
6、但也收获了一定的知识,并学会了分析和解决问题的方法,相信这对以后的实验进行会起到一定的作用。实验2.2查找匹配字符1、 实验要求:(一) 实验目的:练习字符串的匹配程序设计。 (二) 实验要求:程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示NO match!;如果句子中包含关键字则显示MATCH,且把该字在句子中的位置用十六进制数显示出来。2、 实验说明:1) 采用0AH功能调用将关键字和一个句子分别存入相应的缓冲区。2) 关键字的查找。关键字和句子中相应字段的比较可使用串比较指令,因此定义附加段,附加段和数据段定义为同一段;相应寄存器内容如下:SI寄存器:关键字首指针
7、;DI寄存器:句子中正相比较的字符指针;CX寄存器(数据段的COUNT变量):关键字的字母个数。3) 关键字在句子中位置的判断。DI-COUNT即为关键字在句子中的地址,LEA DX SENTENCE;SUB DI,DX;DEC DI;此时DI中存放关键字的位置。4) 十六进制显示,采用循环移位,每次输出四个二进制位对应的十六进制字符。三、实验结果程序代码 datarea segmentkeyadr label bytekeymax db 20keyact db ?keystring db 20 dup(?)senadr label bytesenmax db 50senact db ?sec
8、string db 50 dup(?)messkey db Enter keyword:,$messsen db 0dh,0ah,Enter Sentence:,$nomatch db 0dh,0ah,No match.,$match db 0dh,0ah,Match at location:,$rest db H of the sentence.,$datarea ends;*prognam segment小于或等于开始初置段地址输入关键字初置SI,DIAl=句子长度CL=关键字长度BX=句子比较末地址不匹配匹配调用DISPLAY串比较ZF=1?CMP DI,BX输入句子小于大于或等于CMP
9、 AL,CLY;-main proc farassume cs:prognam,ds:datarea,es:datareastart: push ds xor ax,ax push ax mov ax,datarea mov ds,ax mov es,ax lea dx,messkey; mov ah,09h int 21h lea dx,keyadr mov ah,0ah;输入关键字 int 21h lea dx,messsen mov ah,09h int 21h d: lea dx,senadr mov ah,0ah;输入一个句子 int 21h mov al,senact sub al
10、,keyact;比较句子与关键字的长度 jl nmatch call search mov dl,0dh mov ah,02h int 21h mov dl,0ah;输出换行 mov ah,02h int 21h jmp d jmp short e0nmatch: lea dx,nomatch mov ah,09h;不匹配 int 21he0: ret main endp ;-search proc near xor cx,cx;markoff counter mov dx,offset senadr add dl,senact inc dl mov cl,keyact cld;使DF=1,告
11、诉程序si,di向前移动 lea di,secstring;di指向句子 r0: lea si,keystring;si指向关键字 repz cmpsb mov al,byte ptr si-1 cmp al,byte ptr di-1 jnz next sub si,offset keystring mov ax,si cmp al,keyact je showp next: mov cl,keyact cmp di,dx jnz r0shown: lea dx,nomatch mov ah,09h int 21h jmp short e1showp: lea dx,match mov ah
12、,09h int 21h dec di mov bx,di xor ax,ax mov al,keyact sub bx,ax mov ax,offset senadr sub bx,ax call binihex lea dx,rest mov ah,09h int 21he1: retsearch endpbinihex proc near mov ch,4r1: mov cl,4 rol bx,cl mov dl,bl and dl,0fh add dl,30h cmp dl,39h jle disp add dl,07hdisp: mov ah,02h int 21h dec ch j
13、nz r1 ret binihex endp;-prognam ends;* end main实验运行结果4、 实验总结: 本实验达到了实验要求。根据实验书上的实验提示,通过使用串比较指令,比较好实现了实验要求的功能。这个程序中出现了子程序的编程,在实验过程中由于开始时疏忽了串比较之后SI和DI会自动改变而使错误迭出,还有CX中关键字个数的存放,作为比较的计数寄存器,如何每次比较前都能使CX中为正确的数值,自己做了不少尝试。这一番周折会很好的提醒我以后编程一定一定要认真。与第一次实验相比这次用到了数据段,应该注意数据段的定义和使用。此外应该注意单个字符时的“边缘”情况因为,这是指针的移动和关键
14、字的长度是一致的,但是这并不意味着,两个字符串匹配。输出结果采用十六进制输出在IBM PC汇编语言程序设计一书中例6.3decihex中的子过程binihex,这里也提醒我要注意积累一些知识,只有这样才能把汇编语言学好。实验2.3分类统计字符个数1、 实验要求:程序接收用户键入的一行字符(用回车符结束),并按字母,数字及其他字符分类计数,然后将结果存入以letter,digit和other为名的存储单元中。二、实验说明:1) 程序采用0AH功能调用把键入字符直接送到缓冲区,然后再逐个取出,比较字符的ASC码,分类计数。2) 程序需进入debug运行并查看计数结果。3) 十进制显示输出,数值存放
15、在AL中,运用MOV BL,10;DIV BL;分别将十位和个位输出。3、 实验结果:程序代码 datarea segmenttou db enter word ,13,10,$letter db letter:,$number db number:,$other db other:,$datarea ends;*STACKS SEGMENT ;此处输入堆栈段代码STACKS ENDSprognam segment ;-main proc farassume cs:prognam,ds:datarea,es:datareastart: push dssub ax,axpush axmov ax
16、,datareamov ds,ax mov bx,0 mov cx,0 mov di,0 lea dx,tou mov ah,09h int 21h input: mov ah,1 int 21h cmp al,0dh 小于小于小于或等于大于小于或等于小于开始字符送缓冲区DI=首地址CL=字符个数数字digital+1di+1字符letter+1di+1其他other+1di+1回车?CMP AL,30HCMP AL,39HCMP AL,41HCMP AL,5AHCMP AL,61HCMP AL,7AH调用display退出Y je disp cmp al,30h jae n1 o: inc
17、di jmp short inputn1: cmp al,39h ja n2 inc cx jmp short inputn2: cmp al,41h jae n3 jmp on3: cmp al,5ah ja n4 inc bx jmp short input n4: cmp al,61h jae n5 jmp short on5: cmp al,7ah ja short o inc bx jmp short input disp: push ax mov dl,0dh mov ah,09h int 21h mov dl,0ah mov ah,09h int 21h pop ax lea d
18、x,letter ; 输出字母个数 push ax mov ah,09h int 21h pop ax call binihex push ax mov dl,0dh mov ah,09h int 21h mov dl,0ah mov ah,09h int 21h pop ax lea dx,number;输出数字个数 push ax mov ah,09h int 21h pop ax mov bx,cx call binihex push ax mov dl,0dh mov ah,09h int 21h mov dl,0ah mov ah,09h int 21h pop ax lea dx,
19、other;输出其他个数 mov ah,09h int 21h mov bx,di call binihex push ax mov dl,0dh mov ah,09h int 21h mov dl,0ah mov ah,09h int 21h pop axretmain endp ;-binihex proc near push cx push ax push dx mov ch,4rotate: mov cl,4 rol bx,cl mov dl,bl and dl,0fh add dl,30h cmp dl,3ah jl printin add dl,07hprintin: mov ah
20、,02h int 21h dec ch jnz rotate pop dx pop ax pop cx retbinihex endp;-prognam ends;* end main实验运行结果:4、 实验总结: 本实验达到了实验要求,很好的在debug中看到了各个寄存器的情况和数据段数据的存放。这次实验流程很清晰明了,关于寄存器的使用相对比较简单。不过开始时编译没有通过,原因是标号和变量使用了同样的单词符号,我原以为标号为代码段符号地址,变量为数据段符号地址 ,汇编程序可以自动识别。这次,对于汇编的符号概念又有了新的认识。实验2.4查找电话号码1、 实验要求: (一)实验目的:学习用汇编语
21、言设计与编写子程序,理解子程序的调用过程。 (二) 实验要求: (1) 要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分; (2) 程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中; (3) 凡有新的输入后,程序应按人名对电话号码表重新排序; (4) 程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。 name tel X X X X X X X X2、 实验说明:1) 实验提示l 显示提示符 “Input name:”; l 调用子程序 input_name 接收人名; l 调用子程序
22、stor_name 把人名存入电话号码表 tel_tab 中:l 显示提示符 “Input a telephone number:”;l 调用子程序 inphone 接收电话号码,并把它存入电话号码表tel_tab中;l 如输入已结束则调用 name_sort 子程序对电话号码表接人名排序; l 显示提示符 “Do you want a telephone number ?(Y/N)”;l 回答N收退出程序; l 回答Y则再显示提示符 “name ?”;l 调用子程序 input_name接收人名;l 调用子程序 name_search 在电话号码表中查找所要的电话号码; l 调用子程序 pr
23、intline 按要求格式显示人名及电话号码; l 重复查号提示符直至用户不要求查号为止。2) 流程图3) 模块层次图主函数main接收人名函数Input_name保存人名函数Stor_ name接收并且保存电话号码函数inphone电话号码表排序函数Name_ sort查找电话号码函数Name_ search输出电话号码表函数printall输出电话号码条目函数printline对调条目位置函数exchange4) 模块说明l 主程序main:用来显示用户操作提示,调用子模块,使程序完成查找电话号码的过程l 子程序input_name:输入人名,将此人名保存至缓冲区,并用空格补足l 子程序s
24、tor_name:将人名从缓冲区中取出,保存在电话号码表中的人名区中l 子程序inphone:输入电话号码,将此电话号码保存至缓冲区,并用空格补足,然后,将电话号码从缓冲区中取出,保存在电话号码表中的电话号码区中l 子程序name_sort:运用冒泡法,对电话号码表按人名排序l 子程序exchange:将不符合排序规律的条目的位置进行调整l 子程序name_search:输入人名,在电话号码表中依次比较人名进行查找l 子程序printline:查找到条目之后,将条目输出l 子程序printall:将整个电话号码表的所有条目依次输出三、实验结果: 31 / 31程序代码;*8data_seg s
25、egment namcount dw 0 ;the number count tel_tab db 50 dup(28 dup( ) ;the telbook nameitem label byte ; store namemax1 db 21 ncurlen db ? namefld db 21 dup(?) phoneitem label byte;store numer max2 db 9 pcurlen db ? phonefld db 9 dup(?) addend dw ? ;排序时的tel_tab尾地址指针 namtemp db 28 dup(?),13,10,$ swap db
26、 0 ;排序中是否有交换的标志位 msg_count db Do you want to insert a item to phonebook?(Y/N),13,10,$ msg_error db Error!Please enter the requested.,13,10,$ msg_inputnam db Input name:,$ msg_inputnum db Input a telephone number:,$ msg_inquire db Do you want a telephone number?(Y/N),$ msg_sname db name?,13,10,$ msg_
27、outtitle db name tel.,13,10,$ msg_nomatch db NOt EXIT!,13,10,$ msg_allphone db print all RECORD?(Y/N),13,10,$ msg_result db name tel.,13,10,$ data_seg ends ;*stack_seg segment para stack stack ;定义堆栈段 dw 256 dup(0) stack_seg ends ;*code_seg segment ;-main proc far assume cs:code_seg,ds:data_seg,es:da
28、ta_seg,ss:stack_seg start: mov ax,data_seg mov ds,ax ;初始化数据段 mov es,ax ;初始化附加段 xor bx,bx cld lea di,tel_tab ;名字表的首地址放入di a1: lea dx,msg_count mov ah,9 int 21h ;显示信息是否插入一项纪录?(Y/N) mov ah,1 int 21h mov bl,al call crlf cmp bl,n ;判断输入 jz a2 cmp bl,N jz a2 cmp bl,y jz next0 cmp bl,Y jz next0 mov ah,9 lea
29、 dx,msg_error int 21h jmp a1next0:lea dx,msg_inputnam mov ah,9 int 21h ;要求输入名字 call input_name ;调用input_name输入人名 call stor_name ;调用stor_name存储人名 call input_phone ;调用input_phone输入电话 call name_sort ;排序 jmp a1 ;是否继续输入? a2: lea dx,msg_inquire mov ah,9 int 21h ;显示是否查找电话号码 mov ah,1 int 21h mov bl,al call
30、crlf cmp bl,n jz a3 cmp bl,N jz a3 cmp bl,y jz next1 cmp bl,Y jz next1 mov ah,9 lea dx,msg_error int 21h jmp a2next1:lea dx,msg_sname mov ah,9 int 21h ;显示要查询电话的姓名 call input_name ;输入姓名 call name_search jmp a2 a3: lea dx,msg_allphone ;显示所有电话号码 mov ah,9 int 21h mov ah,1 int 21h mov bl,al call crlf ;回车
31、换行 cmp bl,n jz exit cmp bl,N jz exit cmp bl,y jz next2 cmp bl,Y jz next2 mov ah,9 lea dx,msg_error int 21h jmp a3next2: call printline ;调用子程序打印出所有的电话号码 jmp a3exit: ret main endp ;- input_name proc near ;子程序 接受输入字符 lea dx,nameitem mov ah,0ah int 21h call crlf ;回车换行 mov bh,0 mov bl,ncurlen mov cx,21 s
32、ub cx,bx repeat1:mov namefldbx,20h inc bx loop repeat1 ;输入的名字为20字节,不足的用空格补足 ret input_name endp ;-stor_name proc near ;子程序传送名字的每个字母到si inc namcount cld lea si,namefld mov cx,20 rep movsb ret stor_name endp ;-input_phone proc near ;子程序(输入电话号码) lea dx,msg_inputnum mov ah,9 int 21h ;显示要求输入电话号码 lea dx,p
33、honeitem mov ah,10 int 21h mov bh,0 mov bl,pcurlen mov cx,9 sub cx,bx repeat2:mov phonefldbx,20h inc bx loop repeat2 call crlf cld lea si,phonefld mov cx,8 rep movsb ;把输入的号码存入namtab表中 ret input_phone endp ;-name_sort proc near ;子程序 push di push ax push bx cmp namcount,1 jz exit4 ;比较名字个数是否为一个s1: mov
34、swap,0 sub di,56 mov addend,di lea si,tel_tab s2: mov cx,20 mov di,si add di,28 mov ax,di mov bx,si repe cmpsb jbe s3 call exchange s3: mov si,ax cmp si,addend jbe s2 cmp swap,0 ;如果有交换,继续下一趟 jnz s1 exit4: pop bx pop ax pop di ret name_sort endp ;-exchange proc near ;交换tel_tab中di,si所指表项的内容 mov cx,28
35、lea di,namtemp mov si,bx rep movsb mov cx,28 mov di,bx rep movsb mov cx,28 lea si,namtemp rep movsb mov swap,1 ret exchange endp ;-name_search proc near ;查找输入的名字 lea di,tel_tab push di mov bx,namcount loop1: lea si,namefld mov cx,20 repe cmpsb ;连续查找匹配名字 je found ;找到跳转found pop di ;没找到di出栈 add di,28
36、push di dec bx jnz loop1 lea dx,msg_nomatch mov ah,9 int 21h ;没有找到输出信息 found: pop di lea dx,msg_outtitle mov ah,9 int 21h mov si,di lea di,namtemp mov cx,28 rep movsb lea dx,namtemp mov ah,9 int 21h ;显示查到的姓名和电话号码 ret name_search endp ;-printline proc near ;输出排序结果 push di push namcount call crlf ;回车换
37、行 lea dx,msg_result mov ah,9 int 21h ;显示升序输出姓名、电话 lea si,tel_tab loop2: lea di,namtemp mov cx,28 rep movsb lea dx,namtemp mov ah,9 int 21h ;显示姓名、电话 dec namcount jnz loop2 ;循环输出 pop namcount pop di ret printline endp ;-crlf proc near ;回车换行 mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ret crlf endp;-code_seg ends ;*end main 实验运行结果: 4、 实验心得: 本实验基本达到了实验要求。初步了解了子程序的设计,是程序设计模块化,这对于设计较复杂的程序是非常重要的。实验对字符串的处理,要求相对较高,涉及字符串的移动和比较,此外还应该注意在定义缓冲区长度时,应把回车的长度加入进去,否则可能会造成覆盖的错误。实验过程中对于si和di的使用,由于没有及时保存发生了,越界错误,后经仔细调试才发现问题,汇编程序设计中压栈操作时十分重要的,在设计程序时应引起注意,注意一些公用寄存器的值的保存的问题。通过这次实验,我发现了使用子过程能更清晰的设计程序,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 如何构建高效的项目管理团队试题及答案
- 2025年中小学生青少年禁毒知识竞赛抢答考试题库含答案
- 2025年中国建设银行内蒙包头支行春季校招考试笔试试题含答案
- 2025年卫生健康局所属事业单位招聘考试笔试试题含答案
- 2025市政工程考试动手能力考查与试题及答案
- 工程项目管理知识的复习框架及试题及答案
- 2024-2025公司及项目部安全培训考试试题答案打印
- 2025公司、项目部、各个班组三级安全培训考试试题答案a4版
- 2025年经济法改革试题及答案
- 2025-2030年雪茄产业行业市场现状供需分析及投资评估规划分析研究报告
- 全自动进销存电子表格系统模板53
- MOOC 猪生产学-南京农业大学 中国大学慕课答案
- 内蒙古呼和浩特市2024届小升初考试语文试卷含答案
- 贵阳市普通住宅小区物业管理服务收费参考标准
- MOOC 地学景观探秘·审美·文化-重庆大学 中国大学慕课答案
- 丁苯橡胶工艺流程
- 安全生产事故报告处理制度范本
- (高清版)WST 311-2023 医院隔离技术标准
- 2024年电梯安装与维修工理论考试题库及答案(通用版)
- 天耀中华合唱简谱大剧院版
- 【《我国互联网企业价值评估现状与问题探析11000字》(论文)】
评论
0/150
提交评论