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