题目要求
已知ASSEMBLY数组存放的是按照学号从1到10的学生汇编成绩。
现在要求从键盘上输入一个学生的学号,然后显示该生对应的汇编成绩。
输入不存在的学号要有报错提示。
运行截图
编程平台
Masm for Windows 集成实验环境 2012.5
代码实现
DATAS SEGMENT
ASSEMBLY DB 10,20,30,40,50,60,70,80,90,100;学号从1到10的学生汇编成绩
input DB 'Enter the student id: $'
result DB 'The assembly score is: $'
error DB 'The student id does not exist!$'
DATAS ENDS
STACKS SEGMENT STACK
DB 200H DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC
MOV AX,DATAS
MOV DS,AX
LEA DX,input;输入提示
MOV AH,9H
INT 21H
MOV BX,0;BX存放输入的数值
i:
MOV AH,1H
INT 21H
CMP AL,0DH;输入回车则停止输入
JE s
CALL SUBP1;将输入的数字样式不变地放在十六进制中
MOV AH,0
MOV DX,AX;DX存放当前输入的字符
MOV CL,4
SHL BX,CL;BX每次左移4位
ADD BX,DX;(BX)=(BX)+(DX)
JMP i
s:
CMP BX,1H
JB err
CMP BX,10H
JG err
JE special;输入的数字为10
CMP BX,9H
JG err
DEC BX;此时确定输入的值在1~9之间,由于偏移地址从0开始,故BX自减
JMP output
special:
SUB BX,7;十进制的10对应的是十六进制的A
output:
LEA DX,result;输出提示
MOV AH,9H
INT 21H
MOV AL,[BX]
MOV AH,0
CALL SUBP2;用十进制形式输出数值
JMP finish
err:
LEA DX,error;错误提示
MOV AH,9H
INT 21H
finish:
MOV AH,4CH
INT 21H
MAIN ENDP
;子程序
;功能:让十进制数字样式不变地放在十六进制中,如将10D变成10H。
;入口参数:AL存放输入的数字。
SUBP1 PROC
;判断是否为数字
CMP AL,30H
JB stop
CMP AL,39H
JG stop
SUB AL,30H
stop:
RET
SUBP1 ENDP
;子程序
;功能:用十进制形式输出数值。
;入口参数:AX存放要输出的数值。
SUBP2 PROC
MOV BX,10
MOV SI,0;记录要输出的位数
lop1:
MOV DX,0
DIV BX
PUSH DX;余数入栈
INC SI
CMP AX,0;也可以写成OR AX,AX
JNE lop1
lop2:
MOV AH,2
POP DX
ADD DL,30H;转换成对应的ASCII码
INT 21h
DEC SI
CMP SI,0
JNE lop2
RET
SUBP2 ENDP
CODES ENDS
END MAIN
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!