|
| 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;
>
> ...
>
>
| |
|
|