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