1、青 岛 理 工 大 学 课程实验报告 课程名称 汇编语言程序设计 班级 计算112 实验日期 2013.10.23 姓名 任师锋 学号 201107063 实验成绩 实验名称 子程序 实 验 目 的 及 要 求 1、 掌握子程序设计相关指令和伪指令的使用方法 2、掌握子程序设计方法,特别是参数传递方法 3、掌握主程序和子程序之间的调用关系和调用方法 4、熟悉循环和子程序结合应用解答问题的思路 实 验 环 境 平台:win7 64位 命令行方式 工具:MASM.EXE LINK.EXE DEBUG.EXE
2、 DOSBOX(一款软件,模拟dos环境) 实 验 内 容 1、设DATA1开始的内存单元中,存放着一串带符号字数据,要求采用冒泡排序算法(Bubble Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。然后在显示器输出排好序的数据,中间用’,’隔开。 2、输出数据使用子程序方式。 算 法 描 述 及 实 验 步 骤 实验步骤: 根据流程图写源程序。 1, 打开DOSBOX编译连接源程序。 2, 找语法错误,若有则重复2. Debug调试找逻辑错误,若有则重复1. 显示功能算法流程图标书:
3、冒泡排序算法流程图: 调 试 过 程 及 实 验 结 果 调试数据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 排序结果: 不足之处:对于超过
4、一万的数据得不到正确的排序结果。原因还是在于算法的设计上,使用的寄存器单一的结果 总 结 刚开始感觉子程序很简单,于是就信誓旦旦的开始做老师给的题目中最难的那个题目,可是,只有做的时候才是知道自己碰上了一个大钉子,并没有那么简单,需要做的事情真的是太多太繁杂了,什么保存中间结果什么的,把我的头搞的大大的。虽然之后也在这个问题上话了很长的时间,但仍然是一想需要保存那保存这,头就又开始变大了。于是,我就退而求其次,做少简单的那个。没想到,还真是简单。短短半个小时就搞定了,顺便也把实验报告写了。 经过这次实验,我也明白了,其实我对于递归并没有深刻的理解。 以后应该多做点这方面的
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 存放数据串的首地址 ;
6、 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 BR
7、EAK : 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
8、 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 : MO
9、V 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
10、 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 IN
11、T 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






