Programowanie Niskopoziomowe - Ćwiczenia
Z Studia Informatyczne
Przykładowe tematy ćwiczeń w środowisku symulatora SPIM:
- Program sortujący ciąg liczb całkowitych
- Mnożenie nieujemnych liczb mieszanych (część całkowita i ułamek zwykły). Wynik poprawnie skrócony.
- 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).
- 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:
- int counthexdigits(char *) - zliczanie znaków będących cyframi szesnastkowymi w łańcuchu
- int countuppercase(char *) - zliczanie wielkich liter w łańcuchu
- int countlowercase(char *) - zliczanie wielkich liter w łańcuchu
- int oct2int(char *) – konwersja liczby z zapisu ósemkowego
- int hex2int(char *) – konwersja liczby z zapisu szesnastkowego
- 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
- char *todec(char *, unsigned)
- int index(char *, char) – pozycja znaku w łańcuchu
- unsigned revbits(unsigned) – odwrócenie kolejności bitów w słowie
- unsigned countones(unsigned) – zliczanie bitów o wartości 1 w słowie wejóciowym
- char *chgcase(char *) - zamiana liter małych na wielkie i wielkich na małe, bez zmiany innych znaków w łańcuchu
- char *remove(char *, char) - usunięcie wszystkich wystąpień zadanego znaku z łańucha, ze "zsunięciem" łańcucha
- 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.
- double *add(double *d, double *s); - dodawanie zmiennopozycyjne podwójnej precyzji bez użycia instrukcji zmiennopozycyjnych
- double *sub(double *d, double *s); - odejmowanie zmiennopozycyjne podwójnej precyzji bez użycia instrukcji zmiennopozycyjnych
- float *rcp(float *d, float *s); - odwrotność liczby zmiennopozycyjnej przy użyciu alg. Newtona-Raphsona bez użycia instrukcji zmiennopozycyjnych
- void *my_memcpy(void *, void *, unsigned) - Odpowiednik funkcji memcpy działający niezależnie od nakładania adresów buforów. Optymalizacja!!!
- unsigned sqrt(unsigned) - pierwiastek kwadratowy liczby 32-bitowej
- funkcja obliczająca kwadrat liczby zespolonej w reprezentacji IEEE double, z użyciem jednostki SSE2