2014微机原理实验题目及答案

更新时间:2024-06-08 23:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微机原理实验

1. 验收要求

(1)对于一个编辑好的任一汇编语言源程序,会进行编译和连接,最终生成

一个可执行程序。(DOS环境运行)

(2)对三个给定的题目进行验收。(在给出的仿真环境编辑和运行) 2. 题目 (1)排序

对输入的多个数字进行排序。 要求:

(a)所有数字从键盘输入;

(b)数字中至少包含一个大于10的数字; (c)排好序的数字以十进制形式在屏幕显示输出。 答案:

DATA SEGMENT

STRING1 DB 'Please Input the number: ','$' ;提示输入 STRING2 DB 'The order from max to min:','$' ;输出排序从大到小

SCORE DW 100 DUP(0) ;分配存放空间

DATA ENDS

STACK SEGMENT ;堆栈段 DW 64 DUP(0) STACK ENDS

CODE SEGMENT ;代码段

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

MOV AX,STACK MOV SS,AX

MOV DX,OFFSET STRING1 ;显示提示输入 MOV AH,09H INT 21H

XOR BX,BX ;寄存器清零 XOR CX,CX XOR SI,SI XOR DI,DI

INPUT: MOV AH,1 ;输入一个字符 INT 21H

CMP AL,0DH ;是否为回车键 JZ OVER ;是就跳到OVER CMP AL,20H ;是否为空格 JZ SAVE ;是就跳到SAVE SUB AL,30H ;变为真数 MOV CL,4

SHL BX,CL ;左移四位,变为BCD码 ADD BL,AL JMP INPUT

SAVE: MOV SCORE[SI],BX ;保存到SCORE中 ADD SI,2 INC DI XOR BX,BX JMP INPUT

OVER: MOV SCORE[SI],BX ;保存最后一个数据,并存放到SCORE中 INC DI MOV DL,0AH MOV AH,02H

INT 21H MOV CX,DI DEC CX XOR BX,BX

COMP1: MOV SI,2 ;指向下一个数 MOV DX,CX

COMP2: MOV AX,SCORE[BX]

CMP AX,SCORE[BX+SI] ;比较前后两个数 JNC COMP3 ;小于就跳到COMP3 XCHG AX,SCORE[BX+SI] ;交换位置 MOV SCORE[BX],AX

COMP3: ADD SI,2 ;指向下一个数 DEC DX JNZ COMP2

ADD BX,2 ;指向下一个数 LOOP COMP1

MOV DX,OFFSET STRING2 MOV AH,09H INT 21H

SUB SI,SI ;把SI清零

OUT_PUT:

MOV BX,SCORE[SI] ;输出百位数 MOV DL,BH AND DL,0FH ADD DL,30H MOV AH,02H INT 21H

MOV DL,BL ;输出十位数

MOV CL,4 SHR DL,CL ADD DL,30H MOV AH,02H INT 21H

MOV DL,BL ;输出个位数 AND DL,0FH ADD DL,30H MOV AH,02H INT 21H

MOV DL,20H ;输出空格 MOV AH,02H INT 21H ADD SI,2 DEC DI

JNZ OUT_PUT

MOV AH,4CH ;返回DOS INT 21H

CODE ENDS END START (2)数制转换

将输入的一个数据以不同进制形式输出。 要求:

(a)所有数字从键盘输入;

(b)输入数据为任意一个小于十万的十进制数据;

(c)将所输入数据以十六进制在屏幕显示输出(即十进制转十六进制)。 答案:

DATA SEGMENT KEYBUFFER DB 100 DB ?

DB 100 DUP(?)

STRING1 DB \DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX

LEA DX,STRING1 ;显示提示输出 MOV AH,09H INT 21H MOV AH,0AH LEA DX,KEYBUFFER INT 21H

LEA SI,KEYBUFFER+1 CALL TRANS10TO16 CALL DISPCR CALL DISPAX CALL DISPCR MOV AX,BX CALL DISPAX MOV AH,4CH INT 21H

DISPAL PROC NEAR PUSH AX PUSH CX PUSH DX PUSH AX

MOV CL,4 ;处理高位十六进制数 SHR AL,CL

CALL CHANG ;十六进制数变换成ASCII码 MOV AH,02 MOV DL,AL INT 21H POP AX

AND AL,0FH ;处理低位十六进制数 CALL CHANG ;同上解释 MOV AH,02 MOV DL,AL INT 21H POP DX POP CX POP AX RET

DISPAL ENDP

CHANG PROC NEAR ;数码转换 CMP AL,10 JNGE CHANG1 ADD AL,7 CHANG1: ADD AL,30H RET

CHANG ENDP DISPAX PROC NEAR XCHG AL,AH CALL DISPAL XCHG AH,AL CALL DISPAL RET

DISPAX ENDP DISPCR PROC NEAR PUSH AX PUSH DX MOV AH,2

MOV DL,0AH INT 21H MOV AH,2 MOV DL,0DH INT 21H POP DX POP AX RET

DISPCR ENDP

