上一次汇编写到,只是个位数的简单相加,只需要判断两者相加有无进位,进位即进一,在输出窗口输出一先。遇到多位数后,会变复杂很多,事实上汇编里面可以实现相加,难题在于需要把和转成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码,输出。
个位数相加当然也可以用这种方法,但是没必要这么复杂。所以第一个程序很简单的判断一下进位即可。
原来一个多位数的相加之后的显示是如此的精妙!