汇编语言(十二)之统计小于平均数的个数

汇编语言(十二)之统计小于平均数的个数

在一个数组中找出并统计并该数组的平均数小的数的个数

程序运行:

www.zeeklog.com  - 汇编语言(十二)之统计小于平均数的个数

代码:


datas segment

      DATA                  dw  10h dup(1,2,3,4,-1,5,7,-99,29,-11,294,-21,45,6,57,-54)
      average               dw  0
      countOfLowAverage     dw  0
   
      outputAverage                   db 'average:AX=$'
	  outputCountOfLowAverage         db 0dh,0ah,'count of low average:BX=$'
datas ends

stacks segment stack

    db  100h dup(?)

stacks ends

codes segment

assume cs:codes,ds:datas,ss:stacks
main   proc  far
start:
       push ds
	   mov ax,0h
	   push ax
       mov ax,datas            ;初始化ds
	   mov ds,ax
       
       mov cx,100h	            ;将DATA数组的长度移至cx
	   mov bx,0                 ;bx为DATA数组的索引
	   mov si,0                 ;si为数组和的低16位
	   mov di,0                 ;di为数组和的高16位
	   s:
	    mov ax,DATA[bx]        ;将DATA数组的单元移至ax
		cwd                     ;进行有符号扩展
	    add si,ax               ;求和
		adc di,dx               
		add bx,type DATA        ;数组索引移至下一个单元    
		loop s
		
	  
	   mov cx,100h               ;数组的长度
	   mov ax,si                 ;将数组的求和移至dx,ax中
	   mov dx,di                
	   idiv cx                   ;求平均值
	   mov average,ax            ;保存平均值于average
	   
	   mov bx,0                  ;计算小于平均值的数的个数
	   mov si,0                  ;数组的索引
	   s1:
	     cmp ax,DATA[si]         ;比较平均值与数组元素的大小
         jng next                ;平均值小于等于数组元素,则跳转
		 inc bx                  ;平均值大于数组元素,计算器bx加1
	   next:
	     add si,type DATA        ;数组的索引移至下一个单元
	     loop s1 
		 
	   mov countOfLowAverage,bx  ;保存小于平均值的数的个数
	   
	   ;输出平均值的提示
	   lea dx,outputAverage
	   mov ah,9 
	   int 21h 
	   
	   ;输出平均值
	   mov ax,average
       call print
	   
	   ;输出小于平均值的数的个数的提示
	   lea dx,outputCountOfLowAverage
	   mov ah,9 
	   int 21h 
	   
	   ;输出小于平均值的数的个数
	   mov ax,countOfLowAverage 
	   call print
	   
       ret
	   
main endp

print proc near
     
	 ;保存寄存器的值
	 push cx
	 push dx
	 push bx
	 
	 ;保存ax
	 mov bx,ax
	 cmp bx,0                 ;比较bx与0
	 jnl notNegative          ;bx为非负数,则跳转
	 mov dl,'-'               ;若bx为负数,则输出'-'
	 mov ah,2
	 int 21h
	 
	 neg bx                   ;取bx的绝对值
	 mov ax,bx                ;将bx移至ax
	 
	 notNegative:
	 mov cx,0                 ;cx记录ax十进制数的位数
	 mov bx,10 
	 ps:
	    mov dx,0              ;dx置0,使得余数不干扰除法操作
		div bx                ;除10取余
		push dx               ;保存余数
		inc cx                ;cx记录位数加1
		cmp ax,0              ;比较ax与0
		jne ps                ;ax非0,则循环继续
		
    ps1:
	    pop dx                ;取出余数
		add dl,30h            ;数值转化成数字字符
		mov ah,2              ;输出字符
		int 21h
		loop ps1 
    
	;恢复寄存器的值
	pop bx
	pop dx
	pop cx
	
	ret 
print endp
codes ends

end main