LC3 Монтажная площадь N

Привет, я пытаюсь написать программу сборки lc3, которая вычисляет квадрат числа и сохраняет его в r0, целое число задается в качестве параметра и находится в r1, проблема, которую я заметил во время отладки, возникает во время первого прохода. добавляет 2, но при втором проходе не удается добавить еще 2 к r0. Мой код ниже, любая помощь приветствуется

           .orig x3FF8
      ld r1,n
    ld r5,n

  square
 add r2,r1,#0

  add r5,r5,#-1
add r0,r2,#0
brzp square
brn theend

  theend


halt
 n .fill #2

 .end

мой окончательный код благодаря пользователю, который помог:

    .orig x3FF8
     ld r1,n
    ld r5,n

   square


  add r2, r2,r1

  add r5,r5,#-1

  brp square


  theend


 halt
  n .fill #4

 .end

person rahulchawla    schedule 12.12.2017    source источник


Ответы (1)


Если я правильно помню синтаксис LC-3, add r2,r1,#0 делает r2 = r1 + 0, так что на самом деле он никогда не добавлялся к r2, а просто перезаписывал его r1.

Вам нужно нечто подобное вне цикла для инициализации r2.

Но внутри цикла вам нужен add r2, r2, r1, который выполняет r2 = r2 + r1, то есть r2 += r1.


Я не понимаю, почему у вас также есть add r0,r2,#0 внутри цикла. Если вы хотите получить окончательный результат в r0, сначала накопите его в r0. Если это должна была быть сумма сумм, то у вас тот же баг.

Также обратите внимание, что add r5,r5,#-1 должен быть последним, поэтому флаги кода условия устанавливаются из него для ветви цикла, а не из add r0, r0, r2 или чего-то еще, что вам нужно внутри цикла.


Кроме того: brn theend совершенно бесполезен: theend находится на следующей строке, и выполнение продолжается до следующей строки самостоятельно. Вам не нужно перепрыгивать через пробелы в исходном коде!

person Peter Cordes    schedule 12.12.2017
comment
1. о, я предполагал, что это будет сумма суммы в r2, спасибо, это сделало это намного яснее, я был продолжен с добавлением, я думаю, я перезаписывал регистр 2 - person rahulchawla; 12.12.2017
comment
Вопрос. В конце я пытаюсь добавить строку r0, r2, # 0, чтобы сохранить суммы сумм в r0, однако это дает 7fff, как вы сказали, не следует ли заменять r0 на 25, если r2 имеет 25 - person rahulchawla; 12.12.2017
comment
@rahulchawla: Вы заметили редактирование о том, что флаги не стираются с помощью add после счетчика цикла add r5,r5,#-1? (первоначально заметил @ Brandon). Перемещение этой инструкции за пределы цикла решит вашу проблему. Используйте отладчик для пошагового выполнения вашего кода и просмотра изменений регистров (например, для небольших входных данных, таких как 2 или 3). - person Peter Cordes; 12.12.2017
comment
Вопрос (назначение) указывает одну подпрограмму. Вот почему я хотел сделать все в цикле @peter, и вы говорите, что переместите добавление r5, r5, #-1 за пределы цикла, если я правильно понимаю - person rahulchawla; 12.12.2017
comment
@rahulchawla: цикл не является подпрограммой. И к тому же нужно инициализировать регистры перед циклом. Если вы не хотите никаких инструкций, кроме halt после цикла, то сделайте то, что я предложил, и сначала накопите сумму в r0, чтобы вам не нужно было ее никуда перемещать. Всякий раз, когда у вас есть инструкция перемещения, которая просто копирует регистр, посмотрите, сможете ли вы устранить ее, сгенерировав значение в правильном регистре в первую очередь. - person Peter Cordes; 12.12.2017
comment
не будут ли регистры изначально пустыми ..? - person rahulchawla; 12.12.2017
comment
Я попытался заменить add r2, r2, # 1 на add r0, r0, # 1, однако есть строка LD R0, xFD7D, которая меняет значение в регистре после обработки моего кода, поэтому в конце r0 показывает 7fff Im действительно смущен тем, почему r0 манипулирует @Peter Cordes - person rahulchawla; 12.12.2017
comment
@rahulchawla: в начале произвольной функции нет, вызывающая сторона могла оставить там любые значения. Если в состоянии запуска машины (или процесса) LC-3 все регистры гарантированно обнулены, а не не определены (т.е. возможно заполнены случайным мусором), то да, вы можете воспользоваться их начальными нулевыми значениями. (Пустой не имеет смысла. Регистры всегда имеют значение. Если известно, что оно равно нулю, это полезно.) - person Peter Cordes; 12.12.2017
comment
@rahulchawla: я никогда не использовал LC-3, просто читал об этом в Интернете. Вы не показали эту инструкцию в своем вопросе. В каком регистре вы хотите получить результат? Поместите туда результат. Конец истории. Если есть инструкция, которая загружает R0 до того, как вы на самом деле halt, удалите эту инструкцию, если она вам не нужна. - person Peter Cordes; 12.12.2017
comment
Я помещаю результат в регистр 0, нет инструкции, которую я написал, которая манипулирует r0, как вы можете видеть, однако в конце значение неверно. @питер кордес - person rahulchawla; 12.12.2017