微机原理习题与实验-F 下载本文

例程:

DATA SEGMENT

DATA1 DB 33H,39H,31H,37H,34H DATA2 DB 36H,35H,30H,38H,32H DATA ENDS

STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX

MOV SI,OFFSET DATA2 MOV BX,05

CALL DISPL CALL CRLF

MOV SI,OFFSET DATA1 MOV BX,05 CALL DISPL CALL CRLF

MOV DI,OFFSET DATA2 CALL ADDA MOV SI,OFFSET DATA1 MOV BX,05 CALL DISPL

;第一个数据(作为被加数);第二个数据(作为加数) ;堆栈段

;显示被加数

;显示加数

;加法运算 ;显示结果

CALL CRLF

MOV AX,4C00H INT 21H

DISPL PROC NEAR ;显示子功能 DSI: MOV AH,02

MOV DL,[SI+BX-1] ;显示字符串中一字符 INT 21H

DEC BX ;修改偏移量 JNZ DSI RET DISPL ENDP

ADDA PROC NEAR MOV DX,SI MOV BP,DI MOV BX,05

AD1: SUB BYTE PTR[SI+BX-1],30H SUB BYTE PTR[DI+BX-1],30H ;将ASCII 码表示 DEC BX ;的数字串转化串 JNZ AD1 ;为十六进制的数字 MOV SI,DX MOV DI,BP

MOV CX,05 ;包括进位,共5位 CLC ;清进单位 AD2: MOV AL,[SI] MOV BL,[DI]

ADC AL,BL ;带进位相加 AAA ;非组合BCD码的加法调整 MOV [SI],AL ;结果送被加数区 INC SI

INC DI ;指向下一位 LOOP AD2 ;循环 MOV SI,DX MOV DI,BP MOV BX,05

AD3: ADD BYTE PTR [SI+BX-1],30H ADD BYTE PTR [DI+BX-1],30H DEC BX ;十六进制的数字串转 JNZ AD3 ;化ASCII码表示的数字串 RET ADDA ENDP

CRLF PROC NEAR ;建立宏指令 MOV DL,0DH MOV DL,02H INT 21H

MOV DL,0AH MOV AH,02H INT 21H RET CRLF ENDP CODE ENDS END START

实验9 学生成绩名次表

一、实验目的

进一步熟悉排序方法。

掌握多重循环程序设计的方法。

二、实验内容

根据提示将0~100之间的10个成绩存入首址为1000H的单元,1000H+i表示学号为i的学生成绩,编写程序能在2000H开始的区域排出名次表,2000H+i为学号i的学生的名次,并将其显示在屏幕上。

三、实验步骤同实验1

程序框图

开始初始化入口CX入栈保存显示提示信息学生数送CXSI指向成绩表首址AL送0分学生数送CXBX和SI指向成绩表首址调GETNUM,读成绩送[SI]AL>=[SI]SI+1NCX-1=0YSI+1学生数送CXDI指向名次表首址Y将本次扫描的最高成绩清0调SCAN子程序,扫描成绩表CX出栈计算名次,填入DX学号对应的名次单元NCX-1=0Y显示学生名次返回DOS返回NCX-1=0N[SI]送AL,DX记录对应学号Y

例程:

CRLF MACRO

MOV AH,02H MOV DL,0DH INT 21H

MOV AH,02H MOV DL,0AH INT 21H ENDM

DATA SEGMENT STUNUM EQU 10

MESS1 DB 'INPUT 10 STUDENTS SCORE',0DH,0AH,'$' ERROR DB 'INPUT ERROR!',0DH,0AH,'$' ORG 1000H