Заинтересовало, по быстрому написал первоначальный вариант, но не проверял.
CODE
#pragma segment="RSTACK"
static __no_init unsigned char a[1] @ "RSTACK";
typedef char ( *point_to_lowlevelinit)(void);
char __low_level_init()
{
register unsigned int count=__segment_size("RSTACK")-1;
count-=sizeof(point_to_lowlevelinit);
while(count)
{
a[count]='R';
count--;
}
return 1;
}
Небольшие комментарии:
1. переменная а служит лишь меткой, для того чтобы компилятор занес в пару регистров начало RSTACKа
По хорошему нужно брать значение из переменной SP, которая уже отступила от вершины стека на 1 адрес.
2. переменная count описана как register чтобы надеяться, что компилятор не трогал софт-стек.
3. определение point_to_lowlevelinit введено лишь для получения размера адреса возврата который уже занесен
в стек - нужно отнять от это количество от count чтобы не затереть этот адрес.
Здесь в документации лучше бы найти более подходящий способ, наверняка должны быть какие-то системные константы.
Для заполнения софт-стека действуем аналогично.
Еще бы нужно добавить через pragma отключение оптимизации для этой функции.
Сообщение отредактировал aiwa - Apr 20 2016, 00:37