Я пытаюсь написать программу в сборке, которая будет действовать как счетчик совокупных процентов, который использует рекурсивный цикл. Мне удалось заставить программу работать с набором 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 гораздо больше к проблеме, которую мне нужно сделать. Но сначала мне нужно пройти эту часть. Я чувствую, как будто я истощил свой мозг
Спасибо, Im действительно новое ассемблере. Причина, по которой я использовал инструкцию la, заключалась в том, что я загружался в переменную .float, которую я объявил как PRINCIPAL, которая = 100. И я использовал (la $ a0, PRINCIPAL). Я сделал эту часть, поскольку я настраивал ее, чтобы заставить рекурсию работать. Я предполагаю, что я предположил, что часть PRINCIPAL - это всего лишь место памяти, в котором хранилось 100. Таким образом, мой мысленный процесс заменил его на место памяти пользователя, вмененного принципалу. Но я думаю, я был совершенно неправ. = S настолько запутанным. Уже поздно здесь. Завтра я проверю решение. Я очень ценю ваш ответ. Спасибо! – user2206189
Я пробовал исправить. Я получил эту ошибку компиляции. Но теперь я получаю ошибку компиляции с вызовами функции beq. существует ли точка с плавающей запятой? – user2206189
См. Http://www.doc.ic.ac.uk/lab/secondyear/spim/node20.html – Michael