Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
Rysunek1.13.Układramkistosufunkcjifunc1
Narysunku1.14widzimyfragmentkodufunkcjifunc1bezopisówułatwiającychanalizęukładupamięci(zmiennychlokalnychnastosie).
Odwołaniadozmiennychlokalnychpodanewzględemadresuaktualnejramkistosu(rejestrEBP).Wtabeli3znajdujesiędokładnyukład
zmiennychnastosie.
Rysunek1.14.Przypisaniastałychdokomóreknastosiebezpodanychopisówpomocniczych
Tabela1.3.Dokładnyukładobiektównastosie
Nazwa
var3
var2
var1
Przesunięcie
Opis
240
Pierwszyelementtablicyvar3
Kolejneelementytablicy
224
Pierwszepolestruktury
Kolejnepolastruktury
8
Ostatniepolestruktury
4
Zmiennavar1
1.2.3.Rozpoznawaniebudowystrukturdynamiczniealokowanych
Wprzypadkukodu,wktórymwystępujedynamicznaalokacjapamięcidlastrukturyiopcjonalnieinicjalizacjajejpól,sytuacjawygląda
dużoprościejzdwóchpowodów:
1.Jakjużopisanowcześniejrozmiarstrukturymożnapoznaćpoprzezzlokalizowanieparametruprzekazywanegofunkcjialokującej
pamięć(np.malloc).
2.Powykonaniualokacjiprogramotrzymujeadresregionupamięci,więckodtaknaprawdęoperujenawskaźnikudostruktury.Operacje
naposzczególnychpolachwidocznejakoodwołaniadowskaźnikazpewnymprzesunięciem.
Wlistingu1.8przedstawionyjestkodzużyciemdedykowanejfunkcji(new_struct),któraalokujepamięćnastrukturęorazustawia
wartościjejniektórychpól.Funkcjafunc1wykorzystujeotrzymanywskaźnikdoprzeprowadzaniakolejnejoperacjinastrukturze.
#include<stdlib.h>
#include"stru.h"
structst001*new_struct(void){
structst001*ps;
ps=(structst001*)malloc(sizeof(structst001));
ps->first=0x11;
ps->last=0xFF;
returnps;
}
voidfunc1(void){
structst001*ptr;
ptr=new_struct();
ptr->x=0x1234;
}
intmain(void){
func1();
return0;
}
Listing1.8.DynamicznaalokacjastrukturyidostępdojejelementówwjęzykuC
Wynikdeasemblacjifunkcjinew_structjestwidocznynarysunku1.15.Oto,comożemywywnioskowaćzkoduasemblera:
1.Alokacja220bajtówpamięciujawniarozmiarstruktury.
2.Wskaźnikdozaalokowanejpamięciprzechowywanyjestwzmiennejlokalnej.
3.Następujeodwołaniedopierwszegoelementustrukturyorozmiarzeczterechbajtów.Wskaźniknastrukturęprzechowywanyjest
wrejestrzeEAX.Bardziejczytelnyzapismógłbywyglądaćtak:[eax+0x0].
4.Następujeodwołaniedoostatniegoelementustruktury(przesunięcie216),równieżoszerokościczterechbajtów.