汇编语言(十二)之统计小于平均数的个数
在一个数组中找出并统计并该数组的平均数小的数的个数
程序运行:
代码:
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