上一次汇编写到,只是个位数的简单相加,只需要判断两者相加有无进位,进位即进一,在输出窗口输出一先。遇到多位数后,会变复杂很多,事实上汇编里面可以实现相加,难题在于需要把和转成ASCII码显示在dos窗口。所以需要把和一个一个数提取,转成ASCII。程序如下:

DATAS SEGMENT	
    	OP1 DW 255
    	OP2 DW 366
    	RESULT DW 10 DUP(?)		 定义一个RESULT数组,长度为10个字节
DATAS ENDS

STACKS SEGMENT
    
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS	
    MOV DS,AX
    MOV AX,OP1
    ADD AX,OP2			OP1和OP2相加后附加到AX
    MOV BX,0
    MOV CL,10			将10附加到CL
  	
  	
SS1:
DIV CL		         		AX除以10
ADD AH,30H       			余数转为ASCII码,
MOV SI, OFFSET RESULT		保存到RESULT数组。
MOV [SI+BX],AH  			商取代结果
INC BX            			BX递增
	MOV AH,0				将AH清空,以便将下一次的商附加进去
	CMP AL,0				比较余数是否零,是则跳出循环
	JNZ SS1

SS2:DEC BX					BX递减
	MOV DX,[SI+BX]	将RESULT数组从最高位开始附加到DX
	MOV AH,2				字符串输出
		INT 21H
	
	CMP BX,0				判断BX是否为零,是则跳出
		JNZ SS2
	
	MOV AH,4CH		
        INT 21H
CODES ENDS
    END START				正常结束程序




         程序的思想有点像进制转换,要把数字一个一个从和中提取,由于是十进制,可以将和除以10,所得的余数依次为个位开始的数字,最后,只需要把数字存入数组,用栈式的读取,最后存的先读,为最高位,转成ASCII码,输出。

    个位数相加当然也可以用这种方法,但是没必要这么复杂。所以第一个程序很简单的判断一下进位即可。

    原来一个多位数的相加之后的显示是如此的精妙!