def _create_memory_variable(self, action, addr, addrs):
        """
        Create a SimStackVariable or SimMemoryVariable based on action objects and its address.

        :param SimAction action: The action to work with.
        :param int addr:         The address of the memory variable in creation.
        :param list addrs:       A list of all addresses that the action was effective on.
        :return:
        """

        variable = None
        if len(addrs) == 1 and len(action.addr.tmp_deps) == 1:
            addr_tmp = list(action.addr.tmp_deps)[0]
            if addr_tmp in self._temp_register_symbols:
                # it must be a stack variable
                sort, offset = self._temp_register_symbols[addr_tmp]
                variable = SimStackVariable(offset, action.size.ast // 8, base=sort, base_addr=addr - offset)

        if variable is None:
            variable = SimMemoryVariable(addr, action.size.ast // 8)

        return variable