Architektura_komputerów_lab3_PT17_TP_Kukulski_Tchorowska(2).doc

(51 KB) Pobierz
Architektura komputerów

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              2

Przebieg ćwiczenia              2

Algorytm              2

Program as.              2

Główny program              3

Kompilacja              4

Wnioski              4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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:

 

#include <stdio.h>

 

extern  int sinus(int a);

 

int main()

{

int w;

              printf("Podaj wartosc: ");

              scanf("%d",&w);

             

              printf("%d",sinus(w));

              return 0;

}

 

 

 

 

 

 

 

 

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.

 

 

 

 

%idefine              a              [ebp+8]

              %idefine              b              [ebp+12]

 

                            push              ebp

                            mov              ebp, esp

 

                            mov              eax, a

                            add              eax, b

 

 

 

 

 

 

 

 

 

Przekonwertowany fragment na kompilator laboratoryjny wyglądał następująco:

movl %ebp,%esi

movl 8(%ebp),%edi

 

 

 

 

 

 

 

 

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:

 

.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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

...
Zgłoś jeśli naruszono regulamin