2016-01-24 3 views
0

Попытка сделать простой оператор if для школьного задания.Если регистр равен 0, то

.data 
Origin: 
    .asciiz "X and Y are at the origin!!!" # string statment for the origin 
inputX: 
    .asciiz "What is the x coordinate?" 

test: 
    .asciiz "this is a test" 
.text 


main: 
la $a0, inputX #puts the inputX string into address 0 
li $v0, 4 # prints a string at address 0 
syscall 

li $v0 , 5 # reads an input integer 
syscall 

move $s0, $v0# moves the value from the input integer into $s0 (x value) 



beqz $s0, EndIf # should be if input we entered was 0 than go to EndIf label 



li $v0, 10 
syscall 

EndIf: la $a0, test #print out our test string 
li $v0, 4 
syscall 

Из того, что я понимаю. Beqz проверяет, равен ли значение $ s0. Из этого он должен пойти на мой лейбл.

Это та часть, которая меня смущает. Куда идет эта этикетка? Как он решает, когда мы не на этикетке и хотим вернуться к исходному коду?

В принципе, если мой вход для й равно 0, я хочу, чтобы распечатать мою «тест» строка

+0

занимает всего несколько секунд, чтобы написать функцию c, скомпилировать и дизассемблировать, чтобы узнать, как это делает компилятор ... –

ответ

0

Филиалов в сборке не как подпрограмм. После того, как вы перейдете на номер строки, вы теперь находитесь в этом номере линии, и вы продолжаете увеличивать счетчик программ оттуда. Итак, как только вы дойдете до Endif: вы сейчас в Endif, вы напечатаете эту строку и убегаете в неинициализированную память. Механизма нет.

Рассмотрим следующий пример:

.data 
IF_STRING: .asciiz "IF\n" 
ELSE_STRING: .asciiz "ELSE\n" 
END_STRING: .asciiz "END\n" 

.text 
main: 
    li $s0,2 
    bnez $s0,ELSE 

    la $a0,IF_STRING 
    li $v0,4 
    syscall 

    b END 

ELSE: 
    la $a0,ELSE_STRING 
    li $v0,4 
    syscall 

    #b END is implicit here -- you simply fall straight through 

END: 
    la $a0,END_STRING 
    li $v0,4 
    syscall 

    li $v0,10 
    syscall 

Если вы установили $ s0 0, вы будете идти через «IF» части кода - если это не ноль он будет прыгать на " ELSE ". Там нет возврата, поэтому, чтобы перейти к следующей части программы, вы можете напрямую перейти на метку END. В части ELSE нет необходимости в ветви, поскольку она просто перейдет к следующей строке (и тратит кучу времени на это).

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