汇编原理实验 --计算平均数

先不考虑用户输入以及输出,我们可以根据一些总结来的经验得出:在处理数组累加,以及求平均值的程序中需要用到循环,把用户输入的数字加起来,然后除以一个总数得到平均值。

了解了核心算法后,开始需要处理一些汇编细节,和其他高级语言不同,在汇编语言中用户输入的数字其实是字符,用ASCII保存的。例如用户输入18,实际上是输入’1’.’8’,对应的ASCII,31h,38h,如果想要进行运算,首先要把用户输入的’数字’转化为真正的数字才行,也就有了我们changeToNum子程序。具体实现思想比较简单,用户输入一串数字后,我们从数字最高位开始读,然后把读出来的存于dx,然后将ASCII转化成数字只要减去30h即可,存于ax。再读次高位,用相同方法处理成数字,然后ax10后再加上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


运行结果如图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值