2011-07-01 11 views

Odpowiedz

11

Członkowie komisji struct ułożone są kolejno w pamięci, z możliwością dopełnienia, a adres struktury jest zazwyczaj adres pierwszego członka.

struct Bar { 
    int x; 
    int y; 
}; 

struct Foo { 
    struct Bar b; 
    double d; 
    int i; 
}; 

struct Foo f; 

Powiedzmy, że &f jest 0x10. Następnie, &f.b.x (pierwszy element pierwszego elementu Foo) jest również 0x10. &f.b.y jest 0x14, ponieważ f.b.x ma cztery bajty (zakładając, że maszyna 32-bitowa). &f.d jest 0x18, a &f.i jest 0x20. Pierwszy adres, który nie jest zajęty przez f (innymi słowy, &f + 1) jest 0x24.

Wszystko, co musisz zrobić w zespole, to upewnić się, że masz przestrzeń (stos lub stos) dla członków struktury, i wypełnić przestrzeń odpowiednimi danymi i przekazać adres pierwszego elementu do funkcjonować.

Jeśli chodzi o przykład, który rzeczywiście obejmuje montaż, można go łatwo wyprodukować, pisząc mały program testowy i skompiluj go z gcc -S -O0 -g, który będzie generował kod zespołu dla kodu C. Na przykład:

int func(struct Foo * foo) { 
    return foo->b.x + foo->i; 
} 

int main() { 
    struct Foo foo; 
    foo.b.x = 42; 
    foo.b.y = 9; 
    foo.d = 3.14; 
    foo.i = 8; 
    func(&foo); 
    return 0; 
} 

W montażowej, będzie, między innymi, patrz (uwaga: jest to 64-bitowy ASM):

movl $42, -32(%rbp) 
movl $9, -28(%rbp) 
movabsq $4614253070214989087, %rax 
movq %rax, -24(%rbp) 
movl $8, -16(%rbp) 

Jak widać, wartości 42, 9, (liczba całkowita, której wzór bitowy wynosi 3,14), a 8 jest ładowane do adresów -32, -28, -24 i -16 (względem wskaźnika bazowego). Mam pod ręką tylko skrzynkę Solaris, więc nie mogłem użyć asmlinkage (która określa, że ​​argumenty funkcji muszą być przekazywane na stosie, a nie w rejestrach), więc bezpośrednio przed wywołaniem funkcji widzimy efektywny adres struktury ładowany do rejestru:

leaq -32(%rbp), %rax 
movq %rax, %rdi 

z asmlinkage, to że zamiast widzieć to skuteczny adres pchanych na stosie.

+0

Eldhuset, dostępny przykład witalnego świata? –

+0

Myślę, że C99 gwarantuje, że adres struktury jest adresem jej pierwszego członka. –

+0

@tc .: Brzmi rozsądnie; Napisałem "zwykle" tylko dlatego, że nie byłem w 100% pewny, że tak było - ale nie widzę żadnego powodu, dla którego ktoś chciałby dodać dopełnienie na początku struktury. –

Powiązane problemy