汇编原理实验

您所在的位置:网站首页 算平均数代码 汇编原理实验

汇编原理实验

2024-07-12 15:20| 来源: 网络整理| 查看: 265

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

了解了核心算法后,开始需要处理一些汇编细节,和其他高级语言不同,在汇编语言中用户输入的数字其实是字符,用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

运行结果如图:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3