цикл while в MIPS - PullRequest
       4

цикл while в MIPS

1 голос
/ 29 марта 2012

Я пытаюсь сделать базовый пример цикла while, готовясь к следующему заданию, и застрял в бесконечном цикле.$ t3 ​​никогда не достигает 3, или он не обнаруживает, что его в 3. Что я здесь делаю неправильно?Спасибо!

.data           #data segment


msg1:.asciiz "please enter a number to convert to ASCI:  "
    nl:.asciiz "\n"
msg2:.asciiz "done!  "



.text           # Code segment
.globl main     # declare main to be global
main: 

    la $a0,msg1       # $a0 := address of message 1

    li $v0,4               # system call, type 4, print an string
    syscall

    li $t3,0 #initial value of $t3


    li $v0,5
    syscall #read an int

loop:

    la $a0,msg1       # $a0 := address of message 1

    li $v0,4               # system call, type 4, print an string
    syscall


    addi $t3,$t3,1  

    beq $3,$t3,Exit # branch to the label Exit if $t3=3

    j loop # branch unconditionally to loop ($t3 != 0)  

Exit:   
    li $v0,10       # System call, type 10, standard exit
    syscall   

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Проблема здесь:

beq $3,$t3,Exit

$3 - это регистр ;это , а не значение 3. Это относится к содержимому регистра $3, который на самом деле $v1, который содержит значение 0, потому что вы ничего там не поместили.Таким образом, вместо сравнения со значением 3 вы сравниваете с 0. (На самом деле это не бесконечный цикл, поскольку $t3 в конечном итоге обернется до 0, но вы поняли.)

MIPSотсутствует инструкция для сравнения с немедленной, поэтому вам нужно сначала загрузить значение 3 в регистр.

Добавьте эту строку перед циклом, потому что вам нужно загрузить значение только один раз:

li $t4, 3

И измените свое сравнение на это:

beq $t4, $t3, Exit

Это выведет вас из цикла.Затем ваша программа напечатает msg1 три раза и выйдет, что, я подозреваю, не то, что вам нужно, но, надеюсь, это позволит вам продолжить работу.

0 голосов
/ 29 марта 2012

Если вы хотите сравнить регистр с немедленным и ответвлением согласно этому сравнению, вы должны использовать две инструкции, slti и любую из инструкций перехода. Инструкция slti $t, $s, imm установит регистр $ t равным 1, если содержимое $ s меньше, чем непосредственное значение, и ноль в противном случае.

Поэтому, чтобы перейти, когда регистр $ t3 равен 3 (при условии, что он начинается с 0 и увеличивается в каждом цикле), вы должны сделать

  slti $a0, $t3, 3  # Sets $a0 to 1 if $t3 < 3, 0 otherwise
  beq $a0, $0, loop # Jumps to 'loop' when $t3 < 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...