ATNEL tech-forum https://forum.atnel.pl/ |
|
Tablica dla Wnikliwych https://forum.atnel.pl/topic20602.html |
Strona 1 z 1 |
Autor: | procek87 [ 15 kwi 2018, o 18:54 ] |
Tytuł: | Tablica dla Wnikliwych |
język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Zastanawia mnie po zdefiniowaniu tablicy gdzie jest przetrzymywany ten adres zawarty w nazwie tab ? Bo przecież nazwa zawiera adres ,na który patrzy wskaźnik do elementu uint8_t tak to odebrałem po przeczytaniu rozdziału o Wskaźnikach. Asembler odpowiedziałby na moje pytania ale nie znam go i bardzo ciężko mi analizować plik .lss może ktoś pomoże, i opisze co i gdzie się dzieje z tą tablicą w asemblerze ? Przepraszam jeśli kogoś rażę moimi pytaniami w szczególności Mirka, Mirku poproszę o książkę "Asembler dla Początkujących" Mirosław Kardaś , będzie mi łatwiej . Pozdrawiam Procek87 |
Autor: | mirekk36 [ 15 kwi 2018, o 19:09 ] |
Tytuł: | Re: Tablica dla Wnikliwych |
mnie nie razisz dokąd nie piszesz na forum, że napisałem w książce coś - czego nigdy nie napisałem. procek87 napisał(a): Zastanawia mnie po zdefiniowaniu tablicy gdzie jest przetrzymywany ten adres zawarty w nazwie tab ? Nigdzie nie jest przetrzymywany - ty wciąż po prostu nie możesz zrozumieć tego, że kompilator musi taką tablicę gdzieś umieścić w pamięci, pod jakimś adresem. A skoro tak - to dlatego wszędzie w całym kodzie gdy ktoś posłuży się nazwą to kompilator wie do jakiego adresu się odwołać. |
Autor: | procek87 [ 15 kwi 2018, o 19:43 ] |
Tytuł: | Re: Tablica dla Wnikliwych |
mirekk36 napisał(a): procek87 napisał(a): Zastanawia mnie po zdefiniowaniu tablicy gdzie jest przetrzymywany ten adres zawarty w nazwie tab ? Nigdzie nie jest przetrzymywany - ty wciąż po prostu nie możesz zrozumieć tego, że kompilator musi taką tablicę gdzieś umieścić w pamięci, pod jakimś adresem. A skoro tak - to dlatego wszędzie w całym kodzie gdy ktoś posłuży się nazwą to kompilator wie do jakiego adresu się odwołać. tab[]={1,2,4,8,16,32,64,128} Mirku rozumiem to że tablica dokładnie tych kilka komórek uint8_t , które są ułożone jedna po drugiej, i jest na nich etykieta tab[] i to jest tablica w uproszczeniu . Nie rozumiem jednego jeśli nazwa Tab bez nawiasów okrągłych oznacza adres do elementu pierwszego tablicy to skoro tak to ten adres musi być gdzieś przetrzymywany w dwóch komórkach pamięci , dlatego że nazwa tablicy jest wskaźnikiem do miejsca pamięci o adresie , zawierającym elementy -1,-2 itd . bajtowe. Cytuj: mnie nie razisz dokąd nie piszesz na forum, że napisałem w książce coś - czego nigdy nie napisałem. Dyskutujemy dzięki temu się uczymy , dyskusje są budujące , i zmuszają do zastanawiania się. |
Autor: | andrews [ 15 kwi 2018, o 20:01 ] |
Tytuł: | Re: Tablica dla Wnikliwych |
procek87 napisał(a): Zastanawia mnie po zdefiniowaniu tablicy gdzie jest przetrzymywany ten adres zawarty w nazwie tab ? Bo przecież nazwa zawiera adres ,na który patrzy wskaźnik do elementu uint8_t tak to odebrałem po przeczytaniu rozdziału o Wskaźnikach. Asembler odpowiedziałby na moje pytania ale nie znam go i bardzo ciężko mi analizować plik .lss może ktoś pomoże, i opisze co i gdzie się dzieje z tą tablicą w asemblerze ? Nie zrozum mnie źle. To nie jest jakaś złośliwość czy brak chęci pomocy. Ja już raz odpowiedziałem na Twoje pytanie dość szczegółowo w innym wątku, tylko aby zrozumieć, trzeba już mieć jakąś wiedzę np. dotyczącą budowy i zasady działania mikrokontrolera, jego listy rozkazów, assemblera itp. Ty tej wiedzy jeszcze nie masz, dlatego nie zrozumiałeś, więc zadajesz następne pytania. Odpowiedź na te pytania zapewne zrodzi następne pytania itd. W ten sposób można napisać na forum całą książkę, a forum do tego nie służy. Ale OK, spróbuję jeszcze raz (ostatnie podejście), oczywiście w dużym uproszczeniu i postaram się jak najprzystępniej dla początkującego. Opis dotyczy zmiennych globalnych i nie uwzględnia procesu inicjowania wartości zmiennych wartościami podanymi przez programistę, aby nie zaciemniać sprawy Zmienne lokalne są alokowane na stosie, a to już zupełnie inna historia. język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Kiedy kompilator C napotka taką definicję tablicy myśli sobie tak: Programista chce mieć do dyspozycji zmienną zmienna_a typu uint16_t. Trzeba zarezerwować odpowiednią ilość bajtów pamięci RAM w pierwszej dostępnej lokalizacji. Aktualnie pierwszym dostępnym adresem jest 0. Zmienna jest 16-bitowa, więc zajmie 2 bajty. Kompilator na podstawie tej definicji robi więc co następuje:
Na podstawie następnej definicji robi tak:
Na podstawie następnej definicji robi tak:
Na podstawie następnej definicji robi tak:
Należy pamiętać o tym, że kompilator do tej pory jeszcze nigdzie żadnego adresu nie umieścił w kodzie, po prostu te adresy sobie pamięta. Jeśli teraz napotka w kodzie np. taką linijkę: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. to może wygenerować taki przykładowy kod (sposobów jest oczywiście więcej, więc nigdy nie wiadomo, który sposób kompilator wybierze jako najbardziej optymalny w danym momencie): język asm Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Jeśli później napotka w kodzie np. taką linijkę: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. to może wygenerować taki przykładowy kod: język asm Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Wywołanie funkcji, której argumentem jest wskaźnik do tablicy: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. język asm Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Jak widać kompilator w momencie napotkania definicji zmiennej (jakiejkolwiek, nie tylko tablicy) nie musi od razu nigdzie zapisywać wartości przydzielonego jej adresu w pamięci RAM. On ten adres po prostu zapamiętuje w swojej pamięci podręcznej na czas kompilacji i wstawia jego wartość do odpowiednich poleceń assemblera jako ich argumenty dopiero w momencie, gdy w kodzie jest odwołanie do danego symbolu. Oczywiście w rzeczywistości sprawa jest nieco bardziej skomplikowana, ale po szczegóły zapraszam już do wspomnianej wcześniej w innym wątku literatury. Jeżeli nadal nie zrozumiałeś, to ja się już niestety poddaję. Ponieważ interesują Cię takie szczegóły powinieneś jednak duuużo poczytać o budowie i zasadzie działanie mikrokontrolera, o kodzie maszynowym i instrukcjach ASM, a także o zasadzie działania kompilatora, a wtedy na pewno wszystko się wyjaśni. Pozdrawiam Andrzej |
Autor: | procek87 [ 16 kwi 2018, o 17:42 ] |
Tytuł: | Re: Tablica dla Wnikliwych |
Dziękuje andrews za szczegółowe wyjaśnienie bardzo cenny kawał wiedzy bardzo cennej dla początkującego jak narazie czytam książkę BB i nie zbaczam z kursu choć czasem właśnie dobrze coś dokładniej przeanalizować . |
Strona 1 z 1 | Strefa czasowa: UTC + 1 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |