LC2K汇编语言递归实现组合数
第一篇博客。。。
首先说明一下问题,就是汇编的递归调用,具体为求一个组合数问题
1 ;N3=com(N1,N2) com(n,k)=combine(n-1,k)+com(n-1,k-1) 2 3 CODE SEGMENT 4 5 ASSUME CS:CODE,DS:DATA 6 7 BEG: MOV AX,DATA 8 9 MOV DS,AX 10 11 MOV SI,OFFSET NUM1 ;offset of N1, thus DS:SI refers to N1 12 13 MOV AX,[SI] ;import N1 to AX 14 15 MOV CX,[SI+2] ; import N2 to CX 16 17 CALL com ;calculate com(N1,N2) 'call'push the current CS:IP + 1, import the label address 18 19 MOV [SI+4],BX ;save the result 20 21 JMP $ 22 23 24 25 26 27 com: ; input AX:n CX:k output BX:com(n,k) 28 29 CMP CX,0; k==0 --> return 1 30 31 JE return1 32 33 CMP AX,CX; n==k-->return 1 34 35 JE return1 36 37 PUSH AX ; protect AX 38 39 PUSH CX ; protect AX 40 41 SUB AX,0x0001 42 43 CALL com ; calculate com(n-1,k) 44 45 POP CX 46 47 POP AX 48 49 SUB AX,0x0001 50 51 SUB CX,0x0001 52 53 PUSH BX ; protect com(n-1,k) 54 55 CALL com ; calculate com(n-1,k-1) 56 57 POP AX 58 59 ADD BX,AX 60 61 JMP allreturn 62 63 return1: 64 65 MOV BX,1 66 67 allreturn: 68 69 RET ; 'ret' import the CS:IP from the top of stack, and stack pop this address 70 71 72 73 CODE ENDS 74 75 DATA SEGMENT 76 77 NUM1 DW 0005H ;N 78 79 NUM2 DW 0002H;K 80 81 NUM3 DW 2222H ;ANS (combine(N,K)) 82 83 DATA ENDS 84 85 END BEG


浙公网安备 33010602011771号