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.
Eldhuset, dostępny przykład witalnego świata? –
Myślę, że C99 gwarantuje, że adres struktury jest adresem jej pierwszego członka. –
@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. –