实验报告课程名称汇编语言程序设计实验项目实验三、子程序结构和设计实验仪器微机系统、汇编调试环境系别计算机科学与技术专业计算机科学与技术班级/学号计科1103/2011011111 学生姓名房皓实验日期2013-6-2成绩指导教师胡信裕实验三子程序结构和设计一、实验目的1.进一步熟悉、掌握顺序结构、分支结构、循环结构程序设计和调试。
2.熟悉、掌握子程序设计和调试;3.熟悉、掌握键盘输入和屏幕输出的中断调用方法和应用。
二、实验要求1.Windows操作系统并具有命令提示符操作界面的计算机,且系统内安装有汇编语言编程环境。
2.在开始本实验之前,复习教科书的相关内容,并预先写出相应的源程序。
3.通过汇编IDE上机调试,注意观察,并记录下现象。
三、实验内容功能要求:从键盘上以16进制数的形式输入20个无符号数(0~255),以回车作为一个数输入的结束。
将它们以16进制数的形式在屏幕上按输入顺序显示,并换一行后将它们由大到小排序显示,数之间用空格隔开。
【可键入任意字符,但只对十六进制数处理显示】。
1.运用文本编辑器编辑实验源程序(EXP3.asm);实验程序设计如下:Data segmentarray db20dup(?)mess1 db0dh,0ah,'PRE_Enter:',0dh,0ah,'$'mess2 db0dh,0ah,'SORTED:',0dh,0ah,'$';a_len equ ($-array)/2Data endsCode segmentAssume ds:data,cs:codeMain proc farstart: mov ax,datamov ds,axcall getarray ;调用getarray子程序mov ah,9;显示提示信息mess1:mov dx,offset mess1int21hcall output ;调用output子程序,输出排序前的序列call disp0d0a ;调用disp0d0a子程序,输出回车换行call disp0d0acall sort ;调用sort子程序,由大到小排序mov ah,9;显示提示信息mess2:mov dx,offset mess2int21hcall output ;调用output子程序,输出排序后的序列int21hdisp0d0a proc;子程序disp0d0a,输出回车换行push axpush dxmov dl,0dhmov ah,2int21hmov dl,0ahmov ah,2int21hpop dxpop axretdisp0d0a endpgetarray proc;子程序getarray,输入20个数据push di;保护现场push axmov di,0mov cx,20;循环20次lop1:mov bx,0mov ax,0r_key: mov ah,1int21h;输入一个字符cmp al,0dh;比较是否是回车jz set ;回车则转至setcmp al,'0';对输入字符进行处理jl r_keycmp al,'9'jle d0_9cmp al,'A'jl r_keycmp al,'F'jle da_fcmp al,'a'jl r_keycmp al,'f'jle da__fjmp r_keyd0_9: ;处理0~9,变成十进制sub al,30hda_f: ;处理a~f,变成十进制sub al,37hjmp add_toda__f: ;处理a~f,变成十进制sub al,57hjmp add_toadd_to: ;累加shl bx,4;bx逻辑左移4位mov ah,0add bx,ax;全都累加在bx中jmp r_keyset:mov array[di],bl;存入数据inc dimov ah,2;mov dl,0dh;int 21hmov dl,0ahint21h;回车换行;mov dl,bl;add al,30h;mov dh,0;int 21hloop lop1pop di;恢复pop axretgetarray endpoutput proc;子程序output,输出数据push dipush dxmov dx,0mov di,0mov cx,20lop2: mov bl,array[di] ;将已输入的数据送入bx mov dl,blshr dl,4;高位;add dl,37h;and dl,0fh;add dl,30hjbe d_9cmp dl,0fhjbe d_fdisp1: mov ah,2int21h;显示高位mov dl,bland dl,0fh;低位;add dl,37hcmp dl,09hjbe d_9_1cmp dl,0fhjbe d_f_1disp2: mov ah,2int21h;显示低位inc dimov dl,20hmov ah,2int21h;输出空格loop lop2pop dxpop dijmp backd_9: add dl,30h;处理高位0~9 jmp disp1d_f: add dl,37h;处理高位a~f jmp disp1d_9_1: add dl,30h;处理低位0~9 jmp disp2d_f_1: add dl,37h;处理低位0~9 jmp disp2back: retoutput endpsort procpush bxpush cxpush sipush axmov ax,0mov bx,0lp1: mov bx,1;设置标志bx=1 mov cx,20;设置循环次数cx=20dec cx;;mov si,offset arraylp2: mov al,array[si] ;取数据;mov dx,axcmp al,array[si+1];cmp al,ah ;比较相邻的两个数jae con ;若大于等于,则不需要互换,继续下一个xchg al,array[si+1];xchg al,ah ;若小于,互换mov array[si],al;存入换后的数据mov bx,0;使标志bx=0con: inc siloop lp2cmp bx,1jz backtojmp lp1backto: pop axpop sipop cxpop bxretsort endpMain endpCode endsEnd main2.在IDE操作环境下,对源程序(EXP3.asm)进行编译和连接,生成生成链接文件(EXP3.obj)和可执行文件(EXP3.exe);3.运行IDE操作环境下的调试命令,调试可执行文件(EXP3.exe);4.运行IDE操作环境下的执行命令,运行可执行文件(EXP3.exe),结果为:测试数据:1、2、3、4、5、6、7、8、9、0、1w2、a、b、c、d、e3、f、ws34、33、2(不接受非十六进制字符)输出数据:E3、34、33、12、0F、0D、0C、0B、0A、09、08、07、06、05、04、03、02、01、00运行结果截图:实验结果符合实验程序设计要求。
四、实验总结1.对实验过程中所涉及的主要操作进行总结;实验操作流程:a 运用文本编辑器编辑实验源程序(EXP3.asm);b在IDE操作环境下,对源程序(EXP3.asm)进行编译和连接,生成生成链接文件(EXP3.obj)和可执行文件(EXP3.exe);c运行IDE操作环境下的调试命令,调试可执行文件(EXP3.exe);d运行IDE操作环境下的执行命令,运行可执行文件(EXP3.exe)2.对实验过程中出现的主要问题进行分析并给出解决方案说明;a 实验结果输出不合理,有明显偏差。
原因是在使用寄存器前没有对寄存器初始化,或者寄存器内容被更改,例如利用CX进行循环计数时,在使用前没有对CX赋初值或CX另被调用导致其内容改变。
解决方法就是在最靠近循环的位置对CX初始化。
b 子程序getarray的定义出现问题,原因是没有加proc,将子程序的头一行改为getarray proc就解决了。
c 程序不能成功运行,运行到子程序就停止,原因是对某些寄存器进行压栈处理保存现场后忘记出栈恢复现场,恢复现场后就解决了。
d 数据在输入时出现问题,按回车后不换行而是回到本行行首,解决方法是在输入数据回显后在显示换行。
e 在用冒泡法排序时,比较相邻两个数的大小,在需要交换时,才用第三个数作为中转,可以使程序简洁易懂。
f 程序出现问题,出现非法字符,原因在比较一个数后,对si加了2,对于字节变量加1就行,改为加1后问题解决。
3.对比设计要求,对实验结果及完成情况进行说明;实验内容是从键盘上以16进制数的形式输入20个无符号数(0~255),以回车作为一个数输入的结束。
将它们以16进制数的形式在屏幕上按输入顺序显示,并换一行后将它们由大到小排序显示,数之间用空格隔开。
实验结果符合程序设计要求。
4.实验后的体会、感想和建议。
通过本次实验,我锻炼了自己的操作能力并对理论知识有了进一步的理解:a 进一步熟悉、掌握了顺序结构、分支结构、循环结构程序的设计和调试;b 熟悉、掌握了子程序的设计和调试;c熟悉、掌握键盘输入和屏幕输出的中断调用方法和应用;d 了解并掌握了冒泡法排序的主要操作步骤,对数据排序有了进一步的理解;e 进一步学习并运用了单步执行观察寄存器状态以查错的调试方法。