Print contents of register to console in LC3 Assembly

sa044512 picture sa044512 · Oct 28, 2015 · Viewed 19.3k times · Source

Say I have a value (eg. 1234) that I load into R0. How could I print this value to the console?

Answer

Chris M picture Chris M · Oct 28, 2015

I'm assuming you would like to print a number out to the console but you're getting random characters if anything.

This happens when the LC3 tries to interpret your number as an ASCII character. Example: The number 8 in ASCII is the backspace character.

To make your program work you will need to add 48 (decimal) or x30 (hex) to your number before you can print it to the console.

.ORIG x3000
  AND R0, R0, #0    ; Clear R0
  LD R0, NUM        ; load our number into R0
  LD R2, ASCII      ; load the ascii offset into R2
  ADD R0, R0, R2    
  OUT
HALT                ; Trap x25

NUM   .fill  x02    ; Our Number to print
ASCII .fill  x30    ; Our ASCII offset
.END

In your example you want to print off an array of characters like 1234. The concept for this is pretty similar but we'll need to work with pointers and a for loop.

.ORIG x3000
  AND R0, R0, #0    ; Clear R0
  AND R1, R1, #0    ; Clear R1
  AND R3, R3, #0    ; Clear R3
  LEA R0, NUM       ; pointer [mem]NUM
  ADD R1, R1, R0    ; Store the pointer address of R0 into R1
  LD R2, ASCII      ; load the ascii offset into R2

FOR_LOOP
  LDR R4, R1, #0    ; load the contents of mem address of R1 into R4
  BRz END_LOOP
  ADD R4, R4, R2    ; Add our number to the ASCII offset
  STR R4, R1, #0    ; Store the new value in R4 into [mem] address R1
  ADD R1, R1, #1    ; move our memory pointer down one
  BRnzp FOR_LOOP    ; loop again until we get an x00 char
END_LOOP

  PUTs              ; print our string starting from [mem]address in R0
HALT                ; Trap x25

ASCII .fill  x30    ; Our ASCII offset
NUM   .fill  x01    ; Our Number to print
      .fill  x02     
      .fill  x03
      .fill  x04
.END