⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.asm

📁 用汇编语言实现的程序: 每名学生需要如下描述:班级、学号、姓名、期末成绩、期中成绩、实验成绩、平时成绩。成绩可以有小数
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*************************************************************************
;汇编程序_班级04407_学号041165_序号10_陈见雨
;                       完成于2006年12月16日
;                 email:   colama_man@qq.com
;
;输入学生总数:1-99
;输入格式为:班级-学号-姓名
;如04407-041165-chen  字符个数必须为5-6-姓名(最大为5个字符)
;字符个数即为:班级5个,学号6个,姓名不大于5个字符
;*************************************************************************
data    segment
        number_tip    db   'Please input the number of student(1-99):$'
				name_tip      db   0dh,0ah,'Please input the information(Class-XueHao-Name):',0dh,0ah,'$'
				gradetip      db   0dh,0ah,'Please input the grades(qimo qizhong shiyan pingshi):',0dh,0ah,'$'
				show_result   db   0dh,0ah,'Class-XueHao-Name  :  ChengJi',0dh,0ah,0dh,0ah,'$'
				stars         db   0dh,0ah,'************************************','$'
				maohao        db   '  :  $'
				space         db   '     $'
				fenshuduan    db   0dh,0ah,'[Below 60][60-70][70-80][80-90][90-100]',0dh,0ah,'$'
				snumber1      db   3 dup(0)      ;存储学生总数(ASCII表示)
				snumber2      db   0              ;存储学生总数(十进制)	
				student       db   1980 dup(0)     ;输入格式为:班级-学号-姓名,最多支持99个人,每个人占用21个空间单元
				buffer1       db   8 dup(0)        ;为学生成绩分配空间(ASCII表示)
				buffer2       db   4 dup(0)          ;为学生成绩分配空间(十进制表示)
				resultes      db   99 dup(3 dup(0))  ;存储每个学生平均分,每个人的平均分占用3单元,共99人
				n             db   5 dup(0)        ;存储60以下、60-70、70-80、80-90、90-100分段内的人数
data    ends
;**************************************************************************
code    segment
;-----------------------------------------------------------
main    proc     far
 				assume cs:code,ds:data
start: 
 				mov ax,data          ;数据段初始化
 				mov ds,ax
 				mov es,ax
 				
 				mov si,0                       ;指向每个学生姓名
 				mov di,0		                   ;指向每个学生总评成绩
 				mov cx,100                     ;初始化学生数
;---------------------------------------------------------------------------

		    lea dx,number_tip      ;请求输入学生总数
 		    mov ah,09     
 			  int 21h 
 			  
 		    call store_number     ;存储学生总数,结果送cx中
 		      
 		    cmp cx,0                 ;输入为0退出
 		    jle  retdos
 		    cmp cx,100             ;学生数超出本程序范围,退出
 		    jge retdos
 			  
 ;--------------------------------------------------------------------------------	
 
begin: 			   
    	  lea dx,name_tip      ;请求输入学生信息,格式为:班级-学号-姓名,字符长度必须为5-6-4
 				mov ah,09     
 			  int 21h             
 			        
 			  call store_name                            ;存储学生姓名
 			  
 			  add si,20                                    ;指向下一个学生姓名

 			  lea dx,gradetip       ;请求输入学生成绩
 			  mov ah,09
 			  int 21h
 			  
 			  call store_grades      														;存储每个学生成绩 
				call compute                     ;计算每个学生平均分
				
				add di,3                        ;分别存储每个学生的平均分,di指向每个学生平均分
				                                ;因为存储的是3位,di每次加3才能指向下一个学生
				loop begin              ;循环,直到输入所有学生成绩
				
				call sort               ;排序
					  
				call display           ;显示结果
	      
 ;----------------------------------------------------------------------
 retdos:
        mov ah,1           ;任意键结束
        int 21h
        
 				mov ax,4c00h       ;返回DOS
 				int 21h 
;**************************************************************************	
;					以下为子程序部分
;**************************************************************************
;	 				以下为子程序部分
;*************************************************************************
store_number  proc
              push ax
              push bx

							mov bx,0
     store:  
 				      mov ah,01
 							int 21h            ;输入字符
							cmp al,0dh         ;判断是否输入回车
							je  cr_             ;输入结束
  						and al,0fh         ;转换成非压缩的BCD码
 							mov snumber1[bx],al 
 							inc bx             ;输入未结束,则继续输入
 							jmp store
   										
	  cr_:	    
              cmp bx,2                  ;学生数大于10,还是小于10,最多支持99人
              jz llll 
                                
              jg large                 ;学生数大于99返回,bx>2
               
	            mov al,snumber1            ;输入学生数小于10,大于0
	            jmp lllll 
	                                   
	 llll:      mov ah,snumber1            
		          mov al,snumber1+1                
              aad                           ;BCD码转换为二进制数 
     
lllll:        mov snumber2,al 

              mov cx,0
              mov cl,snumber2
  	
		large:
							pop bx
							pop ax
							ret
store_number  endp
;****************************************************************************		
store_name    proc
              push dx
              push ax
              push bx

              mov al,18                  ;每个学生单元最大可存储字符数,包括回车
              mov student[si],al
              
						  lea dx,student[si]                 ;读取学生姓名
      				mov ah,0ah                    
 				      int 21h
 				      
 				      mov bl,student[si+1]              ;bl存储实际输入字符个数,不包括回车
 				      
 				      mov al,' '                        ;将实际输入字符最后键入的回车换成空格
              mov student[si+bx+2],al
              
              mov student[si+19],'$'          ;在一个学生存储单元的最后加上'$',一个学生的输入结束
                                              ;存储的时候必须加上这个'$'否则打印的时候出错
              pop bx
              pop ax
              pop dx
							ret
store_name    endp
;*****************************************************************************
store_grades  proc
							push ax
							push di
							
							mov di,0
     input:  
 				      mov ah,1
 							int 21h            ;输入字符
							cmp al,0dh         ;判断是否输入回车
							je  return         ;输入结束
							cmp al,' '         ;判断是否输入空格 
							
;************重大失误!!!我竟然写成cmp al,0ah!!!结果使计算结果老是出错!浪费一个下午!

							je  input					 ;跳过空格
  						and al,0fh         ;转换成非压缩的BCD码
 							mov buffer1[di],al 
 							inc di             ;输入未结束,则继续输入
 							jmp input
 															
	  return:	             
	            pop di
	           	pop ax
	            ret  
store_grades  endp
;****************************************************************************
compute       proc                               ;计算平均成绩主程序
              push ax
              push si
              push cx
              push dx 
              push bx                             ;bx用做临时存储数据用
                   
              mov si,0
              mov ax,0
              mov dx,0
              mov bx,0     
           
;-----------------------------------------------------------------
    
              mov cx,4                         ;循环实现BCD码转换为二进制数
     next1:                                     
              mov ah,buffer1[si]
              mov al,buffer1[si+1]   
              aad
              mov buffer2[bx],al
              add si,2
              inc bx
              loop next1     
                                 
 ;------------------------------------------     
            ;期末成绩×0.6+期中成绩×0.2+实验成绩*0.1+平时成绩*0.1
               
             mov si,0                       ;计算平均成绩,结果用十进制表示
             mov bx,0                        ;清零
            
             mov al,6
             mul buffer2[si]
                       
             add bx,ax
            
             mov al,2
             mul buffer2[si+1]
            
             add bx,ax
            
             mov al,1
             mul buffer2[si+2]
            
             add bx,ax
            
             mov al,1
             mul buffer2[si+3]
            
             add bx,ax
            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -