2013-03-25 2 views
0

Я пытаюсь написать программу в сборке, которая будет действовать как счетчик совокупных процентов, который использует рекурсивный цикл. Мне удалось заставить программу работать с набором Principal и установить процентную ставку, и она повторялась 10 раз, показывая баланс после каждой итерации. Теперь я пытаюсь сделать изменить его, поэтому он запрашивает у пользователя стартовую ставку, процентную ставку и целевую сумму. Затем программе необходимо выполнить итерацию до тех пор, пока не будет выполнена целевая задача.Проблемы с программой сборки

Это мой нерабочий код. Я думаю, что я испортил, какие регистры я использую. Iv попытался изменить эти регистры, используемые в линиях beq, на $ a2 и $ a0, но это тоже не сработало. Какие-либо предложения? Idk, если im близко или уходит. У меня тяжелое время после регистрации:/

promptFirst:  .asciiz "Enter Your Starting Balance: \n" 
promptSecond:  .asciiz "Enter the Interst Rate: \n" 
promptThird:  .asciiz "Enter Your Target Balance \n" 


promptNow:   .asciiz "\nYour Balance After A Iteration:\n" 
.text 
.globl main 

main: 




    # Prints the first prompt 
    li $v0, 4    # syscall number 4 will print string whose address is in $a0  
    la $a0, promptFirst  # "load address" of the string 
    syscall     # actually print the string 

    # Reads in the first operand 
    li $v0, 5    # syscall number 5 will read an int 
    syscall     # actually read the int 
    move $s0, $v0   # save result in $s0 for later 


    # Prints the second prompt 
    li $v0, 4    # syscall number 4 will print string whose address is in $a0 
    la $a0, promptSecond # "load address" of the string 
    syscall     # actually print the string  

    # Reads in the second operand 
    li $v0, 5    # syscall number 5 will read an int 
    syscall     # actually read the int 
    move $s1, $v0   # save result in $s1 for later 

    # Prints the third prompt 
    li $v0, 4    # syscall number 4 will print string whose address is in $a0 
    la $a0, promptThird # "load address" of the string 
    syscall     # actually print the string  

    # Reads in the third operand 
    li $v0, 5    # syscall number 5 will read an int 
    syscall     # actually read the int 
    move $s2, $v0   # save result in $s2 for later 



jal LOOP 

ENDLOOP: 
j EXIT 



LOOP: 




    la $a0, $s0 # load the address of the principal 
    la $a1, $s1 # load the address of the interest 
    la $a2, $s2 # load the address of the goal principal 


    lwc1 $f2, ($a0)  # load the principal 
    lwc1 $f4, ($a1)  # load the interest rate  
    lwc1 $f6 ($a2) 

    mul.s $f12, $f4, $f2 # calculate the balance 
    swc1 $f12, ($a0) 

    li $v0, 4    # syscall number 4 will print  string whose address is in $a0 
    la $a0, promptNow  # "load address" of the string 
    syscall     # actually print the string 
    li $v0, 2    # system call #2  
    syscall 

    addi $sp,$sp,-4  # push the current return address 
    sw $ra,($sp)  
    beq $f12, $f6, LOOPRET 

    beq $f12, $f6, ENDLOOP 

    jal LOOP 


LOOPRET: 

    lw $ra,($sp)  # pop the saved return address 
    addi $sp,$sp,4  
    jr $ra 






EXIT:  
jr $ra 

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

ответ

0
la $a0, $s0 # load the address of the principal 

Скомпилирует ли это? Целью la является [L] od [A] ddress метки. Вы не можете взять адрес регистра.

lwc1 $f2, ($a0)  # load the principal 

Ввод неверного значения в $a0 в стороне, lwc1 не выполняет какое-либо преобразование целочисленных к-поплавка. Таким образом, вы не получите надлежащего поплавка, сделав это.

То, что вы, вероятно, нужно сделать, это лом la/lwc1 инструкции по и вместо того, чтобы использовать что-то вроде:

mtc1 $s0,$f2  # move $s0 to floating point register $f2 
cvt.s.w $f2,$f2 # convert the integer in $f2 to a float 
# ..similarly for the rest of your values 
+0

Спасибо, Im действительно новое ассемблере. Причина, по которой я использовал инструкцию la, заключалась в том, что я загружался в переменную .float, которую я объявил как PRINCIPAL, которая = 100. И я использовал (la $ a0, PRINCIPAL). Я сделал эту часть, поскольку я настраивал ее, чтобы заставить рекурсию работать. Я предполагаю, что я предположил, что часть PRINCIPAL - это всего лишь место памяти, в котором хранилось 100. Таким образом, мой мысленный процесс заменил его на место памяти пользователя, вмененного принципалу. Но я думаю, я был совершенно неправ. = S настолько запутанным. Уже поздно здесь. Завтра я проверю решение. Я очень ценю ваш ответ. Спасибо! – user2206189

+0

Я пробовал исправить. Я получил эту ошибку компиляции. Но теперь я получаю ошибку компиляции с вызовами функции beq. существует ли точка с плавающей запятой? – user2206189

+0

См. Http://www.doc.ic.ac.uk/lab/secondyear/spim/node20.html – Michael

Смежные вопросы