上一次汇编写到,只是个位数的简单相加,只需要判断两者相加有无进位,进位即进一,在输出窗口输出一先。遇到多位数后,会变复杂很多,事实上汇编里面可以实现相加,难题在于需要把和转成ASCII码显示在dos窗口。所以需要把和一个一个数提取,转成ASCII。程序如下:
DATAS SEGMENT OP1 DW 255 OP2 DW 366 RESULT DW 10 DUP(?) 定义一个RESULT数组,长度为10个字节DATAS ENDSSTACKS SEGMENT STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: 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除以10ADD AH,30H 余数转为ASCII码,MOV SI, OFFSET RESULT 保存到RESULT数组。MOV [SI+BX],AH 商取代结果INC BX BX递增 MOV AH,0 将AH清空,以便将下一次的商附加进去 CMP AL,0 比较余数是否零,是则跳出循环 JNZ SS1SS2:DEC BX BX递减 MOV DX,[SI+BX] 将RESULT数组从最高位开始附加到DX MOV AH,2 字符串输出 INT 21H CMP BX,0 判断BX是否为零,是则跳出 JNZ SS2 MOV AH,4CH INT 21HCODES ENDS END START 正常结束程序
程序的思想有点像进制转换,要把数字一个一个从和中提取,由于是十进制,可以将和除以10,所得的余数依次为个位开始的数字,最后,只需要把数字存入数组,用栈式的读取,最后存的先读,为最高位,转成ASCII码,输出。
个位数相加当然也可以用这种方法,但是没必要这么复杂。所以第一个程序很简单的判断一下进位即可。
原来一个多位数的相加之后的显示是如此的精妙!