我正在尝试在汇编中编写递归组合函数( Yasm(类似于 nsam))。我不能使用循环、乘法或除法。
我确定我在正确的轨道上,但是一旦我点击第二个内部函数调用就会遇到问题。谁能帮助我并告诉我哪里出错了?
编辑:这是我更新的代码,它返回一个结果,但并不总是正确的。我想我一定有一点逻辑不正确。
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)
}
}