Programowanie Niskopoziomowe - Ćwiczenia: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
Przykładowe tematy ćwiczeń w środowisku symulatora SPIM: | Przykładowe tematy ćwiczeń w środowisku symulatora SPIM: | ||
#Program sortujący ciąg liczb całkowitych | #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: | 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 |
Wersja z 13:02, 12 paź 2006
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