TRANS10TO16 PROC NEAR PUSH CX PUSH DX PUSH SI XOR AX,AX XOR CX,CX MOV CL,[SI] INC SI MOV AL,[SI] INC SI SUB AL,30H DEC CX JCXZ TRANSF2 MOV BX,10 TRANSF1: MUL BX JC TRANSF_ERR MOV DL,[SI] INC SI SUB DL,30H ADD AL,DL ADC AH,0 JC TRANSF_ERR LOOP TRANSF1

MOV BX,0 TRANSF2: JMP TRANSF_OK TRANSF_ERR: MOV BX,-1 TRANSF_OK: POP SI POP DX POP CX RET

TRANS10TO16 ENDP CODE ENDS END START

(3)成绩汇总

对输入的一些成绩进行分类汇总。 要求:

(a)所有数字由键盘输入;

(b)输入的成绩个数为任意个(小于100); (c)对成绩进行归类并输出显示在屏幕:

·显示最高成绩、最低成绩、平均成绩

·显示90-100分人数,80-89分人数,70-79分人数,60-69分人数,低于60分人数,

·显示无效数字个数(非数字或大于100数字个数) 答案:

DATA SEGMENT

STRING1 DB 'Please Input Score:','$' ;提示输入 STRMA DB 'THE MAX SCORE IS: ','$' STRMI DB 'THE MIN SCORE IS: ','$' STRAV DB 'THE AVERAGE SCORE IS:','$' STR1 DB 'THE NUM OF 0-59:','$'

STR2 DB 'THE NUM OF 60-69: ','$' STR3 DB 'THE NUM OF 70-79: ','$' STR4 DB 'THE NUM OF 80-89: ','$' STR5 DB 'THE NUM OF 90-100: ','$' STR6 DB 'THE WRONG NUM:','$' ;输出排序从大到小

SCORE DW 60 DUP(0) ;分配存放空间 DECIMAL DB 5 DUP(0) S5 DW 0 ;定义变量 S6 DW 0 S7 DW 0 S8 DW 0 S9 DW 0 S10 DW 0 DATA ENDS

STACK SEGMENT ;堆栈段 DW 64 DUP(0) TOP LABEL WORD STACK ENDS

CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START:

MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX LEA SP,TOP

MOV DX,OFFSET STRING1 ;显示提示输入 MOV AH,09H INT 21H

XOR BX,BX ;寄存器清零

XOR CX,CX XOR SI,SI XOR DI,DI

INPUT: MOV AH,1 ;输入一个字符 INT 21H

CMP AL,0DH ;是否为回车键 JZ OVER ;是就跳到OVER CMP AL,39H

JG ERR_COUNT ;判断是否为0-9的数 CMP AL,20H ;是否为空格 JZ SAVE

SUB AL,30H ;变为真数 MOV CL,4

SHL BX,CL ;左移四位,变为BCD码 ADD BL,AL CMP BX,100H JG ERR_COUNT

JMP INPUT

ERR_COUNT: INC S10 MOV BX,0 JMP INPUT

SAVE:

MOV SCORE[SI],BX ;保存到SCORE中

ADD SI,2 INC DI XOR BX,BX JMP INPUT

OVER: MOV SCORE[SI],BX ;保存最后一个数据,并存放到

SCORE中

INC DI MOV DL,0AH MOV AH,02H INT 21H MOV CX,DI DEC CX

PUSH DI ;弹出输入个数*********** PUSH DI PUSH DI XOR BX,BX

COMP1: MOV SI,2 ;指向下一个数 MOV DX,CX

COMP2: MOV AX,SCORE[BX]

CMP AX,SCORE[BX+SI] ;比较前后两个数 JNC COMP3 ;小于就跳到COMP3 XCHG AX,SCORE[BX+SI] ;交换位置 MOV SCORE[BX],AX

COMP3: ADD SI,2 ;指向下一个数 DEC DX JNZ COMP2

ADD BX,2 ;指向下一个数 LOOP COMP1

SUB SI,SI ;把SI清零 OUT_PUT:

LEA DX,STRMA ;输出有效最大值 MOV AH,9 INT 21H

MOV BX,SCORE

;输出百位数 MOV DL,BH AND DL,0FH ADD DL,30H MOV AH,02H INT 21H

MOV DL,BL ;输出十位数 MOV CL,4 SHR DL,CL ADD DL,30H MOV AH,02H INT 21H

MOV DL,BL ;输出个位数 AND DL,0FH ADD DL,30H MOV AH,02H INT 21H

CALL DISPCR

LEA DX,STRMI ;输出最小有效值 MOV AH,9

INT 21H POP DI DEC DI

SUB DI,S10 SHL DI,1

MOV BX,SCORE[DI] ;输出百位数 MOV DL,BH AND DL,0FH ADD DL,30H MOV AH,02H INT 21H

MOV DL,BL ;输出十位数 MOV CL,4 SHR DL,CL ADD DL,30H MOV AH,02H INT 21H

MOV DL,BL ;输出个位数 AND DL,0FH ADD DL,30H MOV AH,02H INT 21H

;************输出平均成绩******************** CALL DISPCR LEA DX,STRAV MOV AH,9 INT 21H POP DI LEA AX,SCORE

