# CSPT10 Computer Architecture III
## Implementing PUSH, POP
```
import sys
# a simple data-driven machine that reads instructions out of memory
# and executes them
PRINT_HI = 1
HALT = 2
PRINT_NUM = 3
SAVE = 4 # save a value to a register
PRINT_REGISTER = 5 # prints the value of a register
ADD = 6 # adds values from two registers x, y and stores it in register x
PUSH = 7
POP = 8
def loadMemory():
memory = [
PRINT_HI, # prints hi
SAVE, # saves 65 into register 2
65,
2,
PUSH, # push value (65) in reg 2 to the stack
2,
SAVE, # save 99 into reg 2
99,
2,
PUSH, # push value (99) in reg 2 to the stack
2,
POP, # pop value (99) and store it in reg 0
0,
PRINT_REGISTER, # print value stored in register 0 (99)
0,
POP, # pop value (65) and store it in reg 0
0,
PRINT_REGISTER, # print value stored in register 0 (65)
0,
HALT # stop the program
]
spaceForStack = 128 - len(memory) # assume we have 128 bytes of memory only
memory += [0] * spaceForStack
return memory
memory = loadMemory()
pc = 0 # program counter - points to the instruction we're currently executing
running = True
SP = 7
registers = [0] * 8
registers[SP] = len(memory) - 1
while running:
commandToExecute = memory[pc]
if commandToExecute == PRINT_HI:
print("hi")
pc += 1
elif commandToExecute == HALT:
running = False
elif commandToExecute == PRINT_NUM:
numToPrint = memory[pc + 1]
print(numToPrint)
pc += 2
elif commandToExecute == PRINT_REGISTER:
reg = memory[pc + 1]
print(registers[reg])
pc += 2
elif commandToExecute == SAVE:
numToSave = memory[pc + 1]
registerToSaveItIn = memory[pc + 2]
registers[registerToSaveItIn] = numToSave
pc += 3
elif commandToExecute == ADD:
regA = memory[pc + 1]
regB = memory[pc + 2]
sumOfRegisters = registers[regA] + registers[regB]
registers[regA] = sumOfRegisters
pc += 3
elif commandToExecute == PUSH:
# takes in a register number and saves the value in it onto the stack
# decrement the stack pointer
registers[SP] -= 1
# store the value in the register onto the top of the stack
registerToGetValueIn = memory[pc + 1]
valueInRegister = registers[registerToGetValueIn]
memory[registers[SP]] = valueInRegister
pc += 2
elif commandToExecute == POP:
# pops the value from the top of the stack and stores it in a given register
# read the value from the top of the stack
topmostValueInStack = memory[registers[SP]]
# store value to the given register
registerToStoreItIn = memory[pc + 1]
registers[registerToStoreItIn] = topmostValueInStack
# increment stack pointer
registers[SP] += 1
pc += 2
else:
print("ehh idk what to do")
sys.exit(1)
```
## Guided Project Pt. II
### ls8.py
```
import sys
from cpu import *
def main(argv):
"""Main."""
if len(argv) != 2:
print(f"usage: {argv[0]} filename", file=sys.stderr)
return 1
cpu = CPU()
cpu.load(argv[1])
cpu.run()
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv))
```
### cpu.py
```
def load(self, filename):
"""Load a program into memory."""
address = 0
with open(filename) as fp:
for line in fp:
comment_split = line.split("#")
num = comment_split[0].strip()
if num == '': # ignore blanks
continue
val = int(num, 2)
self.ram_write(val, address)
address += 1
```