北邮微机原理软件实验报告(5)

2019-03-28 10:43

XOR CX,CX ;CX清零 MOV AH,30H ;赋学号第一位的AscII码 \ MOV DH,31H ;赋学号第二位的AscII码 \ LEA BX,BUFFER+2 ;BX指向第一个成绩数据 CALL CHECK CMP FLA,1 ;输入错误则重新输入 JZ INPUT CALL COM MOV AH,02H ;输出回车及换行 MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H CALL DISPY MOV AX,4C00H INT 21H

CHECK PROC

NEXT: MOV FLA,0 MOV [DI],AH ;将学号第一位的AscII码存入指定内存区域 MOV [DI+1],DH ;将学号第二位的AscII码存入指定内存区域 INC DI INC DI ;指向下一个 CMP DH,39H ;十进制转换 JZ DECA INC DH ;学号+1 JMP NEXT1 DECA: MOV DH,30H ;满十进一 INC AH

NEXT1: MOV AL,[BX] ;检查分数的AscII码 CMP AL,30H ;若小于30h(“0”),则报错 JB ERROR CMP AL,39H ;若大于39h(“9”),则报错 JA ERROR MOV [DI],AL ;若正确,则存储 INC DI ;查下一个数 INC BX

MOV AL,[BX] CMP AL,30H ;检查第二位的AscII码 JB ERROR CMP AL,39H JA ERROR MOV [DI],AL ;若正确,则存储

INC DI INC BX INC CX ;已存个数+1 MOV AL,[BX] ;判断是否为回车符 CMP AL,0DH JZ FINISH1 ;是回车 则回主程序 转入冒泡排序 CMP AL,20H ;判断是否为空格 JNZ ERROR ;不是则报错 INC BX ;是 则BX+1后继续检查 JMP NEXT ERROR: MOV AH,09H ;报错 MOV DX,SEG STR2 MOV DS,DX MOV DX,OFFSET STR2 INT 21H MOV FLA,1 FINISH1:RET

CHECK ENDP

COM PROC

COMP1: PUSH CX ;保存现场 MOV VAR1,CX ;先通过运算得到两个需要的常量 VAR1为数据组数 SHL CX,1 SHL CX,1 ;乘以4为数据总字节数 SUB CX,4 MOV VAR2,CX POP CX ;恢复现场 DEC DI

DEC DI ;DI指向最后一个分数的十位的AscII码 JMP COTI

COMP2: ADD DI,VAR2 ;比较完一轮后,使DI指向最后一个分数的十位的AscII码

COTI: MOV BL,0 ;建立标志 MOV CX,VAR1 DEC CX ;比较次数 AGAN: MOV AL,[DI] CMP AL,[DI-4] JA CHAN1 ;大于,则交换 JB COTI2 MOV AL,[DI+1] ;十位相同 比较个位 CMP AL,[DI-3] JA CHAN1 JBE COTI2

CHAN1: MOV BL,1 ;若要交换,修改标志, PUSH CX MOV CX,4 DEC DI

DEC DI ;使DI指向该分数对应的学号的第一位的AscII码 CHAN2: MOV AL,[DI] ;交换 XCHG AL,[DI-4] MOV [DI],AL INC DI LOOP CHAN2 POP CX DEC DI DEC DI 码

COTI2: DEC DI DEC DI DEC DI

DEC DI 便进行下次比较 LOOP AGAN CMP BL,0 JNZ COMP2 DEC DI DEC DI MOV CX,VAR1 MOV BH,30H MOV BL,31H RET

COM ENDP

DISPY PROC

DISPY1: MOV DL,BH MOV AH,02H INT 21H MOV DL,BL

MOV AH,02H INT 21H

MOV DL,20H MOV AH,02H INT 21H

MOV DL,[DI] MOV AH,02H INT 21H INC DI

;修改DI,使DI指向高地址分数的十位的AscII ;修改DI,使DI指向高分数的十位的AscII码,以 ;若标志没被修改,则排序完成 ;修改DI,使DI指向最高分对应的学号 ;显示次数 ;名次 十位AscII码 ;名次 个位AscII码 ;先输出名次 ;输出空格 ;再输出学号 MOV DL,[DI] MOV AH,02H INT 21H INC DI

MOV DL,20H MOV AH,02H INT 21H MOV DL,[DI] ;输出空格

;输出分数

MOV AH,02H INT 21H INC DI MOV DL,[DI] MOV AH,02H INT 21H INC DI

MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H CMP BL,39H JZ DECA2 INC BL JMP NEXT2

DECA2: MOV BL,30H INC BH NEXT2: LOOP DISPY1 RET DISPY ENDP CODE ENDS END START

四、程序流程图

;回车并换行,准备下一轮输出

检错 输出显示

五、程序运行结果

开始 初始化 显示提示 输入成绩 调用检错子程序 否 输入是否正确 是 调用比较子程序 比较 调用显示子程序 结束

六、预习题

1.如何确定一个学生在这门科目中的名次? 答:利用排序,看最后这个学生的位置

2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单? 答:冒泡排序 七、心得体会

通过这次试验学会了子程序的使用,可以对子程序重复利用简便了程序的编译,使得编写简便了许多。在编写过程中发现PUSHF及POPF的用处显得尤为重要,对冒泡排序的正确性起了决定性作用。并且学会了如何使用指针。完成这次实验后我觉得学习过的各种编程,不管是C++还是数据结构或者汇编都是相互贯通的。


北邮微机原理软件实验报告(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:邯郸会计继续教育2017

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: