0

アセンブリで再帰的な組み合わせ関数を記述しようとしています( Yasm (nsam に類似))。ループ、乗算、除算は使用できません。

私は正しい軌道に乗っていると確信していますが、2番目の内部関数呼び出しに到達すると問題が発生します。誰かが私を助けて、どこが間違っているのか教えてもらえますか?

編集:これは結果を返す私の更新されたコードですが、常に正しいとは限りません。少し論理が間違っているに違いないと思います。

    mov     rax, [n]
    push    rax
    mov     rax, [k]
    push    rax
    call    func    
    ...     ...     program continues from here

 func:                      
    push    rbp 
    mov     rbp, rsp

    push    rdi
    push    rsi

    cmp     rsi, 0
    je      stopcond
    cmp     rdi, rsi
    jne     contin

stopcond:
    mov     rax, 1
    jmp     endfunc
contin:
    ;C(n-1,k-1)
    mov     rax, [rsp]  ; This is k
    dec     rax
    mov     rdx, rax
    mov     rax, [rsp+8]  ; This is n
    dec     rax
    mov     rsi, rdx
    mov     rdi, rax
    call    func

    mov     rbx, rax
    mov     rax, [rsp+8]  ; This is n
    dec     rax
    mov     rdx, rax
    mov     rax, [rsp]  ; This is k
    mov     rsi, rax
    mov     rdi, rdx
    call    func

    add     rax, rbx

endfunc:
    add     rsp, 16
    pop     rbp
    ret

これは、私が参照として使用している JavaScript の実装です。

function(n,k) {
    if ( k==0 || k==n ) {
        return 1
    } else {
        return C(n-1,k-1) + C(n-1,k)
    }
}
4

1 に答える 1