ag凯发k8国际
收集整理的这篇文章主要介绍了
汇编原理实验 --计算平均数
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
先不考虑用户输入以及输出,我们可以根据一些总结来的经验得出:在处理数组累加,以及求平均值的程序中需要用到循环,把用户输入的数字加起来,然后除以一个总数得到平均值。
了解了核心算法后,开始需要处理一些汇编细节,和其他高级语言不同,在汇编语言中用户输入的数字其实是字符,用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 0count equ 5 ;数字个数num db 3 ;最多两位数numlen db ?numfld db 3 dup(?)
datas endsstacks segment;此处输入堆栈段代码
stacks endscodes segmentassume cs:codes,ds:datas,ss:stacks
start:mov ax,datasmov ds,ax;此处输入代码段代码mov bx,summov cx,count
again:mov ah,0ahlea dx,numint 21hcall printnewlinecall changetonum ;入口numfld出口参数为axadd bx,axloop againlea dx,messagecall printmov sum,bxmov ax,summov bx,countdiv bxmov dx ,axcall dispdecmov ah,4chint 21hprint procpush axmov ah,09hint 21hpop axret
print endp
;输出换行
printnewline procpush axpush dxmov ah,02hmov dl,0dhint 21hmov dl,0ahint 21hpop dxpop axret
printnewline endp
changetonum proc
push cx
push dx
push bxmov cl,numlenmov si,0mov ax,0
again1: mov dl,[numfld si]sub dl,30hinc siadd ax,dxcmp cl,1je last mov bl,10 mul blloop again1
last:
pop bx
pop dx
pop cxret
changetonum endp
;十进制输出,入口参数dx
dispdec procpush axpush bxpush cxpush dxmov ax,dxxor dx,dxmov bx,10mov cx,0
a:cmp ax,10jb okdiv bxadd dl,30hpush dxxor dx,dxinc cxjmp a
ok:add al,30hpush axinc cx
b:pop dxmov ah,2int 21hloop bpop dxpop cxpop bxpop axret
dispdec endp
codes endsend start
运行结果如图:
与50位技术专家面对面20年技术见证,附赠技术全景图
总结
以上是ag凯发k8国际为你收集整理的汇编原理实验 --计算平均数的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。