Если честно , то да … Выше окно с отладчика все равно показывает работу с относительными адресами … и по нему можно только понять что байты ложит попорядку … а вот порядок попрежнему непонятенб т.к физического дампа нет …а по относительным сложно судить. Да по относительным адреса увеличиваются… но по фмизическаим абсолютно незначит что они не увеличиваются в сторону кучи…
Это как раз строка из дампа !!!
Где ? я только дизассемблированый кусок кода вижу … или я пропустил … сейчас гляну
Или Вы про то , что Serial распечатал ?
08E8: 36 00 08 F5 00 00 00 00 00 00 00 00 00 B5 44 33 22 11 01 0E 02 A5 00 5B
Это строка из AVR DATA MEMORY - дампа памяти
Если не сложно можно полный код … Никак немогу понять для чего in r28,$3D и in r29,$3E,
шт IN загрузить даные из порта а $3D у 328 вроде как EIMSK
/* Main.ino file generated by New Project wizard
*
* Created: Сб окт 31 2020
* Processor: ATmega328P
* Compiler: Arduino AVR (Proteus)
*/
#define printVar(x) do { Serial.print(#x); Serial.print('='); Serial.print(x); Serial.println(';'); } while (false)
#define printVarADDR(x) do { Serial.print("ADDR("); Serial.print(#x); Serial.print(")="); Serial.print((uint32_t)&x, HEX); Serial.println(';'); } while (false)
#define printVarSize(x) do { Serial.print("sizeof("); Serial.print(#x); Serial.print(")="); Serial.print(sizeof(x)); Serial.println(';'); } while (false)
void setup () {
Serial.begin(9600);
Serial.println("Start");
// TODO: put your setup code here, to run once:
}
void loop() {
auto t=0x11223344;
printVar(t);
printVarADDR(t);
printVarSize(t);
// TODO: put your main code here, to run repeatedly:
}
Это указатель стека SP копируется в пару Y
0x3E (0x5E) SPH – – – – – (SP10) SP9 SP8 13
0x3D (0x5D) SPL SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0
Да спасибо понял что это указатель стека , не туда глянул
Ну да судя по дизассемблированому коду , и по дампу адреса почему-то увеличиваются…
а не бегут в сторону кучи..
Это задача на использование стека. Просто задача. Я вот тут как-то вычисление даты Пасхи писал. Это теперь тоже есть в языке?
Кроме того:
- язык определяется не Керниганом и Ритчи, а стандартом языка;
- в теме выше речь шла об аппаратном стека (если Вы знаете, что это такое);
- вы решили поспорить со мною об этом языке? А спорилка у Вас точно выросла?
Нет не выросла … Я не спорщик , просто чтобы разобраться задаю вопросы , которые выглядят как спор… просто указал что В книге которую Вы мне дали Есть про стек и команды работы со стеком, и если я учу язык по книжке , соответственно мне и это надо знать…
Извините если как то Вас задел , Ваши статьи обалденно написаны и чаще всего довольно понятно… но про все Вы не можете писать приходится мучать вопросаи , и если честно немного покоробило -
не надо тебе знать о нем
Указатель головы стека бежит к куче при PUSH и CALL, но сама память то с какого перепугу куда то побежит ?
Ну видать здесь и запутался, т.к решил , что в указателях физические адреса данных которые бегут к кучи и могут ее "пронзить " иначе как они ее пронзают…
Как раз SP указывает на первую свободную (по мнению стека) ячейку - именно физический адрес:
Если долго PUSHить, то можно пропахать не только “кучу” но вообще всю память и регистры …
Если я правильно понимаю это когда адреса копируются аппаратно при обращении к стеку , стек находится общей памяти
Блин вот это и не понятно мне … стек расспалагается в самом конце памяти (физической памяти ) и соответственно если в него ложишь байты а они еще и увеличивают адрес … куда если он в самом конце и как он тогда стремиться к куче которая вначале …
, но дамп да показывает увеличение… вот мозг и кипит от несоответствия … вот только где несоответствие неразбирусь. У меня в самом начале тоже показало , что адреса начали увеличиваться , когда через сериал смотрел … решил , что глюк спросил … оказалось не у меня одного увеличиваются, следовательно я что-то непонимаю в концепции стека…
Википедия - стэк.
И да, в разных архитектурах может отличаться реализация распределения памяти стэка.
Всё просто:
на PUSH данные регистра пишутся в память по адресу из SP и после этого значение адреса в SP УМЕНЬШАЕТСЯ на единицу !
Речь конкретно про AVR , в данном случае если уж выбрали то про 328p
Мы на месте крутимся… в SP адрес физический 8F6 , начинаю в стек ложить байты моего числа т.е каждый байт SP=SP-1 т.е 1 байт адрес 8F6 , второй байт 8F5 потом 8F4 и 8F3//Логично … Вот я так и думал … Но по дампу то он 8F7 , 8F8 и т.д …
ADDR(t)=8F6;
08E8: 36 00 08 F5 00 00 00 00 00 00 00 00 00 B5 44 33 22 11 01 0E 02 A5 00 5B |
В память байты записываются командами
ST Y+1,
ST Y+2,
ST Y+3,
ST Y+4,
а в Y лежит копия SP (Там начало окна на 4 байта в стеке, сделанное командами RCALL)
сам SP мы не трогаем !!!