Memory & Data
LD, ST & LEA
PC-relative addressing and loading effective addresses.
PC-Relative Addressing
The most common way to access memory in LC-3 is PC-relative: the instruction contains a 9-bit signed offset that's added to the current PC.
LD — Load
LD DR, LABEL loads the value at the labeled memory address into DR..ORIG x3000
LD R0, VALUE ; R0 = memory[address of VALUE] = 42
HALT
VALUE .FILL #42
.ENDST — Store
ST SR, LABEL writes the value in SR to the labeled memory address..ORIG x3000
AND R0, R0, #0
ADD R0, R0, #7
ST R0, RESULT ; memory[RESULT] = 7
HALT
RESULT .FILL #0
.ENDLEA — Load Effective Address
LEA DR, LABEL computes the address of the label and stores it in DR. It does NOT access memory — it just calculates the address.
This is crucial for working with strings and arrays:
.ORIG x3000
LEA R0, HELLO ; R0 = address of HELLO string
PUTS ; Print the string at address in R0
HALT
HELLO .STRINGZ "Hello, LC-3!"
.ENDLEA does not read from memory. LD R0, X loads the value stored at X. LEA R0, X loads the address of X into R0.
Exercise
Write a program that loads two values from memory, adds them, stores the result back to memory, and prints "OK". Use labels DATA1, DATA2, and RESULT.
1
R0
x00000
R1
x00000
R2
x00000
R3
x00000
R4
x00000
R5
x00000
R6
x00000
R7
x00000
PCx3000
CC
NZP
Quiz
What is the difference between `LD R0, X` and `LEA R0, X`?