Поздравляю соврамши в 5 раз Как я уже говорил, что для сравнения коды нужно поставить в равные условия, никто не говорил, что это необходимо делать повсеместно на лонгах, был продемонстрирован способ получения результата. Если эти два куска кода привести в равные условия, дорогой вы наш передергиватель(компилер ты выбрал специально самый г"№%нный), то получим нижеследующие результаты: длина кода 39 слов, время выполнения в наихудшем случае около 2000 тактов(у меня нет времени заниматься лизанием, но я думаю можно раза в два подсократить прямо в сях). Ну и стоило так кликушествовать?
2: void main(void)
3: {
+00000046: 2C24 MOV R2,R4 Copy register
+00000047: 01BD MOVW R22,R26 Copy register pair
+00000048: 019C MOVW R18,R24 Copy register pair
5: unsigned int val=65535;
+00000049: EF8F SER R24 Set Register
+0000004A: EF9F SER R25 Set Register
8: rslt[len]=0;
+0000004B: E4A0 LDI R26,0x40 Load immediate
+0000004C: E0B1 LDI R27,0x01 Load immediate
+0000004D: E000 LDI R16,0x00 Load immediate
+0000004E: 01FD MOVW R30,R26 Copy register pair
+0000004F: 8305 STD Z+5,R16 Store indirect with displacement
+00000050: 9614 ADIW R26,0x04 Add immediate to word
+00000051: E006 LDI R16,0x06 Load immediate
+00000052: 2E40 MOV R4,R16 Copy register
+00000053: C00E RJMP PC+0x000F Relative jump
11: rslt[len]=(val % 10)+'0';
+00000054: 018C MOVW R16,R24 Copy register pair
+00000055: E04A LDI R20,0x0A Load immediate
+00000056: E050 LDI R21,0x00 Load immediate
+00000057: 940E007D CALL 0x0000007D Call subroutine
+00000059: 5D40 SUBI R20,0xD0 Subtract immediate
+0000005A: 934C ST X,R20 Store indirect
12: val /=10;
+0000005B: 018C MOVW R16,R24 Copy register pair
+0000005C: E04A LDI R20,0x0A Load immediate
+0000005D: E050 LDI R21,0x00 Load immediate
+0000005E: 940E007D CALL 0x0000007D Call subroutine
+00000060: 01C8 MOVW R24,R16 Copy register pair
+00000061: 9711 SBIW R26,0x01 Subtract immediate from word
9: while((--len)>=0)
+00000062: 944A DEC R4 Decrement
+00000063: F781 BRNE PC-0x0F Branch if not equal
14: }
+00000064: 01C9 MOVW R24,R18 Copy register pair
+00000065: 01DB MOVW R26,R22 Copy register pair
+00000066: 2C42 MOV R4,R2 Copy register
+00000067: 9508 RET Subroutine return
@00000068: ?C_FUNCALL
---- No Source ------------------------------------------------------------------------------------
@0000007D: ?US_DIVMOD_L02
+0000007D: 2400 CLR R0 Clear Register
+0000007E: 2411 CLR R1 Clear Register
+0000007F: E0EF LDI R30,0x0F Load immediate
@00000080: _..X_RSTACK_BASE
+00000080: 1F00 ROL R16 Rotate Left Through Carry
+00000081: 1F11 ROL R17 Rotate Left Through Carry
+00000082: 1C00 ROL R0 Rotate Left Through Carry
+00000083: 1C11 ROL R1 Rotate Left Through Carry
+00000084: 1604 CP R0,R20 Compare
+00000085: 0615 CPC R1,R21 Compare with carry
+00000086: F010 BRCS PC+0x03 Branch if carry set
+00000087: 1A04 SUB R0,R20 Subtract without carry
+00000088: 0A15 SBC R1,R21 Subtract with carry
+00000089: 95EA DEC R30 Decrement
+0000008A: F7AA BRPL PC-0x0A Branch if plus
+0000008B: 1F00 ROL R16 Rotate Left Through Carry
+0000008C: 1F11 ROL R17 Rotate Left Through Carry
+0000008D: 01A0 MOVW R20,R0 Copy register pair
+0000008E: 9500 COM R16 One's complement
+0000008F: 9510 COM R17 One's complement
+00000090: 9508 RET Subroutine return
@00000091: ?Register_R4_is_cg_reg
+00000091: E001 LDI R16,0x01 Load immediate
+00000092: 9508 RET Subroutine return