C makro ( Bray terminal megy, kosz...en voltam a bena)
Andras Tantos
andras at tantosonline.com
Tue Dec 20 05:46:55 CET 2005
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/
>
More information about the Elektro
mailing list