Цитата(Eddy71 @ Jul 31 2009, 17:15)

Будет..
Код
2196 xt = GetChar(); // Загрузить SizeX мл.байт
\ 000003D8 .... RCALL GetChar
\ 000003DA 2E60 MOV R6, R16
2197 if(Flag.ErrLoadKom) continue; // Если обнаружена ошибка загрузки команды, то перейти к загрузке следующей
\ 000003DC .... LDI R30, LOW(AdrProgEnd)
\ 000003DE .... LDI R31, (AdrProgEnd) >> 8
\ 000003E0 8D01 LDD R16, Z+25
\ 000003E2 FD00 SBRC R16, 0
\ 000003E4 CF2C RJMP ??main_8
2198 *TekAdrActive++ = xt;
\ 000003E6 01FD MOVW R31:R30, R27:R26
\ 000003E8 A900 LDD R16, Z+48
\ 000003EA A9F1 LDD R31, Z+49
\ 000003EC 2FE0 MOV R30, R16
\ 000003EE 8260 ST Z, R6
\ 000003F0 01FD MOVW R31:R30, R27:R26
\ 000003F2 A900 LDD R16, Z+48
\ 000003F4 A911 LDD R17, Z+49
\ 000003F6 5F0F SUBI R16, 255
\ 000003F8 4F1F SBCI R17, 255
\ 000003FA AB00 STD Z+48, R16
\ 000003FC AB11 STD Z+49, R17
2199 xt |= (GetChar())<<8; // Загрузить SizeX ст.байт
\ 000003FE .... RCALL GetChar
\ 00000400 2E70 MOV R7, R16
Привёл большой кусок, ничего не выкидывая, чтобы вам яснее видно была работа компилятора. И уровень, с каким он делает оптимизацию.
Обратите внимание на строку "xt = GetChar();". Учитывая что "xt" 16 бит, то компилятор должен был занести в R6 результат работы п/п, а в R7 - 0 (Из листинга видно, что r6:r7 это xt). Но он этого не делает, в связи с тем, что ниже по тексту видит строку "xt |= (GetChar())<<8;". И он компилирует это в "MOV R7, R16".
То есть компилятор не только не делает сдвигов, но даже упрощает саму операцию. Я, когда писал, ожидал от него увидеть следующее:
xt = GetChar();
xt |= (GetChar())<<8;
...
mov r6,r16
ldi r16,0
mov r7,r16
...
or r7,r16
А получил в результате
...
mov r6,r16
...
mov r7,r16