Снова не пойму как IAR работает с переменными...
Оптимизация вся выключена, дабы не влиять излишне.
Имеем такой вот код:
Код
111 tmpByte <<= 1;
\ 00000464 9100.... LDS R16, tmpByte
\ 00000468 0F00 LSL R16
\ 0000046A 9300.... STS tmpByte, R16
112 tmpByte |= tmp_bit;
\ 0000046E 8108 LD R16, Y
\ 00000470 .... LDI R30, LOW(tmpByte)
\ 00000472 .... LDI R31, (tmpByte) >> 8
\ 00000474 8110 LD R17, Z
\ 00000476 2B10 OR R17, R16
\ 00000478 8310 ST Z, R17
Почему компилятор, имея в регистре значение переменной, и следующую операцию с ней же, тем не менее сначала сохраняет ее, а потом загружает? Переменная
не volatile.
Почему в первом и втором случае обращение к одной и той же переменной делается по разному??
Как избежать такого извращенного обращения к переменным?
Эквивалентный (нормальный) код:
Код
114 tmpByte = (tmpByte<<1) | tmp_bit;
\ 0000047A 9100.... LDS R16, tmpByte
\ 0000047E 0F00 LSL R16
\ 00000480 8118 LD R17, Y
\ 00000482 2B10 OR R17, R16
\ 00000484 9310.... STS tmpByte, R17
Спасибо заранее!