汇编语言:按学号查找学生成绩信息

汇编语言:按学号查找学生成绩信息

  • 题目要求
      • 运行截图
  • 编程平台
  • 代码实现

题目要求

已知ASSEMBLY数组存放的是按照学号从1到10的学生汇编成绩。
现在要求从键盘上输入一个学生的学号,然后显示该生对应的汇编成绩。
输入不存在的学号要有报错提示。

运行截图

汇编语言:按学号查找学生成绩信息_第1张图片
汇编语言:按学号查找学生成绩信息_第2张图片

编程平台

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

如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!

你可能感兴趣的:(汇编语言,assembler)