微机原理黄冰版--作业答案 下载本文

CODE ENDS END START

3.25 定义一数组GRADE存放有100个学生某门功课的考试成绩,要求编一程序,统计各分数段的人数,即要求统计90~100分,80~89分,70~79分,60~69分以及60分以下的各有多少人。

DATA SEGMENT

GRADE DB 12,65,77,88,98,23,94,75,85,62 LEN EQU $-GRADE A DB 0 B DB 0 C DB 0 D DB 0 E DB 0 DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ALOOP1: MOV SI,CX DEC SI

CMP GRADE[SI],60

JB GRE ;<60, E+1->E CMP GRADE[SI],70

JB GRD ;<70, D+1->D CMP GRADE[SI],80

JB GRC ;<80, C+1->C CMP GRADE[SI],90

JB GRB ;<90, B+1->B INC A ;>=90, A+1->A JMP GOON GRB: INC B

JMP GOON GRC: INC C

JMP GOON GRD: INC D

JMP GOON GRE: INC E

JMP GOON GOON: LOOP ALOOP1 MOV AH, 4CH INT 21H CODE ENDS END START

3.26 编一程序,在以BUF为首址的字节单元中存放了COUNT个无符号数,找出其中最大数送MAX单元。

DATA SEGMENT

BUF DB 11,23,43,45,67,82,38,48,98,34,67 COUNT EQU $-BUF MAX DB ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,COUNT MOV AL,0 ;AL用力存放最大数,初值为0

ALOOP: MOV SI,CX DEC SI

CMP AL,BUF[SI] ;从后面取数据,与AL比较 JAE GOON

MOV AL,BUF[SI]

GOON: LOOP ALOOP MOV MAX,AL MOV AH, 4CH INT 21H CODE ENDS END START

3.27 利用系统功能调用从键盘输入10个一位无符号数,求出其中最大和最小数,在显示器上输出显示。

DATA SEGMENT

IN_STR DB 'Please Input 10 Num of 0~9:$' MAX_STR DB 0DH,0AH,'MAX Num is:$' MIN_STR DB 0DH,0AH,'MIN Num is:$' MAX DB ? MIN DB ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,IN_STR MOV AH,09H

INT 21H ;提示输入10个数字 IND: MOV AH,01H

INT 21H ;输入一个字符 CMP AL,30H

JB IND ;<30H,ERROR CMP AL,39H

JA IND ;>39H,ERROR SUB AL,30H

MOV MIN,AL ;第一个数初始化MIN MOV MAX,AL ;第一个数初始化MAX MOV CX,3 ALOOP: MOV AH,01H

INT 21H ;输入一个字符 CMP AL,30H

JB ALOOP ;<30H,ERROR CMP AL,39H

JA ALOOP ;>39H,ERROR SUB AL,30H ;ASCII->数 CMP AL,MIN

JB GOMIN ;小于最小数,AL->MIN,输入下一个数 CMP AL,MAX

JA GOMAX ;大于最大数,AL->MAX,输入下一个数 JMP GOON GOMIN: MOV MIN,AL JMP GOON

GOMAX: MOV MAX,AL

GOON: LOOP ALOOP LEA DX,MAX_STR MOV AH,09H

INT 21H ;提示输出最大数 MOV DL,MAX ADD DL,30H MOV AH,02H

INT 21H ;输出最大数 LEA DX,MIN_STR MOV AH,09H

INT 21H ;提示输出最小数 MOV DL,MIN ADD DL,30H MOV AH,02H

INT 21H ;输出最小数 MOV AH, 4CH INT 21H CODE ENDS END START

3.28 利用系统功能调用,完成将键盘输入的小写字母转换成大写字母输出显示,直到输入$字符时,停止输出。

CODE SEGMENT ASSUME CS:CODE START: MOV AH,01H

INT 21H ;输入一个字符 CMP AL,'$'

JE STOP ;'$'符,退出 CMP AL,'a' JB START CMP AL,'z' JA START ;非小写字母,继续输入 SUB AL,20H MOV DL,AL MOV AH,02H INT 21H ;小写字母转换成大写字母输出 JMP START STOP: MOV AH, 4CH INT 21H CODE ENDS END START

3.29 设有一字符串已存放在STRBUF为首址的数据区中,编一程序找出其中的$字符,并将其存放地址送ADRBUF单元中。

DATA SEGMENT

STRBUF DB 'a;sldkfjasldkf$asdf' LEN EQU $-STRBUF ADRBUF DB ? DATA ENDS

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

MOV CX,LEN ;最多查询次数 MOV BX,0

ALOOP: CMP STRBUF[BX],'$'

JZ STOP ;找到,地址送ADRBUF,退出程序 INC BX

LOOP ALOOP STOP: MOV ADRBUF,BL MOV AH, 4CH INT 21H CODE ENDS END START

3.30 用子程序结构编程计算:S=1!+2!+3!+4!+?+8! 修改原有答案结果,SUM2为结果

STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD STACK ENDS

DATA SEGMENT BUFF DB 1,2,3,4,5,6,7,8 SUM DW 0000H SUM2 DW 0 DATA ENDS

CODE SEGMENT

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

MOV SP,OFFSET TOP MOV CH,0 MOV CL,8

MOV SI,OFFSET BUFF LOP1:

MOV AX,OFFSET SUM PUSH AX MOV AH,0 MOV AL, [SI] PUSH AX

CALL FAR PTR FACT MOV DX,SUM ADD SUM2,DX INC SI

LOOP LOP1 MOV AH,4CH INT 21H CODE ENDS

CODES SEGMENT ASSUME CS:CODES FACT PROC FAR PUSH BP MOV BP,SP PUSH BX PUSH AX

MOV BX,[BP+8] MOV AX,[BP+6] CMP AX,0 JE DONE PUSH BX DEC AX PUSH AX CALL FACT MOV BX,[BP+8] MOV AX,[BX]

MUL WORD PTR [BP+6] JMP RETURN

DONE: MOV AX,01H RETURN:MOV [BX],AX POP AX POP BX POP BP