Как бы я подошел к созданию последовательности Фибоначчи в ARM? - PullRequest
0 голосов
/ 11 ноября 2018

Мне нужно сделать программу сборки ARM, которая распечатает последовательность Фибоначчи, и я не уверен, как к ней приблизиться. Программа запросит у пользователя число, и когда он введет это число, программа должна распечатать последовательность Фибоначчи для этого количества чисел, поэтому, например, если пользователь введет 10, программа выполнит печать

«Число Фибоначчи 1 равно 1».

«Число Фибоначчи 2 равно 1».

и т. Д.

В настоящее время мой код для этого выглядит следующим образом:

B   main

maxF    DEFW    0
enterI  DEFB "Please enter the number of fibonacci numbers to print: ",0
newline DEFB "\n",0
fibbo   DEFB    "Fibonacci number ",0
is      DEFB    " is ",0
end     DEFB    ".\n",0
errorM  DEFB "Error, try again!\n",0

    ALIGN                          
main    ADR R0, enterI
    SWI 3
    MOV R1, #0
    MOV R2, #10                                         
    MOV R3, #0      ;lastNumber variable
    MOV R4, #1      ;numberbeforeLast variable
    MOV R5, #0      ;currentNumber variable

start   SWI 1           ;take user input

    CMP R0, #10     ;compare R0 with #10 (enter)
    BEQ _end        ;if equal, go to _end

    CMP R0, #48     ;compare R0 with #48 (0)
    BLT _error      ;if less than, go to _error

    CMP R0, #57     ;compare R0 with #57 (9)
    BGT _error      ;if greater than, go to _error

    SUB R0, R0, #48 ;R0 = R0 - #48
    SWI 4           ;print the above

    MUL R1, R1, R2  ;Multiply the R1 register by R2 and store in R1
    ADD R1, R1, R0  ;Add the R1 register to R0 and store in R1

    B while_cond
 while_loop
    ADD R5, R3, R4  ;currentnumber = lastnumber + numberbeforelast
    ADR R0, fibbo
    SWI 3
    STR R5, maxF
    LDR R0, value
    SWI 4
    ADR R0, is
    SWI 3
 while_cond
    CMP R0, #0
    BGT while_loop

_end    SWI 2

_error  ADR R0, errorM
    SWI 3
    B main

Я думал о подходе к этому, и у меня есть кое-что, но я не уверен, как это сделать. Я думал, что программа ожидает ввода от пользователя для числа, а затем выполняет вычисление для этого числа, а затем распечатывает строку для числа, находящегося в настоящее время в регистре, и переходит обратно вверх, где регистр перезаписывается следующее значение и затем делает то же самое, пока значение этого регистра не станет равным значению, указанному пользователем, то есть когда оно останавливается.

1 Ответ

0 голосов
/ 12 ноября 2018

Прямо сейчас у кода нет шансов на работу, потому что вы никогда не обновляете значения r3 и r4 (ваши предыдущие два числа Фибоначчи), и вы перезаписываете r0 (предназначен для вашего счетчика цикла ) в ряде мест. Могут быть и другие проблемы.

Не совсем понятно, где вы застряли - возможно, это сочетание неопытности с языком ассемблера и неопытности с процессом разработки алгоритма. Мой совет - разделить два процесса. Напишите некоторый код на C (или на другом языке, но C - самый близкий к языку ассемблера, который вы фактически не используете!), Который вычисляет первые n числа Фибоначчи. Как только это сработает, начните думать о том, как реализовать то же самое на языке ассемблера.

...