C nebo ASM?

Jan Waclawek konfera@efton.sk
Pátek Květen 22 11:32:25 CEST 2009


SDCC 2.9.1 -mpic16:

_main:
;	.line	14; uu2.c	for ( Ukazatel = 0; Ukazatel < 32; ++Ukazatel) {
	CLRF	r0x00
_00105_DS_:
	MOVLW	0x20
	SUBWF	r0x00, W
	BC	_00109_DS_
;	.line	16; uu2.c	Soucet += Pole[Ukazatel];
	MOVLW	LOW(_Pole)
	ADDWF	r0x00, W
	MOVWF	r0x01
	CLRF	r0x02
	MOVLW	HIGH(_Pole)
	ADDWFC	r0x02, F
	MOVFF	r0x01, FSR0L
	MOVFF	r0x02, FSR0H
	MOVFF	INDF0, r0x01
	MOVF	r0x01, W
	BANKSEL	_Soucet
	ADDWF	_Soucet, F, B
;	.line	14; uu2.c	for ( Ukazatel = 0; Ukazatel < 32; ++Ukazatel) {
	INCF	r0x00, F
	BRA	_00105_DS_
_00109_DS_:
	RETURN	


Pre ostatne platformy (skusil som '51 aj Z80) to SDCC preklada takmer rovnako - samotne optimalizacie na urovni algoritmov su viac-menej nezavisle od platformy (inak su tie optimalizacie, co robi, popisane v dokumentacii - nie je to zase nic prevratne).

----------------------
avr-gcc (AVR)


 15 0000 9091 0000 		lds r25,Soucet
  16 0004 20E0      		ldi r18,lo8(0)
  17 0006 30E0      		ldi r19,hi8(0)
  18               	.L2:
  19 0008 F901      		movw r30,r18
  20 000a E050      		subi r30,lo8(-(Pole))
  21 000c F040      		sbci r31,hi8(-(Pole))
  22 000e 8081      		ld r24,Z
  23 0010 980F      		add r25,r24
  24 0012 2F5F      		subi r18,lo8(-(1))
  25 0014 3F4F      		sbci r19,hi8(-(1))
  26 0016 2032      		cpi r18,32
  27 0018 3105      		cpc r19,__zero_reg__
  28 001a 01F4      		brne .L2
  29 001c 9093 0000 		sts Soucet,r25
  30               	/* epilogue: frame size=0 */
  31 0020 0895      		ret


--------------------------

CodeVision (AVR)

                 ; 0000 000E  for ( Ukazatel = 0; Ukazatel < 32; ++Ukazatel) {
                 ;	Ukazatel -> R17
00006e e010      	LDI  R17,LOW(0)
                 _0x5:
00006f 3210      	CPI  R17,32
000070 f460      	BRSH _0x6
                 ; 0000 000F 
                 ; 0000 0010   Soucet += Pole[Ukazatel];
000071 2da5      	MOV  R26,R5
000072 27bb      	CLR  R27
000073 2fe1      	MOV  R30,R17
000074 e0f0      	LDI  R31,0
000075 5ae0      	SUBI R30,LOW(-_Pole)
000076 4ffe      	SBCI R31,HIGH(-_Pole)
000077 81e0      	LD   R30,Z
000078 e0f0      	LDI  R31,0
000079 0fea      	ADD  R30,R26
00007a 2e5e      	MOV  R5,R30
                 ; 0000 0011  }
00007b 5f1f      	SUBI R17,-LOW(1)
00007c cff2      	RJMP _0x5
                 _0x6:
                 ; 0000 0012 
                 ; 0000 0013 }
                 _0x7:
00007d cfff      	RJMP _0x7

------------------

Este som skusil Dunfield C51, ale to je cista hroza, ani to sem nejdem posielat (je to napokon dost obskurny prekladac).
Keila tu momentalne nemam, ale to by mohol skusit niekto kto ho ma poruke.

Zaver: toto zda sa ziadny jednocipovy kompilator neriesi ako (auto)inkrementovany pointer.

wek





Další informace o konferenci Hw-list