Architektura komputerów lab3 PT17 TP Kukulski Tchorowska, Studia, PWR, 4 semestr, Architektura komputerów 2, laboratoria


Zespół: PT/17/TP Wrocław, 09.04.2010

Elżbieta Tchorowska, 171067

0x08 graphic
Konrad Kukulski, 163930

0x08 graphic
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:

0x08 graphic

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.

0x08 graphic

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

0x08 graphic

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:

Program wyglądał następująco:

0x08 graphic

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



Wyszukiwarka