Programovani v C

zoodiskus@mbox.vol.cz zoodiskus
Středa Březen 17 12:05:04 CET 2004


>Napriklad:
>Nejaka cinnost se ma provest pri kazdem ctvrtem pruchodu hlavni smyckou
>programu. V Cecku napiseme

>static unsigned char counter=0;
>counter++;
>if(counter==4){
>  counter=0;
>  spust_cinnost();
>};

Keil C51 v6.xx se to prelozi:

counter?040:   DS   1

INC  	counter			2byte 12Clk
MOV  	A,counter		2byte 12Clk
CJNE 	A,#04H,?C0002		3byte 24Clk
CLR  	A			1byte 12Clk	
MOV  	counter,A		2byte 12Clk
LCALL	spust_cinnost		3byte 24Clk
			       13byte 96Clk

>I kdyby snad nekoho napadlo psat v Cecku nasledujici, neni vubec jiste,
>jestli kompilator 'pochopi' jak to efektivne prelozit.
>counter++;
>if(counter&0x04){
>  counter &= ~0x04;
>  spust_cinnost();

C51 to zvladne uplne v pohode a vysledkem bude:

INC  	counter			2byte 12Clk
MOV  	A,counter		2byte 12Clk
JNB  	ACC.2,?C0002		3byte 24Clk
ANL  	counter,#0FBH		3byte 24Clk
LCALL	spust_cinnost		3byte 24Clk
			       13byte 96Clk

vypada to kratsi, ale jak co do rychlosti tak do velikosti to je stejne !


> A co treba v C napsat:
>
> counter--;
> if (counter)
> {
> counter=4;
> Spust_Cinnost();
> }
>
> To se prelozi pomerne pekne .... :-))

	DEC  	counter		2byte 12Clk
	MOV  	A,counter	2byte 12Clk
	JZ   	?C0002		2byte 24Clk
	MOV  	counter,#04H	3byte 24Clk
	LCALL	Spust_Cinnost	3byte 24Clk
			       12byte 96Clk


>prece je tak snadne, elegantni a efektivni napsat:

>                mov ACC, #10001000B
>Loop        rr    ACC
>                jnb  ACC.0 ,Loop
>               .... a tady je ta cinnost
>               jmp Loop


        mov ACC, #10001000B	2byte 12Clk
Loop    rr    ACC		1byte 12Clk
        jnb  ACC.0 ,Loop	3byte 24Clk	
	LCALL	Spust_Cinnost	3byte 24Clk .... a tady je ta cinnost to by slo i v C a tak, aby se porovnavolo porovnatelne.
        jmp Loop		1byte 24Clk
			       10Byte 96Clk



At jsme to psali jakkoliv vzdy to trvalo 96 Clk, faktem je ze v asembleru to vyjde o 2 restektive 3 byte kratsi.
osobne bych to napsal:


if(++counter==4)
{
  counter=0;
  spust_cinnost();
};

a to by trvalo take 13byte a 96Clk.


Na prvni pohled je vysledek jasny, psat v asembleru, ale zkuste v asm napsat programek pro vypocet napriklad Loxodromicke vzdalenosti.
V C to vypada treba takto:

#include <math.h>

main()
{
 float x=10.5,y=513.95,l;
 l=(20012*y*cos(x))/180;
 ...
}

Vysledek z C51 (AT89C51) ma velikost 1451 byte a bezi 6204 Clk, predem lituji kazdeho kdo to bude psat v asm :-))) !?


Osobne pro x51 pisu v C51 v kombinaci s A51. Pricemz v A51 pisu casove kriticke casti kodu.

Proc se drivery pro graficke karty pisi v C ?
Pomerne jednoduche, jako vyrobce potrebujete cca kazdych 6 mesicu uvest na trh novy graficky procesor a tak nemuzete cekat az 
softwarovy guru vyplodi driver v asm.
Nechavam stranou, ze pocet lidi schopnych  napsat driver pro grafickou kartu ve Windows se asi blizi 0.
Respektive na svete jsou pry 4 a ty kdyz odesli od MS tak se uvedeni Win2000 na trh zdrzelo o 12 mesicu :-(.






Další informace o konferenci Hw-list