ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
348239 Топик полностью
maik-vs (21.08.2012 09:39, просмотров: 164) ответил Blackbird_sunday на мда что то не получаеться исходник с нормальным форматированием выложить ...
Посмотрел на кодевижн-асм. Там сильно можно сэкономить на ap=pzu[(cod.sumadd&0xffc000)>>14];. И он не совсем асм, ибо макросы не раскрыты. Например, RCALL __ASRW4 явно сдвиг с циклом. Кто такие __SAVELOCR2 и __LOADLOCR2P, я не понял. Если украсть у компилятора 4 регистра, можно из нижней половины, то можно сэкономить на прологе/эпилоге там где ST r22..25 и LD они же. Вот текст от кодевижена и чем его можно заменить: ST -Y,R22 ST -Y,R22 ST -Y,R23 ST -Y,R23 ST -Y,R24 ST -Y,R24 ST -Y,R25 ST -Y,R25 ST -Y,R26 ST -Y,R26 ST -Y,R27 X ST -Y,R27 X ST -Y,R30 ST -Y,R30 ST -Y,R31 Z ST -Y,R31 Z IN R30,SREG IN R30,SREG ST -Y,R30 ; 0000 001A unsigned char ap,bp ; ST -Y,R30 ; 0000 001B ap=pzu[(cod.sumadd&0xffc000)>>14]; RCALL __SAVELOCR2 ??? ;ap -> R17 ;bp -> R16 &ffc000 >>14,used bits: LDS R30,_cod LDS R30,_cod &00 >> xxxx xxxx LDS R31,_cod+1 LDS R31,_cod+1 &co >> 10xx xxxx LDS R22,_cod+2 LDS R22,_cod+2 &ff >> 9876 5432 LDS R23,_cod+3 <23:22:31:30> cod.sumadd LDS R23,_cod+3 &00 >> xxfe dcba __ANDD1N 0xFFC000 cod.sumadd&0xffc000 MOVW R26,R30 MOVW R24,R22 <25:24:27:26> cod.sumadd LDI R30,LOW(14) RCALL __LSRD12 <25:24:27:26> >> <30> rol r31 rol r22 LSRD12 сдвиг 4 байтов пока R30-- > 0 rol r23 14*4 LSR + (dec r30, brne)*14 rol r31 rol r22 rol r23 <22:23> (cod.sumadd&0xffc000)>>14 SUBI R30,LOW(-_pzu*2) ldi R30,LOW(_pzu*2) SBCI R31,HIGH(-_pzu*2) Z = 2*PZU ldi R31,HIGH(_pzu*2) LPM R17,Z <17>=pzu[(cod.sumadd&0xffc000)>>14] LPM R17,Z <17> ap=pzu[(cod.sumadd&0xffc000)>>14] ; 0000 001C bp=(ap&0xc0)>>4; MOV R30,R17 MOV R30,R17 ANDI R30,LOW(0xC0) ANDI R30,LOW(0xC0) LDI R31,0 lsr r30 RCALL __ASRW4 ASRW arithmetic(!?) shift word? lsr r30 MOV R16,R30 lsr r30 lsr r30 <30> bp=(ap&0xc0)>>4 ; 0000 001D ap=ap&0x3f; ANDI R17,LOW(63) ANDI R17,LOW(63) ; 0000 001E PORTC=ap; OUT 0x15,R17 OUT 0x15,R17 ; 0000 001F PORTD=bp; OUT 0x12,R16 OUT 0x12,R16 ; 0000 0020 cod.sumadd=cod.sumadd+stepfaz; LDS R30,_stepfaz LDS R30,_stepfaz LDS R31,_stepfaz+1 LDS R31,_stepfaz+1 LDS R22,_stepfaz+2 LDS R22,_stepfaz+2 LDS R23,_stepfaz+3 LDS R23,_stepfaz+3 LDS R26,_cod LDS R26,_cod LDS R27,_cod+1 LDS R27,_cod+1 LDS R24,_cod+2 LDS R24,_cod+2 LDS R25,_cod+3 LDS R25,_cod+3 RCALL __ADDD12 add R30,R26 adc R31,R27 adc R22,R24 adc R23,R25 STS _cod,R30 STS _cod,R30 STS _cod+1,R31 STS _cod+1,R31 STS _cod+2,R22 STS _cod+2,R22 STS _cod+3,R23 STS _cod+3,R23 ; 0000 0021 ; 0000 0022 }; RCALL __LOADLOCR2P ??? LD R30,Y+ LD R30,Y+ OUT SREG,R30 OUT SREG,R30 LD R31,Y+ LD R31,Y+ LD R30,Y+ LD R30,Y+ LD R27,Y+ LD R27,Y+ LD R26,Y+ LD R26,Y+ LD R25,Y+ LD R25,Y+ LD R24,Y+ LD R24,Y+ LD R23,Y+ LD R23,Y+ LD R22,Y+ LD R22,Y+ LD R0,Y+ LD R0,Y+ RETI; RETI;