先不考虑用户输入以及输出,我们可以根据一些总结来的经验得出:在处理数组累加,以及求平均值的程序中需要用到循环,把用户输入的数字加起来,然后除以一个总数得到平均值。
了解了核心算法后,开始需要处理一些汇编细节,和其他高级语言不同,在汇编语言中用户输入的数字其实是字符,用ASCII保存的。例如用户输入18,实际上是输入’1’.’8’,对应的ASCII为,31h,38h,如果想要进行运算,首先要把用户输入的’数字’转化为真正的数字才行,也就有了我们changeToNum子程序。具体实现思想比较简单,用户输入一串数字后,我们从数字最高位开始读,然后把读出来的存于dx,然后将ASCII转化成数字只要减去30h即可,存于ax。再读次高位,用相同方法处理成数字,然后ax乘10后再加上dx,反复如此,直到所有读完。
输出也是类似的,要把数字输出在屏幕上,需要把每位数字转化成ASCII码输出,每次循环整除以10,余数就是最低位,直到除到商为0。这就是 dispdec子程序
有了这三大块功能后,就可以来实现代码了:
定义一个sum变量来记录累加,用户每输入一个数字转化后就加到sum中,输入完成后sum再除以整数得平均数。最后将其输出
DATAS SEGMENT
;此处输入数据段代码
message db 'average is:$'
sum dw 0
count equ 5 ;数字个数
num db 3 ;最多两位数
numlen db ?
numfld db 3 dup(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
mov bx,sum
mov cx,count
again:
mov ah,0ah
lea dx,num
int 21h
call printnewline
call changeToNum ;入口numfld出口参数为ax
add bx,ax
loop again
lea dx,message
call print
mov sum,bx
mov ax,sum
mov bx,count
DIV bx
mov dx ,ax
call dispdec
MOV AH,4CH
INT 21H
print proc
push ax
mov ah,09h
int 21h
pop ax
ret
print endp
;输出换行
printnewline proc
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
printnewline endp
changeToNum proc
push cx
push dx
push bx
mov cl,numlen
mov si,0
mov ax,0
again1:
mov dl,[numfld+si]
sub dl,30h
inc si
add ax,dx
cmp cl,1
je last
mov bl,10
MUL bl
loop again1
last:
pop bx
POP dx
pop cx
ret
changeToNum endp
;十进制输出,入口参数dx
dispdec proc
push ax
push bx
push cx
push dx
mov ax,dx
xor dx,dx
mov bx,10
mov cx,0
a:
cmp ax,10
jb ok
div bx
add dl,30h
push dx
xor dx,dx
inc cx
jmp a
ok:
add al,30h
push ax
inc cx
b:
pop dx
mov ah,2
int 21h
loop b
pop dx
pop cx
pop bx
pop ax
ret
dispdec endp
CODES ENDS
END START
运行结果如图: