`
yunchow
  • 浏览: 319781 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

汇编实现字节数组相加

DOS 
阅读更多
    为了实现字节数组的求和,须要先将要加的数放入数据段的一个字节数组中,然后用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

运行效果如下:


  • 大小: 2.6 KB
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics