当前位置:编程学习 > 汇编语言 >>

汇编语言(8086)问题

已知从BUF单元开始存放着10个8位无符号数,要求编写汇编语言程序,将这10个数去掉一个最大的,去掉一个最小的,将其余的数的算术平均值计算出来并存于AVERG字节单元。要求输出时有提示信息。 附加一:在输出之前显示一下这10个数,要有提示信息 附加二:从键盘输入10个十进制无符号数,而不是在数据区中预存,输入数据前要有提示信息。 附加可回答或不回答,回答加5,直接回答代码或者发至邮箱cq6809@sina.com,尽快,谢谢!
答案:朋友,我帮你做的汇编题目,回答你百度的提问,希望对你有帮助,
 我采用的是键盘输入数据方式,
 另外我用的是EMU8086写的不知你的MASM可不可以用!
 满意的话把分给我哈。。。。。。。。。。。


;********************************************************************
;题目:已知从BUF单元开始存放着10个8位无符号数,要求编写汇编语言程序 **
;将这10个数去掉一个最大的,去掉一个最小的,                        **
;将其余的数的算术平均值计算出来并存于AVERG字节单元。               **
;要求输出时有提示信息。                                            **
;附加一:在输出之前显示一下这10个数,要有提示信息                  **
;附加二:从键盘输入10个十进制无符号数,                            **
;        而不是在数据区中预存,输入数据前要有提示信息。            **
;********************************************************************
;********************************数据段
data segment
          array db 0,0,0,0,0,0,0,0,0            ;为键盘输入数据开辟空间 
          AVERG db 10 dup(0)                    ;AVERG单元保存平均值
        string1 db "Please input 10 numbers: $" ;字符串以$结束
        string2 db "Ok,the data you input have been sorted! $"
        string3 db "Now,the max numbers: $" 
        string4 db " and the min numbers: $"
        string5 db " had been deleted! $" 
        string6 db "The other 8 numbers are :$"
        string7 db "The AVERG of this 8 numbers is : $"
           crlf db 13,10,13,10,"$"               ;13回车,10换行
        data ends
;**********************************
;**********************************代码段
code segment
        assume ds:data,cs:code        ;段对应关系的说明
        main proc far                 ;far子程序调用时的参数                 
        start:         
                push ds
                sub ax,ax             ;清零
                push ax               ;压栈                
                mov ax,data           ;将数据传送入数据段
                mov ds,ax 
;---------------------------------------                
;主程序开始  
;---------------------------------------------------------        
;显示"Please input 10 numbers:$" 的内容
        mov ah,09h
        lea dx,string1          
        int 21h        
;-----------------------------------------------------------
;键盘输入数字        
        mov bx,offset array     ;设定基址
        mov si,0                ;循环计数设定        
   input:            
        mov ah,02h
        mov dl,20h              ;每隔数据间加上一个空格
        int 21h     
        mov ah,01h
        int 21h        
        cmp al,20h              ;20h=32d,ASCII中的空格键
        je  input               ;可以采用空格隔开
        sub al,30h              ;ASCII值与十进制数转换
        mov [bx+si],al          ;将累加器中的数据传送到数组中保存起来
        inc si                  ;计数器加1
        cmp si,9
        jle input               ;小于等于9则继续输入(共10个数)
;--------------------------------------------------------------
;对数组元素进行排序找出最大最小元素   
        mov bx,offset array 
        mov cx,0ah                      ;求实际循环次数,cx作为里层循环计算器    
        dec cx                  
  again1:    
        mov dx,cx                       ;dx赋初值作为外层循环计数器 
        mov si,00H                      ;si作为数据指针置0  
  again2:    
        mov al, [bx+si]                 ;取第一个数给al 
        cmp al, [bx+si+1]               ;与下一个数比较 
        jnb again3                       ;al大于或等于第二个数则转跳 
        xchg al,[bx+si+1]               ;若小于则互换,大的数放低字节    
        mov [bx+si],al                  ;小的数放高字节 
  again3:    
        add si,1                        ;si加2,指向下一个数 
        dec dx                          ;修改外循环次数 
        jnz again2                       ;如果dx不等于0,则跳转至Loop2  
        loop again1                                      
