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