2015-02-23 2 views
1

В настоящее время я работаю над назначением класса, которое требует от нас принимать значения входных данных для двух переменных (a и b) и решать уравнение [a-ab + 8a-10b + 19] используя только стек и регистрирует $ t0 и $ t1.MIPS сборка, стеки и основное дополнение

Я понимаю, что мне нужно делать, но я не могу понять, почему моя программа отображает неправильные решения при компиляции. С стеками я должен, например, ссылаться на конкретные местоположения [4 ($ sp)], когда я поплю и нажимаю? Я получаю непоследовательные ответы от googling.

Приносим извинения за любые странные методы, которые вы видите здесь, я ждал с ним некоторое время, но безрезультатно.

результаты: [а = 4, Ь = 3, решение = 51] [а = 6, б = 4, решение = 67]

.data 

aprompt: .asciiz "Input a value for a: " 
bprompt: .asciiz "Input a value for b: " 
eq:   .asciiz "a - ab + 8a - 10b + 19 = " 

    .text 

main: 

    la $a0, aprompt   # print the prompt for a 
    li $v0, 4 
    syscall 

    li $v0, 5    # read input as integer 
    syscall 
    move $t0, $v0   # store variable a in $t0 

    la $a0, bprompt   # print the prompt for b 
    li $v0, 4 
    syscall 

    li $v0, 5    # read input as integer 
    syscall 
    move $t1, $v0   # store variable b in $t1 

    addi $sp,$sp,-4   # decrement stack pointer by 4 
    sw $t0,($sp)   # push a on the stack at 0 

    mult $t0,$t1   # a*b 
    mflo $t0    # store result in $t0 
    addi $sp,$sp,-4   # decrement stack pointer by 4 
    sw $t0,($sp)   # push a*b on the stack at 4 

    li $t0,10    # load 10 into $t0 
    mult $t0,$t1   # 10*b 
    mflo $t0    # store result in $t0 

    lw $t1,($sp)   # pop the stack and store in $t1 
    addi $sp,$sp,4   # increment stack pointer by 4 

    add $t0,$t0,$t1   # add a*b and 10*b 
    lw $t1,($sp)   # pop the stack and store in $t1 
    addi $sp,$sp,-4   # decrement stack pointer 
    sw $t0,($sp)   # push a*b+10*b on the stack at 0 
    addi $sp,$sp,4   # increment stack pointer 

    li $t0,8    # store 8 in $t0 
    mult $t0,$t1   # 8*a 
    mflo $t0    # store in $t0 

    addi $t1,$t1,19   # a + 19 

    add $t0,$t0,$t1   # store (a + 19) + 8*a in $t0 

    lw $t1,($sp)   # pop the stack and store in $t1 
    sub $t0,$t0,$t1   # (a + 19 + 8a) - (ab + 10b) 

    move $a0,$t0   # print solution as integer 
    li $v0,1 
    syscall 

    li $v0, 10    # exit 
    syscall 
+0

* "С стеков я должен ссылаться на конкретные места [4 ($ зр), например], когда я поп и толчок? »* Это ваш наставник, которого вы должны спросить, а не нас. Во всяком случае, это единственный способ выскочить и нажать на стек в MIPS. – m0skit0

+0

Пожалуйста, разместите весь свой код, чтобы я мог его отладить. Вы используете SPIM или MARS? – m0skit0

+0

О, и это не [* уравнение *] (http://en.wikipedia.org/wiki/Equation). – m0skit0

ответ

2
lw $t1,($sp)   # pop the stack and store in $t1 
sub $t0,$t0,$t1   # (a + 19 + 8a) - (ab + 10b) 

lw $t1,($sp) фактически выскакивают a, а не ab + 10b ,

Вы можете это исправить, суя ab + 10b вместо от $ зр - 4.

add $t0,$t0,$t1   # store (a + 19) + 8*a in $t0 
addi $sp,$sp,-4   # decrement stack pointer 
lw $t1,($sp)   # pop the stack and store in $t1 

sub $t0,$t0,$t1   # (a + 19 + 8a) - (ab + 10b) 
+0

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

+0

Yup, вот и все :) Кстати, я настоятельно рекомендую использовать MARS вместо SPIM. Они совместимы, но MARS ** MUCH ** лучше для отладки. – m0skit0

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