;----------------------------------------------------------------
;换行
        mov ah,09h
        lea dx,crlf            
        int 21h        
;------------------------------------------------------------         
;屏显"Ok,the data you input have been sorted!"并换行
        mov ah,09h
        lea dx,string2          ;显示字符串string2的内容
        int 21h
        mov ah,09h
        lea dx,crlf            
        int 21h         
;--------------------------------------------------------------
;输出数组中的数据 
        mov bx,offset array     ;设定基址       
        mov si,0                           
   output1:                     ;输出
        mov ah,02h 
        mov al,[bx+si]
        add al,30h
        mov dl,al              ;将数组中的数据一次传送给dl显示
        int 21h
        mov ah,02h
        mov dl,20h             ;每隔数据间加上一个空格
        int 21h
        inc si
        cmp si,9
        jle output1             ; 小于等于9则继续输出(共10个数) 
;----------------------------------------------------------------
;换行
        mov ah,09h
        lea dx,crlf            
        int 21h         
;--------------------------------------------------------------                 
;屏显"Now,the max numbers: $"
        mov ah,09h
        lea dx,string3          ;显示字符串string3的内容
        int 21h 
        mov al,[bx]
        add al,30h
        mov dl,al               ;显示最大的数
        mov ah,02h
        int 21h         
;--------------------------------------------------------------                 
;屏显" and the min numbers: $"
        mov ah,09h
        lea dx,string4          ;显示字符串string4的内容
        int 21h 
        mov al,[bx+9]
        add al,30h
        mov dl,al               ;显示最小的数
        mov ah,02h
        int 21h 
;--------------------------------------------------------------                 
;屏显" had been deleted!$"并换行
        mov ah,09h
        lea dx,string5          ;显示字符串string5的内容
        int 21h         
        mov ah,09h
        lea dx,crlf             ;换行
        int 21h  
;------------------------------------------------------------
;删除最大和最小的两个数据
        mov [bx],00h           ;删除最大的数据
        mov [bx+9],00h         ;删除最小的数据               
;--------------------------------------------------------------                 
;屏显"The other 8 numbers are :$"并换行
        mov ah,09h
        lea dx,string6          ;显示字符串string6的内容
        int 21h         
        mov ah,09h
        lea dx,crlf             ;换行
        int 21h        
;--------------------------------------------------------------
;输出数组中的数据 
        mov bx,offset array     ;设定基址       
        mov si,0                           
   output2:                     ;输出
        mov ah,02h 
        mov al,[bx+si]
        add al,30h
        mov dl,al               ;将数组中的数据一次传送给dl显示
        int 21h
        mov ah,02h
        mov dl,20h              ;每隔数据间加上一个空格
        int 21h
        inc si
        cmp si,9
        jle output2             ; 小于等于9则继续输出(共10个数) 
;----------------------------------------------------------------
;换行
        mov ah,09h
        lea dx,crlf            
        int 21h  
;----------------------------------------------------------        
;先求总和        
        mov al,[bx]             ;al中存储第一个数
        mov si,00h              ;计数值
     sum:
        add al,[bx+si+1]
        inc si
        cmp si,8
        jbe sum
        mov cl,al               ;用cl来保存和 
        shr cl,3                ;cl中的值除以8
        mov bx,offset AVERG
        mov [bx],cl             ;保存平均值到AVERG单元中
;--------------------------------------------------------------                 
;屏显"The AVERG of this 8 numbers is : $"并换行
        mov ah,09h
        lea dx,string7          ;显示字符串string7的内容
        int 21h 
        mov al,[bx]              
        add al,30h
        mov dl,al               ;显示al中的平均值
        mov ah,02h
        int 21h                      
        mov ah,09h
        lea dx,crlf            ;换行
        int 21

上一个:帮忙解释下这段汇编,重奖!!!!!!!!!
下一个:求汇编高手帮我检查下 。。。

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,