для памяти данных: использование локальных переменных (stack) использование динамического выделения памяти (heap) использовать возможность работы с битами (различные флаги) для памяти программ: переписать некоторые части в подпрограммы на ассемблере часто используемые кусочки оформить в виде подпрограмм больше использовать циклы для работы с данными