2014-10-13 2 views
2

Я все время ломаю голову над этим на протяжении всех выходных и не могу понять эту последнюю часть. Я должен написать программу сборки для вычисления n-го числа в серии tetrabonacci. Например:Серия Tetrabonacci на языке ассемблера

 n |0|1|2|3|4|5 |6 |7 | 
output |1|1|2|4|8|15|29|56| 

n отправляется из C++ (который я уже писал). Программа сборки принимает n запись и вставляет ее в стек, уменьшает число и добавляет (до) последние 4 предыдущих номера. Мой код работает, за исключением того, что он не работает, это число выключено, когда я вводил любое число выше 4. Например, когда я вхожу в 4, он выводит 8 правильно, но когда я вхожу в 5, он выдает 16 вместо 15 и 6 выходов 32 вместо 29 как это должно. Если вы можете помочь, я бы очень признателен.

Ниже мой код:

TITLE Tetrabonacci Series 

.586 
.model flat,C 

.code 

Tetrabonacci PROC 
    push  ebp 
    mov  ebp, esp 
    push  ebx 
    sub  esp, 4 
    mov  eax, [ebp+8] 
    cmp  eax, 0 
    ja   L1    
    mov  eax, 1 
    jmp  done 

L1: 
    cmp  eax, 1 
    ja   L2 
    mov  eax, 1 
    jmp  done 

L2: 
    cmp  eax, 2 
    ja   L3 
    mov  eax, 2 
    jmp  done 

L3: 
    cmp  eax, 3 
    ja   L4 
    mov  eax, 4 
    jmp  done 


L4: 
    dec  eax 
    mov  [esp], eax 
    call  Tetrabonacci 
    mov  ebx, eax 
    mov  eax, [ebp+8] 
    dec  eax 
    mov  [esp], eax 
    call  Tetrabonacci 
    lea  eax, [ebx+eax] 

done: 
    add  esp, 4 
    pop  ebx 
    pop  ebp 
    ret 
Tetrabonacci ENDP 
END 
+0

Для тех, кто не знает номера Tetrabonacci является серия 'F (п) = F (п - 1) + F (п - 2) + F (п - 3) + F (n - 4) '. – Jarod42

+0

Насколько я вижу, вы вызываете функцию только дважды, передавая один и тот же аргумент ('n - 1') оба раза. – molbdnilo

+0

Итак, 'F (n + 1) = 2 * F (n) - F (n - 4)'. – Jarod42

ответ

1

Согласно первой комментировали формулу вы должны вызвать функцию четыре раз и добавить четыре результата. Я исправил свой код как можно меньше:

... 
L4: 
    mov  [esp], eax   ; n for recursive call 

    dec  DWORD PTR [esp]  ; n-1 
    jc   @F     ; finish if (n-x) < 0 
    call  Tetrabonacci 
    mov  ebx, eax 

    dec  DWORD PTR [esp]  ; n-2 
    jc   @F     ; finish if (n-x) < 0 
    call  Tetrabonacci 
    add  ebx, eax 

    dec  DWORD PTR [esp]  ; n-3 
    jc   @F     ; finish if (n-x) < 0 
    call  Tetrabonacci 
    add  ebx, eax 

    dec  DWORD PTR [esp]  ; n-4 
    jc   @F     ; finish if (n-x) < 0 
    call  Tetrabonacci 
    add  ebx, eax 

    @@:        ; finish 
    mov  eax, ebx 

done: 
... 
+0

Это ТОЧНО, что я ожидал от этого, я вижу, где я ошибался. Мне не только нужно было вызывать функцию рекурсивно, как предлагалось @molbdnilo (больше, чем только два раза, что я есть), но четыре раза дополнительно мне нужно было уменьшить n каждый раз, чтобы добавить его. Спасибо! Это очень помогает! –