以下の再帰関数をカウントするアセンブリプログラムを作成しました。
f(n) = f(n-1) + 2*f(n-2) - f(n-3)
n = 0 および n = 1 の場合は 1 を返し、n = 2 の場合は 0 を返す必要があります。ただし、この値の場合、プログラムは常に 0 を返します。以下の条件が満たされていないようです。
if0:
mov eax,1
jmp end
if1:
mov eax,1
jmp end
if2:
mov eax,0
jmp end
他の値 (2 より大きい) の場合、セグメンテーション エラーが発生します。以下はコード全体です。
.intel_syntax noprefix
.globl main
.text
main:
mov eax, 3
push eax
call f
push eax
push offset msg
call printf
add esp, 8
mov eax, 0
ret
f:
push ebp
mov ebp,esp
add ebp,12
mov ebx,[ebp]
cmp ebx, 0
jz if0
cmp ebx, 1
jz if1
cmp ebx, 2
jz if2
lea ecx, [ebx-1]
push ecx
call f
pop ecx
push eax
lea ecx,[2*ebx-2]
push ecx
call f
pop ecx
pop eax
add eax,ecx
push eax
lea ecx, [ebx-3]
push ecx
call f
pop ecx
pop eax
sub eax,ecx
jmp end
if0:
mov eax,1
jmp end
if1:
mov eax,1
jmp end
if2:
mov eax,0
jmp end
end:
pop ebx
pop ebp
ret
msg: .asciz "Output = %d\n"
何が間違っているのかわかりません。編集:だから、私はebpを試してみて、add ebp、8を次のように変更しました:add ebp、16。そして、今では基本条件で機能します。スタックオーバーフローに問題があるように思えますが、どこにあるのかわかりません。