There are three memory opcodes that are important for us. One for loading and two for storing.

MLOAD lets us load one word specified by an offset. A word is 32 bytes.

MSTORE allows us to save one word to memory and MSTORE8 allows us to save one byte to memory.

def mload(evm): 
    offset = evm.stack.pop()
    value = evm.memory.load(offset)
    evm.stack.push(value)
    evm.pc += 1
def mstore(evm): 
    # TODO: should be right aligned
    offset, value = evm.stack.pop(), cpu.stack.pop()
    evm.memory.store(offset, value)
    evm.pc += 1
def mstore8(evm): 
    offset, value = evm.stack.pop(), evm.stack.pop()
    evm.memory.store(offset, value)
    evm.pc += 1