Zespół: PT/17/TP Wrocław, 09.04.2010
Elżbieta Tchorowska, 171067
Konrad Kukulski, 163930
Ocena:
Oddano:
Moduł as w programach C na platformie Linux
Sprawozdanie z laboratorium z przedmiotu „Architektura Komputerów”
Rok. Akadem. 2009/2010, Kierunek: INF
PROWADZĄCY:
Mgr inż. Mariusz Czapski
Spis treści:
Cel ćwiczenia
Celem ćwiczenia było zapoznanie się z wykonaniem modułów. Zadaniem pierwszym było wykonanie modułu C do programu as, w drugim moduł as do programu w C. Moduły miały pobierać wczytane wartości w programie macierzystym, po czym obliczać ich sinus. Argumenty sinusa podawane są w radianach. Można było wykorzystać gotową funkcję koprocesora jak również napisać własną metodę liczenia sinusa.
Przebieg ćwiczenia
Wygląd pliku Makefile, pomija się i przyjmuje, że jego działanie jest wiadome. Bazowym programem był program „Hello Word” mocno zmieniony. Na laboratoriach wykonano jedynie moduł as w programie C. Do kompilacji użyto gdb.
Algorytm
Pierwszym krokiem było stworzenie pliku z rozszerzeniem .c, który pytałby o wartość do obliczenia. Plik wyglądał następująco:
Przyjmuje się działanie programu za wiadome. Należało by omówić jedynie dwie rzeczy. Przedrostek extern oznaczał, że będziemy eksportować zmienną do innego środowiska, a sam program jest modułem. Nie można było użyć strumieni cout i cin z powodu nie obsługiwania tych strumieni przez as.
Program as.
Ustalono, jak powinien wyglądać ogólny zarys programu as i importowanie zmiennych do drugiego środowiska. Ogólną strukturę i formę zapisu podejrzano ze strony http://rudy.mif.pg.gda.pl/~bogdro/linux/index.php i wykorzystano ją w działaniu programu.
Przekonwertowany fragment na kompilator laboratoryjny wyglądał następująco:
Fragment kompilował się. Ustalono, że zwiększenie rejestru o wartość należy przykładowo zapisywać w sposób: 8(%ebp). Ponieważ była nam potrzebna tylko jedna zmienna, więc wykorzystywano tylko jeden rejestr.
Główny program
Główny program nie różnił się wiele. W sumie, nie udało się stworzyć funkcji liczącej sinus, nawet na koprocesorze. Samo działanie programu wyglądało następująco:
pobranie wartości w programie c
przesłanie jej do modułu as
wypisanie tej wartości ponownie pod modułem as
Program wyglądał następująco:
Pominięto deklaracje z nagłówka programu zastępując je po prostu wartościami przesyłanymi do konkretnych rejestrów.
Kompilacja
Skompilowany program nosił nazwę `wynik' i został przesłany prowadzącemu laboratoria. Ciekawym faktem, o którym należy wspomnieć, jest przymus kompilacji z wymuszeniem pracy na 32 bitach przy procesorze 64 bitowym. Normalnie, nie jest to wymagane, gdyż procesor przystosowuje się do trybu, w którym pracuje. Jedynie, przy pracy z modułami jest to wymagane. Kompilator nie wykazuje błędu, ale wynik jest niepoprawny. Dzieje się tak z powodu różnicy w stosach, między C, a as. Kompilacja musi odbywać się z dodatkiem --32.
Wnioski
Mimo, iż na zajęciach nie udało się stworzyć działającego programu z powodu braku odpowiednich do tego materiałów i pomocy naukowych, jednakże moduł został wykonany, choć w efekcie nie liczył sinusa.
Strona 2 z 4
movl %ebp,%esi
movl 8(%ebp),%edi
%idefine a [ebp+8]
%idefine b [ebp+12]
push ebp
mov ebp, esp
mov eax, a
add eax, b
#include <stdio.h>
extern int sinus(int a);
int main()
{
int w;
printf("Podaj wartosc: ");
scanf("%d",&w);
printf("%d",sinus(w));
return 0;
}
.align 32
.data
.global sinus
sinus:
movl %ebp,%esi
movl 8(%ebp),%edi
mov $4,%eax
mov $1,%ebx
movl %edi,%ecx
movl $2, %edx
int $0x80