У вас есть как минимум четыре проблемы:
Во-первых, в вашем коде для for (i = 0; i < comps; i++)
отсутствует часть i = 0
. Хотя у вас где-то есть i = 0
, иметь его в неправильном месте не считается. Он есть вне всех циклов, и, как вы можете видеть, for
находится внутри while
- поэтому код C делает i = 0
внутри while
l oop, но ваша сборка этого не делает, поэтому он не будет вести себя так же.
Во-вторых, ваш оператор if-then не соответствует хорошей схеме сборки. Хороший шаблон для if-then в стиле if-goto-label сборки:
Pseudo C code:
if ( condition ) {
do something;
}
// if statement completed, on to whatever statement comes next
в стиле if-goto-label сборки ( хотя все еще используется псевдо C):
if ( ! condition ) goto ifEnd;
do something;
ifEnd:
// if statement completed, on to whatever statement comes next
Подробно опишите точный поток управления кода C и сделайте, чтобы ваша сборка имела тот же поток управления. Не пытайтесь использовать альтернативный поток управления из кода C.
Существуют и другие шаблоны для реализации if-then, но большинство альтернативных форм позволяют очень легко потерять правильную перспективу, что это if-then вложен в for для l oop - и именно эта вложенность в коде C определяет, какой оператор (фрагмент) следует после if-then , запускается ли if-then или нет . Надеюсь, вы можете увидеть, используете ли вы выше шаблон в стиле if-goto-label сборки, что правильный оператор next будет выполняться next независимо от того, сработает ли if .
while Ваш код не так уж далек от правильности, не бойтесь начинать все сначала. Если вы используете больше строгости - придерживайтесь кода C и его вложенных конструкций (if должен быть полностью внутри for, что будет после if-then, et c).
Придерживайтесь выполнения составных частей в том же порядке, в котором их выполняет код C - не пытайтесь переставлять составные части кода (пока вы не узнаете, что делаете).
Не делайте застрять, думая, что ваш единственный вариант - угадать, как исправить испорченный код сборки, поскольку это может быть очень сложно.
Вы используете регистры $s5
и $s6
, но никогда не помещать в них ничего.
Любой код между безусловной ветвью и следующей меткой недоступен,
j somewhere123
li $v0, 4
la $a0, helloworld
syscall
somelabel456:
В приведенном выше коде системного вызова между j somewhere123
и somelabel456:
определенно недоступен и, следовательно, «мертв», т.е. никогда не используется; не может служить цели.