Wątek przeniesiony 2020-07-03 03:04 z Inżynieria oprogramowania przez somekind.

Pamięć komputera - organizacja komputera

0

Cześć!
Niedługo mam egzamin z organizacji komputera. Natrafiłem na dwa problemy:

  1. W pamięci komputera znajdują się następujące zmienne( w nawiasach rozmiar)
    char x = 4Ah(1B)
    int y 72B2h(4B)
    byte z[3] - {21h,FFh,8ch}(3x1B)
    Jak będzie wyglądać zawartość pamięci, jeśli sekcja danych zaczyna się od adresu 02DDh, komputer jest typu cienkokońcowego, a dane w pamięci są wyrównywane do parzystego adresu?
    W tym zdaniu o tyle wiem, że w typie cienkokońcowym najmniej znaczący bit ustawiamy jako pierwszy, ale mam problem jak to ugryźć.
  2. W systemie 32-bitowym wywołano procedurę z trzema argumentami: znakiem w kodzie ASCII, liczbą rzeczywistą podwójnej precyzji oraz tablicą liczb całkowitych typu long. Pokazać zawartość stosu, jeśli przed wywołaniem procedury wskaźnik stosu pokazywał adres FFh, zaś stos rośnie w "dół".
    Proszę o jakiekolwiek wskazówki
2
  1. W systemie 32-bitowym wywołano procedurę z trzema argumentami: znakiem w kodzie ASCII, liczbą rzeczywistą podwójnej precyzji oraz tablicą liczb całkowitych typu long. Pokazać zawartość stosu, jeśli przed wywołaniem procedury wskaźnik stosu pokazywał adres FFh, zaś stos rośnie w "dół".

Niewykonalne, brakuje szczegółów na temat konwencji wywołania, zwłaszcza kolejności odkładania argumentów na stos.
Ale można założyć że chodzi np. o konwencję cdecl i wtedy rozwiązać zadanie…

1
  1. adres 02DD jest nieparzysty więc x będzie pod adresem 02DE, potem 1bajt wolnego miejsca (w przykładzie 00), następnie 4 bajty int y w trybie little-endian a po nim 3 bajty tablicy

  2. "rośnie w dół" czyli adresy wskazywane przez odpowiedni rejestr maleją po każdej instrukcji push. Zakładając że tu nie ma wyrównywania adresów to pod adres FF zostanie zapisany jeden bajt (np. 4A), potem 8 bajtów dla zmiennej typu double (0x3ff199999999999a <- double d = 1.1;) oraz wskaźnik na tablicę czegokolwiek, czyli 4 bajty w systemie 32 bitowym (np adres 0x44332211). W rzeczywistym systemie argumenty funkcji wylądują zwykle w określonych rejestrach procesora, chyba że ich będzie za dużo to wtedy zostanie użyty stos.

Pamięć mogłaby wyglądać w ten sposób:

$ hexdump -C data.bin
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000f0  00 00 00 11 22 33 44 9a  99 99 99 99 99 f1 3f 4a  |...."3D.......?J|
00000100  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000002d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 4a 00  |..............J.|
000002e0  b2 72 00 00 21 ff 8c 00  00 00 00 00 00 00 00 00  |.r..!...........|
000002f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000320  00 00 00 00 00 00 0a                              |.......|
00000327
1

W tym zdaniu o tyle wiem, że w typie cienkokońcowym najmniej znaczący bit ustawiamy jako pierwszy

Nie. Mowa jest o endianness bajtów a nie bitów. Jeśli masz liczbę 0xDEADBEEF to możesz w pamięci mieć bajty DE AD BE EF jeśli to big-endian, albo EF BE AD DE w little-endian. Ale zauważ ze kolejność bitów w tych bajtach wcale się nie zmieniła.

1 użytkowników online, w tym zalogowanych: 0, gości: 1