Почему моя программа сборки не устанавливает правильное значение r1?

Я пишу программу сборки на машине LC3.

Моя программа сборки - это программа LC3, которая умножает R2 и R3 и сохраняет результат в R1.

Вот мой исходный код (с комментариями)

;Sets pc to this address at start of program 
.ORIG x3000
;R1 will store the result lets clear it(ANd with 0)
AND R1,R1,x0
;R2 will be multiplied by R3, let's clear both of them 
AND R2,R2,x0
AND R3,R3,x0
;Test case 4 * 3 = 12;
ADD R2,R2,4
ADD R3,R3,3
;Add to increment zone 
LOOP Add R1,R1,R2;
;Decrement the counter, in this case the 3 or R3
ADD R3,R3,x-1
BrP LOOP
HALT
.END

Мой тестовый пример умножается на 4 * 3. Результат должен быть 12, и это должно быть сохранено в R1. Однако, когда я запускаю эту программу в моем симуляторе LC3, это то, что я получаю для вывода

R3 содержит правильное значение в конце, но R1 содержит -1 .... Кто-нибудь видит проблему с моим кодом? Я удостоверился, что очистил R1 в начале и продолжил добавлять R3 к R1 и сохранять результат в R1, пока счетчик, R3 или 3 в этом случае больше нуля.

Ответы на вопрос(1)

Ваш ответ на вопрос