/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
union
Fra : James Wyth


Dato : 02-12-02 15:48

Jeg vil gerne lave en union som indeholder et cpu register.
Tanken er at give direkte adgang til eax, ax, ah og al, og de skal alle
ligge i set samme dword, bare på forskellige positioner.

Jeg kan imidlertid ikke rigtig finde ud af hvordan jeg præcis skal erklære
sådan en union.
Tilsyneladende er jeg nødt til at lave structs i mine union, hvilket giver
en lidt dum notation når jeg skal skrive i registrene.

Det her er hvad jeg har fået til at compile, men ikke er såå glad for endda.

struct S16Bit
{
BYTE AH;
BYTE AL;
};

struct S32Bit
{
WORD Dummy;
S16Bit Low;
};

struct SReg {
union {
DWORD EAX;
S32Bit Low;
};
};


void Testfunktion{
SReg Register;
Register.EAX=0xABCDEF01;
Register.Low.Low.AL=0x10;
}

Det ville være bedre hvis Register havde eax,ax,ah og al i yderste lag, så
jeg kunne skrive noget i stil med.
Register.al=1; Register.ax=4;
Jeg er godt klar over at jeg lige skal overveje de navne igen da det ikke
giver meget mening at tilgå register b som a ect. Det er imidlertid ikke
problemet i første omgang.



 
 
Morten F. Hansen (02-12-2002)
Kommentar
Fra : Morten F. Hansen


Dato : 02-12-02 16:09

> Det ville være bedre hvis Register havde eax,ax,ah og al i yderste lag, så
> jeg kunne skrive noget i stil med.
> Register.al=1; Register.ax=4;

Hvad med noget i denne stil?

union reg32_t {
struct {
unsigned char al, ah;
};
unsigned short ax;
unsigned long eax;
};

....

reg32_t reg;

reg.eax = 0xFFFFFFFF;
reg.ax = 0x1234;
reg.ah = 0xAB;
reg.ah = 0xCD;

....



James Wyth (02-12-2002)
Kommentar
Fra : James Wyth


Dato : 02-12-02 16:18

> Hvad med noget i denne stil?

Hurtigt svar må jeg nok sige.
Jo, selvfølgelig. Det du gør er jo bare at undlade at navngive de
structures. Det er selvfølgelig løsningen.
Alignment bør heller ikke være et problem da en x86 cpu kører med mindst
betydende først, så al vil automatisk komme på laveste byte af eax.
Takker mange gange for dit svar.

>
> union reg32_t {
> struct {
> unsigned char al, ah;
> };
> unsigned short ax;
> unsigned long eax;
> };
>
> ...
>
> reg32_t reg;
>
> reg.eax = 0xFFFFFFFF;
> reg.ax = 0x1234;
> reg.ah = 0xAB;
> reg.ah = 0xCD;
>
> ...
>
>



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste