1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| STACKS SEGMENT STACK DW 100 DUP(?) TOP LABEL WORD STACKS ENDS
DATAS SEGMENT NUM1 DW 9,9,8,7,4,5,6,7,8,9 NUM2 DW 6,4,5,6,7,8,9 ;定义两个数字,首位存放num的长度,这两个数字将用于做乘法运算 S DW 300H DUP(0) ;s用于存放结果 DATAS ENDS
CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS MAIN PROC FAR MOV AX,STACKS MOV SS,AX LEA SP,TOP MOV AX,DATAS MOV DS,AX
LEA SI,NUM1 LEA DI,NUM2 LEA BX,S ADD SI,2 ADD DI,2 ;加2的原因是因为第一位是数字的个数,从第二个数字开始才是真正的数,因为是DW的所以需要+2
MOV CX,NUM1 JIN1: PUSH [SI] ADD SI,2 LOOP JIN1
LEA SI,NUM1 ADD SI,2 MOV CX,NUM1 CHU1: POP [SI] ADD SI,2 LOOP CHU1 ;进栈出栈的目的是为了倒置该字符串用于乘法运算
MOV CX,NUM2 JIN2: PUSH [DI] ADD DI,2 LOOP JIN2
LEA DI,NUM2 ADD DI,2 MOV CX,NUM2 CHU2: POP [DI] ADD DI,2 LOOP CHU2 ;同上
LEA SI,NUM1 LEA DI,NUM2 LEA BX,S ADD SI,2 ADD DI,2
MOV CX,NUM1 ;二重循环,把每个数都相乘,并存在s的对应位置,如果该位置里有值,则加上该值 L1: PUSH CX MOV CX,NUM2 PUSH BX PUSH DI L2: MOV DX,[SI] MOV AX,[DI] MUL DX ADD DI,2 ADD AX,[BX] MOV [BX],AX ADD BX,2
LOOP L2 POP DI POP BX ADD BX,2 POP CX ADD SI,2 LOOP L1
XOR DX,DX LEA BX,S MOV CX,NUM1 ADD CX,NUM2 ;将s中每一个数除以10,余数放回原位,商作为进位 L4: MOV AX,[BX] ADD AX,DX MOV DL,10 DIV DL MOV DL,AH MOV [BX],DX MOV DL,AL
ADD BX,2 LOOP L4
MOV CX,NUM1 ADD CX,NUM2
L5: SUB BX,2 ;逆序,输出结果 MOV DX,[BX] ADD DX,30H MOV AH,2 INT 21H
LOOP L5
L10: MOV AH,4CH INT 21H MAIN ENDP CODES ENDS END MAIN
|