汇编实验 子程序结构和设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称汇编语言程序设计
实验项目实验三、子程序结构和设计实验仪器微机系统、汇编调试环境
系别计算机科学与技术
专业计算机科学与技术
班级/学号计科1103/2011011111 学生姓名房皓
实验日期2013-6-2
成绩
指导教师胡信裕
实验三子程序结构和设计
一、实验目的
1.进一步熟悉、掌握顺序结构、分支结构、循环结构程序设计和调试。
2.熟悉、掌握子程序设计和调试;
3.熟悉、掌握键盘输入和屏幕输出的中断调用方法和应用。
二、实验要求
1.Windows操作系统并具有命令提示符操作界面的计算机,且系统内安装有汇编语言编
程环境。
2.在开始本实验之前,复习教科书的相关内容,并预先写出相应的源程序。
3.通过汇编IDE上机调试,注意观察,并记录下现象。
三、实验内容
功能要求:从键盘上以16进制数的形式输入20个无符号数(0~255),以回车作为一个数输入的结束。
将它们以16进制数的形式在屏幕上按输入顺序显示,并换一行后将它们由大到小排序显示,数之间用空格隔开。
【可键入任意字符,但只对十六进制数处理显示】。
1.运用文本编辑器编辑实验源程序(EXP3.asm);
实验程序设计如下:
Data segment
array db20dup(?)
mess1 db0dh,0ah,'PRE_Enter:',0dh,0ah,'$'
mess2 db0dh,0ah,'SORTED:',0dh,0ah,'$'
;a_len equ ($-array)/2
Data ends
Code segment
Assume ds:data,cs:code
Main proc far
start: mov ax,data
mov ds,ax
call getarray ;调用getarray子程序
mov ah,9;显示提示信息mess1:
mov dx,offset mess1
int21h
call output ;调用output子程序,输出排序前的序列
call disp0d0a ;调用disp0d0a子程序,输出回车换行
call disp0d0a
call sort ;调用sort子程序,由大到小排序
mov ah,9;显示提示信息mess2:
mov dx,offset mess2
int21h
call output ;调用output子程序,输出排序后的序列
int21h
disp0d0a proc;子程序disp0d0a,输出回车换行push ax
push dx
mov dl,0dh
mov ah,2
int21h
mov dl,0ah
mov ah,2
int21h
pop dx
pop ax
ret
disp0d0a endp
getarray proc;子程序getarray,输入20个数据push di;保护现场
push ax
mov di,0
mov cx,20;循环20次
lop1:
mov bx,0
mov ax,0
r_key: mov ah,1
int21h;输入一个字符
cmp al,0dh;比较是否是回车
jz set ;回车则转至set
cmp al,'0';对输入字符进行处理
jl r_key
cmp al,'9'
jle d0_9
cmp al,'A'
jl r_key
cmp al,'F'
jle da_f
cmp al,'a'
jl r_key
cmp al,'f'
jle da__f
jmp r_key
d0_9: ;处理0~9,变成十进制
sub al,30h
da_f: ;处理a~f,变成十进制sub al,37h
jmp add_to
da__f: ;处理a~f,变成十进制sub al,57h
jmp add_to
add_to: ;累加
shl bx,4;bx逻辑左移4位
mov ah,0
add bx,ax;全都累加在bx中
jmp r_key
set:
mov array[di],bl;存入数据
inc di
mov ah,2
;mov dl,0dh
;int 21h
mov dl,0ah
int21h;回车换行
;mov dl,bl
;add al,30h
;mov dh,0
;int 21h
loop lop1
pop di;恢复
pop ax
ret
getarray endp
output proc;子程序output,输出数据push di
push dx
mov dx,0
mov di,0
mov cx,20
lop2: mov bl,array[di] ;将已输入的数据送入bx mov dl,bl
shr dl,4;高位
;add dl,37h
;and dl,0fh
;add dl,30h
jbe d_9
cmp dl,0fh
jbe d_f
disp1: mov ah,2
int21h;显示高位
mov dl,bl
and dl,0fh;低位
;add dl,37h
cmp dl,09h
jbe d_9_1
cmp dl,0fh
jbe d_f_1
disp2: mov ah,2
int21h;显示低位
inc di
mov dl,20h
mov ah,2
int21h;输出空格
loop lop2
pop dx
pop di
jmp back
d_9: add dl,30h;处理高位0~9 jmp disp1
d_f: add dl,37h;处理高位a~f jmp disp1
d_9_1: add dl,30h;处理低位0~9 jmp disp2
d_f_1: add dl,37h;处理低位0~9 jmp disp2
back: ret
output endp
sort proc
push bx
push cx
push si
push ax
mov ax,0
mov bx,0
lp1: mov bx,1;设置标志bx=1 mov cx,20;设置循环次数cx=20
dec cx
;;mov si,offset array
lp2: mov al,array[si] ;取数据
;mov dx,ax
cmp 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=0
con: inc si
loop lp2
cmp bx,1
jz backto
jmp lp1
backto: pop ax
pop si
pop cx
pop bx
ret
sort endp
Main endp
Code ends
End main
2.在IDE操作环境下,对源程序(EXP
3.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 进一步学习并运用了单步执行观察寄存器状态以查错的调试方法。