printline(hname, msg) char *hname; char *msg; { char *p, *q; int c; char line[MAXLINE + 1]; p = msg; q = line; while ((c = *p++ & 0177) != '\0' && q < &line[sizeof(line) - 1]) if (iscntrl(c)) { if (c == '\n') *q++ = ' '; else if (c == '\r') *q++ = ' '; else if (c == '\t') else { *q++ = '^'; *q++ = c ^ 0100; } } else *q++ = c; *q = '\0'; logmsg(line, hname, 0); }Zadanie 2
Sprawdzić jaki kod asemblerowy produkuje kompilator `gcc -S -fverbose-asm' dla kilku prostych funkcji. Wypróbować kompilację z opcjami `-O', `-O2' i `-O3'. Jaki efekt daje zmiana typów zmiennych (`char', `short', `int', `long', `float', `double') i modyfikatory (`signed', `unsigned'). Porównać wynik z tym co daje `objdump --disassemble' na odpowiednim pliku wynikowym. Przeprowadzić kompilację z opcją `-g' i uruchomić `objdump --disassemble --source'.
Zadanie 3
Napisać w asemblerze procesora 386 procedurę dodawania poczwórnej precyzji tzn. procedura ma dodawać liczby 128-bitowe. Argumentami procedury mają być wskaźniki do argumentów i wskaźnik do wyniku.
Zadanie 4
Funkcja:
int sss(int * a) { int suma = a[0]+a[1]+a[2]; return suma; }przekompilowana poleceniem `gcc -fomit-frame-pointer -S -O2' daje:sss: movl 4(%esp), %edx movl (%edx), %ecx movl 4(%edx), %eax addl %ecx, %eax movl 8(%edx), %ecx addl %ecx, %eax retPrześledzić zawartość stosu przy wykonaniu tej funkcji. Porównać z wersją kompilowaną przez `gcc -S'.Zadanie 5
Napisać procedurę(y) w języku asemblera procesora i386 która: zamieni miejscami liczby całkowite wskazywane przez argumenty (argumentami są dwa wskaźniki do liczb całkowitych), powiększy liczbę całkowitą wskazywaną przez argument o 1 (argumentem jest wskaźnik do liczby całkowitej), zwróci podwojoną wartość swojego argumentu (argument jest liczbą całkowitą), zwróci wartość argumentu powiększoną o dwa (argumentem jest liczba całkowita).
Zadanie 6
Modyfikując podany przykład (`maly2.c') i analizując tekst asemblerowy wyprodukowany przez kompilator ustalić sekwencję instrukcji asemblerowych realizującą wywołanie wywołań systemowych `open', `read', `close'.
Zadanie 7
Napisać program(y) w jezyku asemblera (nie używając biblioteki C) który: powiększy liczbę całkowitą (bez znaku, maksymalnie trzycyfrową) odczytaną ze standartowego wejścia i wypisze wynik na standartowym wyjściu, przekopiuje dane z wejścia na wyjście.