Да мы -то не трогаем…(я условно расписал чтоб мою мысль пояснить , а вот проц потом когда я число положу в стек и оно займет 4 байта , он SP должен записать новый адрес SP-4 … это будет новая вершина стека — разве нет
или тут опять указатель указателя…
Мы же не через PUSH записываем ! Мы пишем/читаем в стек как просто в память ST LD
Может так будет ясно:
Вот тут мы двигаем SP назад:
4 POP ликвидируют наше окно в стеке
Ладно … видимо изначально с числом неудачный пример т.к он в стек ложит не число а регистры в которых указатель на адрес где число … а если строка из 20 байт
конкретно наше число по байтно пишется в регистры и регистры летят в память через ST Y+
https://forum.arduino.ru/uploads/default/original/2X/0/049068822331879f7f8807d4f1f830f344dee368.png
Со строками в AVR вообще каламбур …
не суть … ложит 20 байт необязательно строку Вотт просто 20 байт. , ну просто чтоб регистры не использовать
Принцип тот же :
SP=SP-20
SP скопируется в другую пару
по адресу из этой пары с инкрементом в цикле будет скопировано 20 чисел
8! = 40320 - это дофига!
А… Кажется до меня дошло … он ложит старые значения из регистров в стек потом освобождает место под новые данные 4 байта (20 байт) (SP уменьшился на 4(20) , после этого заносит адрес который получился после освобождения под данные опять в регистр Y ( тоже -4 (20), и потом просто увеличивает этот адрес занося мое число как обычно … т.е адрес данных как и положено уменьшается , но число при этом записывается как обычно и таким образом в
&t он показывает адрес уже не начала заноса моих данных а конец. и тогда если я возьму байт + 2 с адреса &t то все будет верно…
Не лезьте вы пока в память и указатели. Каша у вас там пока, по всем вопросам…
Даже не знаю что посоветовать, не знаю где это может быть описано.
По хорошему нужно с асм отладчиком походить по сишным программам для понимания того, что происходит. Сравнивая асм код в отладчике с программой на Си. Но может кто то посоветует тулзу.
Почти верно, но адрес на НАЧАЛО (младший адрес в памяти)
SP был 8FA , он освободил место под 4 байта, SP стал 8F6 , и он понему прописал 4 моих байта 8F6,8F7,8F8,8F9 как и положено каждый байт с увеличением адреса , т.е $t+2 будет 8F8
Указатель память тесно связаны , поэтому и каша , чтобы разобрать как раз надо туда лесть…
Проблема с отладчиком , я уже пару тем назад пытался узнать как дампы смотреть не через Ж… В итоге вышло 2 варианта студия с которой щас пытаюсь разобраться и вот подсказали протеус тоже с аурдино кодом рулит…
SP указывает на СВОБОДНУЮ ячейку
8FA он был до PUSH R29
8F9-4=8F5 копируется в Y
Y+1 = 8F6
Y+2 = 8F7
…
Ну да так и написал , может сумбурно …но по крайне вроде как понятно стало
Ну нет, не дофига. Вопрос в том, насколько глубоко ты можешь спуститься в стек. Один раз вызвал функцию… другой… А вот тут и низзя более 8-ми уровней. И это забито на физике!
адрес Y -16 разве нет SP тоже
Пруф есть ?
uint32_t f (uint32_t p) {
return p?p*f(p-1):1;
}
void setup () {
Serial.begin(9600);
Serial.println("Start");
Serial.println(f(12));
}
void loop() {
}
Я уж подумал что в Си для AVR что то поменялось …
А… А я уже было подумал что вы прикалываетесь.)