アセンブリで再帰的な組み合わせ関数を記述しようとしています( 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)
}
}