Изменение старшего байта 4 байтного числа

Если честно , то да … Выше окно с отладчика все равно показывает работу с относительными адресами … и по нему можно только понять что байты ложит попорядку … а вот порядок попрежнему непонятенб т.к физического дампа нет …а по относительным сложно судить. Да по относительным адреса увеличиваются… но по фмизическаим абсолютно незначит что они не увеличиваются в сторону кучи…

Это как раз строка из дампа !!!

Где ? я только дизассемблированый кусок кода вижу … или я пропустил … сейчас гляну
Или Вы про то , что 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

Да спасибо понял что это указатель стека , не туда глянул

image
Ну да судя по дизассемблированому коду , и по дампу адреса почему-то увеличиваются…
а не бегут в сторону кучи..

Это задача на использование стека. Просто задача. Я вот тут как-то вычисление даты Пасхи писал. Это теперь тоже есть в языке?

Кроме того:

  1. язык определяется не Керниганом и Ритчи, а стандартом языка;
  2. в теме выше речь шла об аппаратном стека (если Вы знаете, что это такое);
  3. вы решили поспорить со мною об этом языке? А спорилка у Вас точно выросла?
3 лайка

Нет не выросла … Я не спорщик , просто чтобы разобраться задаю вопросы , которые выглядят как спор… просто указал что В книге которую Вы мне дали Есть про стек и команды работы со стеком, и если я учу язык по книжке , соответственно мне и это надо знать…

Извините если как то Вас задел , Ваши статьи обалденно написаны и чаще всего довольно понятно… но про все Вы не можете писать приходится мучать вопросаи , и если честно немного покоробило -

не надо тебе знать о нем

Указатель головы стека бежит к куче при PUSH и CALL, но сама память то с какого перепугу куда то побежит ?

Ну видать здесь и запутался, т.к решил , что в указателях физические адреса данных которые бегут к кучи и могут ее "пронзить " иначе как они ее пронзают…

Как раз SP указывает на первую свободную (по мнению стека) ячейку - именно физический адрес:


Если долго PUSHить, то можно пропахать не только “кучу” но вообще всю память и регистры …

Если я правильно понимаю это когда адреса копируются аппаратно при обращении к стеку , стек находится общей памяти

Блин вот это и не понятно мне … стек расспалагается в самом конце памяти (физической памяти ) и соответственно если в него ложишь байты а они еще и увеличивают адрес … куда если он в самом конце и как он тогда стремиться к куче которая вначале …


, но дамп да показывает увеличение… вот мозг и кипит от несоответствия … вот только где несоответствие неразбирусь. У меня в самом начале тоже показало , что адреса начали увеличиваться , когда через сериал смотрел … решил , что глюк спросил … оказалось не у меня одного увеличиваются, следовательно я что-то непонимаю в концепции стека…

Википедия - стэк.
И да, в разных архитектурах может отличаться реализация распределения памяти стэка.

Всё просто:
на PUSH данные регистра пишутся в память по адресу из SP и после этого значение адреса в SP УМЕНЬШАЕТСЯ на единицу !

Речь конкретно про AVR , в данном случае если уж выбрали то про 328p

Мы на месте крутимся… в SP адрес физический 8F6 , начинаю в стек ложить байты моего числа т.е каждый байт SP=SP-1 т.е 1 байт адрес 8F6 , второй байт 8F5 потом 8F4 и 8F3//Логично … Вот я так и думал … Но по дампу то он 8F7 , 8F8 и т.д … :face_with_open_eyes_and_hand_over_mouth: :woozy_face:
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 мы не трогаем !!!