Если systick был объявлен как volaitle, то, вне зависимости от
того, куда класть его значение, вне зависимости от переменных temp,
должно быть обращение к systick принудительно. Простите, без
подписей что к чему, в асм-е https://caxapa.ru/1283388.html
не разобрался. Там везде есть обращение к systick дважды? Хотя бы как (псевдокод C):
temp1=temp2=systick;
systick;
С какими компиляторами ни работал (Microchip XC8, XC16, avr-gcc, gcc-arm-none-eabi), всегда обращение к volatile беспрекословно соблюдалось. И если переменная использовалась в двух разных операторах, к ней обязательно было бы два обращения. Иначе даже с регистрами МК такой компилятор работать не сможет. Чего стоит, хотя бы, вычитка пустого значения из двунаправленного регистра данных SPI:
SPDR;
Никакого эффекта нет, кроме обращения к регистру. И компиляторы его обязаны исполнить. Если есть ";", значит, это разные операторы, разные обращения. Удивлюсь, если компилятор делает не так.