Programowanie Niskopoziomowe - Ćwiczenia

From Studia Informatyczne

Przykładowe tematy ćwiczeń w środowisku symulatora SPIM

Środowisko realizacji: symulator SPIM w dowolnym systemi operacyjnym

  1. Program sortujący ciąg liczb całkowitych
  2. Mnożenie nieujemnych liczb mieszanych (część całkowita i ułamek zwykły). Wynik poprawnie skrócony.
  3. Mnożenie zmiennopozycyjne w formacie IEEE Single bez użycia jednostki zmiennopozycyjnej (czytanie i pisanie przy użyciu funkcji systemowych, wartość przekazywana przez rejestry jednostki zmiennopozycyjnej).
  4. Dodawanie zmiennopozycyjne w formacie IEEE Single bez użycia jednostki zmiennopozycyjnej (czytanie i pisanie przy użyciu funkcji systemowych, wartość przekazywana przez rejestry jednostki zmiennopozycyjnej).


Przykładowe tematy ćwiczeń z programowania hybrydowego

Środowisko realizacji:

  • Linux: kompilator GCC, asembler NASM lub YASM
  • Windows: kompilator Microsoft C uruchamiany z wiersza poleceń (CL), asembler NASM lub MASM

Ćwiczenie 1 - realizacja prostego programu, złożonego z moduu w języku C zawierającego funkcję main, zapewniającą wejście i wyjście oraz z modułu asemblerowego, zawierającego procedurę wołaną z języka C o następującej deklaracji nagłówka w C:

  1. int counthexdigits(char *) - zliczanie znaków będących cyframi szesnastkowymi w łańcuchu
  2. int countuppercase(char *) - zliczanie wielkich liter w łańcuchu
  3. int countlowercase(char *) - zliczanie wielkich liter w łańcuchu
  4. int oct2int(char *) – konwersja liczby z zapisu ósemkowego
  5. int hex2int(char *) – konwersja liczby z zapisu szesnastkowego
  6. char *tohex(char *, unsigned) - konwersja liczby do reprezentacji znakowej w zapisie szesnastkowym; funkcja zwraca wartość pierwszego argumentu - wskaźnik na łańcuch wyjściowy, prealokowany przez program główny
  7. char *todec(char *, unsigned)
  8. int index(char *, char) – pozycja znaku w łańcuchu
  9. unsigned revbits(unsigned) – odwrócenie kolejności bitów w słowie
  10. unsigned countones(unsigned) – zliczanie bitów o wartości 1 w słowie wejóciowym
  11. char *chgcase(char *) - zamiana liter małych na wielkie i wielkich na małe, bez zmiany innych znaków w łańcuchu
  12. char *remove(char *, char) - usunięcie wszystkich wystąpień zadanego znaku z łańucha, ze "zsunięciem" łańcucha
  13. char *replace(char *, char, char)

Ćwiczenie 2 - realizacja programu złożonego z modułu w języku C i modułu asemblerowego, ze zwróceniem uwagi na długość i wydajność kodu. W niektórych projektach można użyć jednostki wektorowej.

  1. double *add(double *d, double *s); - dodawanie zmiennopozycyjne podwójnej precyzji bez użycia instrukcji zmiennopozycyjnych
  2. double *sub(double *d, double *s); - odejmowanie zmiennopozycyjne podwójnej precyzji bez użycia instrukcji zmiennopozycyjnych
  3. float *rcp(float *d, float *s); - odwrotność liczby zmiennopozycyjnej przy użyciu alg. Newtona-Raphsona bez użycia instrukcji zmiennopozycyjnych
  4. void *my_memcpy(void *, void *, unsigned) - Odpowiednik funkcji memcpy działający niezależnie od nakładania adresów buforów. Optymalizacja!!!
  5. unsigned sqrt(unsigned) - pierwiastek kwadratowy liczby 32-bitowej
  6. funkcja obliczająca kwadrat liczby zespolonej w reprezentacji IEEE double, z użyciem jednostki SSE2