¿Por qué mi programa de ensamblaje no establece r1 en el valor correcto?

Estoy escribiendo un programa de ensamblaje en la máquina LC3.

Mi programa de ensamblaje es un programa LC3 que multiplica R2 y R3 y almacena el resultado en R1.

Aquí está mi código fuente (con comentarios)

;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

Mi caso de prueba está multiplicando 4 * 3. El resultado debería ser 12 y debería almacenarse en R1. Sin embargo, cuando ejecuto este programa en mi simulador LC3, esto es lo que obtengo para la salida

R3 contiene el valor correcto al final pero R1 contiene -1 ... ¿Alguien ve un problema con mi código? Me aseguré de borrar R1 al principio y seguir agregando R3 a R1 y almacenar el resultado en R1 mientras que el contador, R3 o 3 en este caso es mayor que cero.

Respuestas a la pregunta(1)

Su respuesta a la pregunta