C makro ( Bray terminal megy, kosz...en voltam a bena)

Fuzesi Arnold arno at externet.hu
Tue Dec 20 07:01:26 CET 2005


AVR-nel asszem ez nem jatszik, mert a flash-bol baratsagtalan atvarazsolni 
az adatot a ram-ba (regbe...) nehezkes...

    151                      if( cmd_tmp==ToCmd2(PP)){
   \                     ??main_4:
   \   000000C0   9100....           LDS     R16, `?<Constant "PP">`
   \   000000C4   9110....           LDS     R17, (`?<Constant "PP">` + 1)
   \   000000C8   17A0               CP      R26, R16
   \   000000CA   07B1               CPC     R27, R17
   \   000000CC   F499               BRNE    ??main_5

Ha flash lenne nem intezne el egy LDS-el...

Lehet hogy varazsolni kene a __flash tipusmodositoval kicsit...de majd 
holnap...vagymi, kesobb. :)

Arnold
----- Original Message ----- 
From: "Andras Tantos" <andras at tantosonline.com>
To: <elektro at tesla.hu>; <Retro at lists.tmp.hu>
Sent: Tuesday, December 20, 2005 5:46 AM
Subject: Re: C makro ( Bray terminal megy, kosz...en voltam a bena)


Hali!

Azert, mert a fordito le fog rakni (az .rdata) adatszekcioba egy harom-elemu
karakter-tombot (ez lesz a string-ed). Ha eleg szerencsetlen, meg arra se
jon ra, hogy az indexeles
konstans, igy az egesz ToCmd kifelyezes ertek forditasi idoben
kieertekelheto. Ha erre rajon,
akkor van eselyed arra, hogy (leven magara a string konstansra) nem lesz
hivatkozas a kodban,
a linker ki fogja rugni. Ez esetben valoban nem lesz kod-meret novekedes.

A masodik verzion viszont szinte biztos nem lat at a fordito (tehat, hogy a
'vegyuk a cimet egy konstans tomb elso elemenek, a pointert cast-oljuk at
mas tipusura, majd vegyuk az altala mutatott cim erteket' muveletsor
valojaban egy konstans szamot general) es valodi hivatkozast general a
string-re. Ez esetben - leven a fentieket futasi idoben fogja megcsinaltatni
a koddal - mind a kodmeret, mind az adatmeret nagyobb lesz, mint kivanatos.

Ki is probaltam (VC++ 8.0). Az elso makro a kovetkezo kodot csinalta:

#include <stdio.h>

#define ToCmd(value) (((int)((#value)[0])) | ((int)((#value)[1]) << 8))

void main() {
 printf("%x\n",ToCmd(ZZ));
}

Main:

00401010  push        5A5Ah
00401015  push        offset string "%x\n" (41DB5Ch)
0040101A  call        printf (40102Bh)
0040101F  add         esp,8
00401022  xor         eax,eax
00401024  ret

Az adatszegmensben nincs benne a string.

A masodik makrobol ez lett:

#include <stdio.h>

#define ToCmd(value) (*(int *)(#value))

void main() {
 printf("%x\n",ToCmd(ZZ));
}

00401010  mov         eax,dword ptr [string "ZZ" (41DB60h)]
00401015  push        eax
00401016  push        offset string "%x\n" (41DB5Ch)
0040101B  call        printf (40102Bh)
00401020  add         esp,8
00401023  xor         eax,eax
00401025  ret

Lathatoan hosszabb, es az is szepen lattszik, hogy hivatkozik a string-re,
igy az adat-memoriat foglal is.

Udv,
Tantos Andras

----- Original Message ----- 
From: "Fuzesi Arnold" <arno at externet.hu>
To: <elektro at tesla.hu>; <Retro at lists.tmp.hu>
Sent: Monday, December 19, 2005 4:57 PM
Subject: Re: C makro ( Bray terminal megy, kosz...en voltam a bena)


> Nagy vagy, köszi!!!!!!!
>
> Miért foglal több memóriát?
> Ezt nem értem hirtelen.
>
> Arnold
> ----- Original Message ----- 
> From: "Andras Tantos" <andras at tantosonline.com>
> To: <elektro at tesla.hu>; <Retro at lists.tmp.hu>
> Sent: Tuesday, December 20, 2005 1:13 AM
> Subject: Re: C makro ( Bray terminal megy, kosz...en voltam a bena)
>
>
> Nem igen, a string zero-lezarasa miatt, de valami ilyesmi mukodik, csak 
> tobb
> memoriat foglal (hacsak a fordito nem nagyon ugyes):
>
> #define ToCmd(value) (((int)((#value)[0])) | ((int)((#value)[1]) << 8))
>
> vagy ez (ez csak big-endien gepen fog mukodni):
>
> #define ToCmd(value) (*(int *)(#value))
>
> Haszalatuk:
>
> ToCmd(ZZ);
>
> Udv,
> Tantos Andras
>
> ----- Original Message ----- 
> From: "Fuzesi Arnold" <arno at externet.hu>
> To: <elektro at tesla.hu>; <Retro at lists.tmp.hu>
> Sent: Monday, December 19, 2005 3:25 PM
> Subject: C makro ( Bray terminal megy, kosz...en voltam a bena)
>
>
>> #define ToCMD(value1,value2) (value1|value2<<8)
>>
>> Hasznalata
>> ToCMD('Z','Z');
>>
>> Ehelyett ilyet szeretnek
>> ToCMD("ZZ");
>>
>> Vagy meginkabb ilyet:
>> ToCMD(ZZ);
>>
>> Lehet ilyet?
>> Nyilvan faradok...de elkezdeni sem tudom.. :(
>>
>> Kösz,
>> Arnold
>>
>> -----------------------------------
>> Szponzorunk: http://tonerbolt.hu/
>>
>
> -----------------------------------
> Szponzorunk: http://tonerbolt.hu/
>
> -----------------------------------
> Szponzorunk: http://tonerbolt.hu/
>

_______________________________________________
Retro levelezőlista
Lista címe: Retro at lists.tmp.hu
Beállítások: http://lists.tmp.hu/cgi-bin/mailman/listinfo/retro 




More information about the Elektro mailing list