MIPS assembly zapis 32 bitowej liczby jako 12 bitowa

0

Cześć, mam następujący problem:
Moj program zwraca pewne liczby i chce je zapisać do pliku a następnie odczytać, jednak liczby te są mniejsze niż 2^12 i koniecznie musze je zapisac do pliku jako liczby 12 bitowe (a nie 32). Zupełnie nie wiem jednak jak to zrobić, jak użyć przesunięć bitowych itp. bede wdzięczny za jakąs wskazowke / link (bo ciezko znaleźć) a najlepiej przykladowy kod :)

0

Próbowałeś wykorzystać jakiś pośredni bufor?

Zauważ, że możesz wykorzystać np. jakiś rejestr 16/32-bitowy w roli bufora, do którego będziesz mógł dopychać te dane bit po bicie albo np. porcjami po 4 bity skoro masz stały rozmiar danych (i jest to największy wspólny dzielnik rozmiaru bufora i danych) + jakieś pomocnicze na stan bufora i stan aktualnie zapisywanej liczby, na inne operacje etc. Gdy zapełnisz bufor - zrzucisz 4 bajty do pliku i zerujesz stan bufora. Z podobnego bufora możesz wyciągać liczby po ponownym otwarciu pliku.

Przykładowego kodu w asmie nie napiszę, bo z asma jestem cienka dętka, a MIPS w ogóle nie znam - ale tak poglądowo, zaczynasz od:

BUFOR | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
STAN_B | 0 |
LICZBA | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 |
STAN_L | 12 |

Tutaj możesz np. wykonać jakiś obrót lub przesunięcia bitowe w pomocniczym rejestrze, by ustawić 4 najstarsze bity liczby na dół rejestru, zrobić maskę z wartością 0x0000000F by odsiać jakieś zbędne bity, przesunąć bufor o 4 bity w lewo, zrobić OR bufora z 4 bitami, które właśnie wyjąłeś, zaktualizować stan wszystkiego etc.

Po 1 kroku:

BUFOR | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 |
STAN_B | 4 |
LICZBA | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 |
STAN_L | 8 |

Po 2 kroku:

BUFOR | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 |
STAN_B | 8 |
LICZBA | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 |
STAN_L | 4 |

Po 3 kroku:

BUFOR | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 |
STAN_B | 12 |
LICZBA | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 |
STAN_L | 0 |

Po 8 krokach zrzucasz bufor do pliku:

BUFOR | 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 |
STAN_B | 32 |
LICZBA | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 |
STAN_L | 4 |

Czyścisz bufor:

BUFOR | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
STAN_B | 0 |
LICZBA | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 |
STAN_L | 4 |

Po 9 kroku:

BUFOR | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 |
STAN_B | 4 |
LICZBA | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 |
STAN_L | 0 |

Możesz (a być może nawet powinieneś) wpierw zaalokować trochę pamięci i zrzucać zawartość do pamięci, a potem zapisać wszystko za jednym zamachem.

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