欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编实现字节数组相加

程序员文章站 2022-05-08 19:22:00
...
为了实现字节数组的求和,须要先将要加的数放入数据段的一个字节数组中,然后用SI指向此数组的首地址,依次递增,将累加和放入一个寄存器.本程序功能有限,主要是用到了子程序,这就要求对现场进行保护,在子程序执行完后还要RET,恢复其现场,当然本程序没有这么复杂,只是将求和与显示分别作成了一个子程序,
当然我写的这个DISP子程序还有很多不足的地方,只能显示10以下的数,超过10将会显示出乱码,因为出于时间关系没有对其进行完善,这就要用到代码转换的内容了,因为你要用不同的进制进行显示需要进行不同的处理,可能有人会问了,为什么汇编要转换呢,因为在计算机里都是以二进制进行存储的,而显示是显示的字符的ASCII码,如果不进行转换肯定会显示乱码的.
现在大体上说一下代码转换的思路,我们先取出四位,你可以采取循环移位的方式,这样便可轻松的取出高四位,再对其进行判断,当是数字时对其加30H,是字符的时候对其加37H,这是由ASCII表决定的,如果你不信,可以查询一下ASCII表计算试试看.这样我们就可以以任十六进制显示数字了,至于转换成其它码制以后再叙.
下面有一示例程序,完成一组数相加的功能,还有很多不足之处,见谅!

DATAS SEGMENT
BUF DB 1,2,3,1,1,0,1
COUNT EQU ($-BUF)-1
QUESTION DB 13,10,13,10,13,10,'1+2+3+1+1+0+1 ='
RESULT DB ?
DB '$'
DATAS ENDS
;-------------
CODES SEGMENT
ASSUME DS:DATAS,CS:CODES
START:
MOV AX,DATAS
MOV DS,AX
XOR CX,CX
XOR AX,AX
LEA SI,BUF
MOV CX,COUNT
CALL SUM ;调用求和子程序
MOV RESULT,BL ;将结果存入RESULT存储单元
CALL DISPLAY ;调用显示子程序
MOV AH,1
INT 21H
[img]/upload/attachment/90267/fc243365-aaa4-315d-b24c-1215dc2b4620.bmp[/img]

MOV AH,4CH ;RETURN TO DOS
INT 21H
;-----------SUM BEGIN----------------
;子程序一
;作用:计算总和
;入口参数:SI,CX
;出口参数:AX
SUM PROC
MOV BX,0
ADD BL,[SI]
NEXT:
INC SI
ADC BL,[SI]
LOOP NEXT
RET
SUM ENDP
;-------------SUM END----------------
;------------- DISPLAY BEGIN---------
;子程序二
;作用:十进制显示
;入口参数:RESULT
;出口参数:NONE
DISPLAY PROC
XOR DX,DX

MOV DX,OFFSET QUESTION
MOV AH,09H
INT 21H
MOV DL,[RESULT]
ADD DL,30H
MOV AH,2H
INT 21H
RET
DISPLAY ENDP
;-------------DISPLAY END-------------
CODES ENDS
END START

运行效果如下:
[img]/upload/attachment/90267/fc243365-aaa4-315d-b24c-1215dc2b4620.bmp[/img]
相关标签: DOS