Раз уж я вернулся к теме ассемблера, стоит посмотреть и случай, когда регистров начинает не хватать.
читать дальшеНапример, есть некоторый код на Си:
Тут локально объявляется буфер размером 32 байта, который затем заполняется чем-то. В регистры запихать его, конечно, ещё можно, но это весьма неудобно. Конечно, можно объявить этот буфер обычным образом в статической памяти, в сегменте данных:
Но это слишком жирно. Тратить целых 32 байта навсегда на то, что, может, отработает всего один раз... Брр. Лучше уж выделить их тогда, когда они реально понадобятся, прямо в функции, стек же есть.
Перед блоком, где нам понадобятся локальные переменные надо на стеке выделить память, сдвинув указатель на нужное количество байт, округлённое до ближайшего большего кратного восьми числа. И потом можно обращаться к переменным по смещениям относительно SP. И можно обзывать смещения по именам, как регистры периферии относительно базы.
Мм, как-то так что ли.
Кстати, должно быть понятно, почему нельзя возвращать указатель на буфер, объявленный таким вот образом внутри функции:
После выхода из функции стек будет достаточно быстро перезаписан чем-нибудь ещё, а ведь туда будет указатель смотреть. И хорошо если никто не попробует по этому указателю что-либо записывать.
Файлы: main.s
Проект.
<< Предыдущее Следующее >>
STM32F4. Локальные переменные в ассемблере
Раз уж я вернулся к теме ассемблера, стоит посмотреть и случай, когда регистров начинает не хватать.
читать дальше
<< Предыдущее Следующее >>
читать дальше
<< Предыдущее Следующее >>