PUSH AX

CALL COMPUTMEAN POP AX

CALL DISPAX ;显示Ax内容

;************************************************* POP DI MOV CX,DI

SUB CX,S10 ;设置计数器为DI LEA BX,SCORE

COMPARE: MOV AX,[BX]

CMP AX,60H ;与60比较 JL FIVE ;小于就跳到FIVE CMP AX,70H ;与70比较 JL SIX ;小于就跳到SIX CMP AX,80H ;与80比较 JL SEVEN ;小于就跳到SEVEN CMP AX,90H ;与90比较 JL EIGHT ;小于就跳到EIGHT CMP AX,100H ;与100比较 JLE NINE ;不为0就是90到100

JMP NEWDATA ;跳到NEWDATA

FIVE: INC S5 ;小于60时【S5+1】 JMP NEWDATA ;跳到NEWDATA

SIX: INC S6 ;大于等于60小于70时【S6+1】

JMP NEWDATA ;跳到NEWDATA

SEVEN: INC S7 ;大于等于70小于80时【S7+1】 JMP NEWDATA ;跳到NEWDATA

EIGHT: INC S8 ;大于等于80小于90时【S8+1】 JMP NEWDATA ;跳到NEWDATA

NINE: INC S9 ;大于等于90小于等于100时【S9+1】

NEWDATA: ADD BX,2 LOOP COMPARE

CALL DISPCR LEA DX,STR1 MOV AH,09H INT 21H MOV AX,S5 CALL DISPAXD

CALL DISPCR LEA DX,STR2 MOV AH,09H INT 21H MOV AX,S6 CALL DISPAXD

CALL DISPCR LEA DX,STR3 MOV AH,09H INT 21H MOV AX,S7 CALL DISPAXD

CALL DISPCR LEA DX,STR4 MOV AH,09H

;取下个数 ;循环COMPARE

INT 21H MOV AX,S8 CALL DISPAXD

CALL DISPCR LEA DX,STR5 MOV AH,09H INT 21H MOV AX,S9 CALL DISPAXD

CALL DISPCR LEA DX,STR6 MOV AH,09H INT 21H MOV AX,S10 CALL DISPAXD

MOV AH,4CH ;返回DOS INT 21H

; 将16位二进制数(AX)转化成十进制数并显示在频幕上 ; 入口参数:AX,出口参数:屏幕显示 DISPAXD PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI

LEA DI,DECIMAL ;注意在数据段定义DECIMAL空间(5字节) CALL TRANS16TO10 MOV CX,5

LEA DI,DECIMAL+4 MOV AH,2 DISPAXD2: MOV DL,[DI] ADD DL,30H DEC DI INT 21H LOOP DISPAXD2 POP DI POP DX POP CX POP BX POP AX RET

DISPAXD ENDP

;将16位二进制数(CX)转化成十进制数并保存在指定缓冲区中 ;入口参数:AX(待转换的数据),DI(转换结果存储区域的首地址),

出口参数:存储区域的内容

TRANS16TO10 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV BX,10 MOV CX,5 TRANS1: XOR DX,DX DIV BX MOV [DI],DL INC DI LOOP TRANS1

POP DI POP DX POP CX POP BX POP AX RET

TRANS16TO10 ENDP

DISPCR PROC NEAR PUSH AX PUSH DX MOV AH,2 MOV DL,0AH INT 21H MOV AH,2 MOV DL,0DH INT 21H POP DX POP AX RET

DISPCR ENDP

;显示AL,AX寄存器内容的子程序 DISPAL PROC NEAR PUSH AX PUSH CX PUSH DX PUSH AX

MOV CL,4 ;处理高位十六进制数 SHR AL,CL

CALL CHANG ;十六进制数变换成ASCII码 MOV AH,02 MOV DL,AL INT 21H

POP AX

AND AL,0FH ;处理低位十六进制数 CALL CHANG ;同上解释 MOV AH,02 MOV DL,AL INT 21H POP DX POP CX POP AX RET

DISPAL ENDP

CHANG PROC NEAR ;数码转换 CMP AL,10 JNGE CHANG1 ADD AL,7 CHANG1: ADD AL,30H RET

CHANG ENDP DISPAX PROC NEAR XCHG AL,AH CALL DISPAL XCHG AH,AL CALL DISPAL RET

DISPAX ENDP

COMPUTMEAN PROC NEAR PUSH BP MOV BP,SP PUSH SI PUSH DI PUSH AX PUSH BX

PUSH CX PUSH DX

MOV SI,[BP+4] ;数据区首地址 XOR DX,DX XOR BX,BX SUB DI,S10 MOV CX,DI XOR DI,DI PUSH CX CPTM1: MOV AX,[SI] ADD SI,2 CWD ADD BX,AX DAA ADC DI,DX DAA LOOP CPTM1 MOV DX,DI MOV AX,BX POP BX IDIV BX CPTM2: MOV [BP+4],AX POP DX POP CX POP BX POP AX POP DI POP SI POP BP RET

COMPUTMEAN ENDP

CODE ENDS END START

本文来源:https://www.bwwdw.com/article/7hx6.html

Top