资源描述
青 岛 理 工 大 学
课程实验报告
课程名称
汇编语言程序设计
班级
计算112
实验日期
2013.10.23
姓名
任师锋
学号
201107063
实验成绩
实验名称
子程序
实
验
目
的
及
要
求
1、 掌握子程序设计相关指令和伪指令的使用方法
2、掌握子程序设计方法,特别是参数传递方法
3、掌握主程序和子程序之间的调用关系和调用方法
4、熟悉循环和子程序结合应用解答问题的思路
实
验
环
境
平台:win7 64位
命令行方式
工具:MASM.EXE LINK.EXE DEBUG.EXE
DOSBOX(一款软件,模拟dos环境)
实
验
内
容
1、设DATA1开始的内存单元中,存放着一串带符号字数据,要求采用冒泡排序算法(Bubble Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。然后在显示器输出排好序的数据,中间用’,’隔开。
2、输出数据使用子程序方式。
算
法
描
述
及
实
验
步
骤
实验步骤:
根据流程图写源程序。
1, 打开DOSBOX编译连接源程序。
2, 找语法错误,若有则重复2.
Debug调试找逻辑错误,若有则重复1.
显示功能算法流程图标书:
冒泡排序算法流程图:
调
试
过
程
及
实
验
结
果
调试数据1:
1000 , 55 ,-2 ,100,200,99,30,-5,49,5
排序结果:
调试数据2:
46 ,32 ,-22 ,100,20,99,35,-5,46,12,3,4,56,23,424,2345,2435,5
调试数据3:
9,4,3,22,4,5,23,13,2,34,23,34,43,13,5
排序结果:
调试数据4:
100,0,89,12,78,23,78,45,78,56,10,23,2345,234,5
排序结果:
不足之处:对于超过一万的数据得不到正确的排序结果。原因还是在于算法的设计上,使用的寄存器单一的结果
总
结
刚开始感觉子程序很简单,于是就信誓旦旦的开始做老师给的题目中最难的那个题目,可是,只有做的时候才是知道自己碰上了一个大钉子,并没有那么简单,需要做的事情真的是太多太繁杂了,什么保存中间结果什么的,把我的头搞的大大的。虽然之后也在这个问题上话了很长的时间,但仍然是一想需要保存那保存这,头就又开始变大了。于是,我就退而求其次,做少简单的那个。没想到,还真是简单。短短半个小时就搞定了,顺便也把实验报告写了。
经过这次实验,我也明白了,其实我对于递归并没有深刻的理解。
以后应该多做点这方面的题目。
附
录
SSEG SEGMENT STACK
STD DB 200 DUP (0)
SSEG ENDS
DSEG SEGMENT
DATA DW 1000 , 55 ,-2 ,100,200,99,30,-5,49
DATAEND DW 5
ENDX DW 0 ;存放末地址
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
ASSUME SS:DSEG
;------------
;程序名称:bubble
;程序功能:冒泡排序
;程序入口:si 存放数据串的首地址
; ENDX存放数据串的末地址
;程序出口:
;受影响的寄存器 di,si,ax
BUBBLE PROC NEAR
OUT : CMP SI , [ENDX]
JA TORET
MOV DI ,SI
IN : CMP DI , [ENDX]
JA BREAK ;如果di指针值大于末地址值,退出内存循环
MOV AX , [SI] ;暂时存储si 指向的内存单元的值
CMP AX , [DI]
JLE INFOR
XCHG AX , [DI]
MOV [SI] , AX
INFOR : INC DI
INC DI
JMP IN
BREAK : INC SI
INC SI
JMP OUT
TORET : RET
BUBBLE ENDP
;--------------------------
;程序名称:display
;程序功能:在屏幕上输出存放在data单元的数据串
;程序入口:si 存放数据串首地址,di存放数据串末地址
;程序出口:
;受影响的寄存器:si ,di ax bx dx sp 标志寄存器
;--------------------------
DISPLAY PROC NEAR
MOV AX ,DSEG
MOV DS ,AX
MOV AX ,SSEG
MOV SS ,AX
MOV SP ,SIZE STD ;堆栈指针
MOV SI , OFFSET DATA ;数据串的首地址
DISP : CMP SI , OFFSET DATAEND
JA TOEND
MOV BX , [SI]
AND BX ,BX
JNS FNEGT
MOV DL , '-' ;负数先输出符号‘-’
MOV AH , 02H
INT 21H
NEG BX ; 负数取反变成正数
FNEGT : MOV AX , BX ;AX 保存BX的副本
MOV BL , 10 ;此处应该是bl否则会出现错误
DIV BL ;除以10,商在AL中,余数在AH中
AND AL , AL
JZ DIS ;如果AL中是0
ADD AH , 48
MOV BH , AH
AND BL , 0
PUSH BX
MOV BL , AL
AND BH , 0 ;把商保存
JMP FNEGT
DIS : ADD AH , 48
MOV BH , AH
AND BL, 0
PUSH BX
;开始输出
SHUCHU : CMP SP , SIZE STD
JAE NEXT
POP AX ;把堆栈中的第一个数放到AX中
MOV DL , AH
MOV AH , 02H
INT 21H
JMP SHUCHU
NEXT :
CMP SI , OFFSET DATAEND
JZ TIAOGUO
MOV DL , ','
MOV AH , 02H
INT 21H
TIAOGUO : INC SI ;指针加1 ,跳转
INC SI
JMP DISP
TOEND : MOV AX , 4C00H
INT 21H
DISPLAY ENDP
MAIN : MOV AX , DSEG
MOV DS , AX
MOV AX , SSEG
MOV SS , AX
MOV SP , SIZE STD
LEA SI , DATA
LEA DI , DATAEND
MOV [ENDX] , DI
CALL BUBBLE
CALL DISPLAY
MOV AX , 4C00H
INT 21H
CSEG ENDS
END MAIN
7
展开阅读全文