El LC-3 es una CPU clásica de instrucciones de tamaño fijo con registros de 16 bits, direcciones de 16 bits e instrucciones de 16 bits. Por lo tanto, no puede haber una (única) instrucción que pueda cargar cualquier valor de 16 bits en una dirección.
La forma clásica de resolver esto (el ARM, por ejemplo, también lo utiliza) es usar el direccionamiento relativo a la PC para acceder a una palabra de memoria donde se almacena el valor de 16 bits. Esta palabra de memoria debe estar lo suficientemente "cerca" de la instrucción para que sea direccionable mediante el desplazamiento (en este caso de 9 bits) que encaja en la instrucción.
Ver Lecture_10-310h.pdf (segundo hit gooling "LC-3"), hoja 12:
Una forma (ineficiente) de tener cerca la palabra de memoria es almacenarla en una palabra que se salta:
LD reg, <offset of dataword>
BR continue
dataword: < put 16-bits data here >
continue:
Tenga en cuenta que esto le deja algunos detalles para que los descubra, en particular cómo se calcula y se representa el desplazamiento.
(La forma más eficiente es agrupar un grupo de palabras de datos de este tipo fuera de una subrutina, por lo que no se necesitan las instrucciones de salto).
Otra forma clásica (algo más rápida y compacta) de resolver este problema (cargar N bits de datos en un conjunto de instrucciones de tamaño fijo en N bits) es cargar los datos en dos instrucciones. De alguna manera, una instrucción debe cargar bits diferentes a la segunda. En el ARM clásico, esto podría hacerse cargando primero un literal desplazado en los 16 bits superiores, y el OR o ADD con un literal en los 16 bits inferiores. Pero el LC-3 no parece tener una instrucción de cambio efectiva (requeriría una secuencia de agregados), por lo que sería muy ineficaz.