Architektura komputerów
Laboratorium nr 1
Sprawozdanie
Wprowadzenie:
Celem laboratorium było zapoznanie się z językiem Asembler, jego składnią i poleceniami.
Zadanie 1:
Napisać program, który zapyta użytkownika o imię. Na podstawie otrzymanych materiałów laboratoryjnych skonstruować taki program w oparciu o „Hello World”. Przeanalizować działanie.
Wykonanie:
By skompilować program należało najpierw napisać plik Makefile, który zawierał informacje potrzebne dla kompilatora, by utworzył plik obiektowy i wykonywalny. Korzystając z szablonu zawartego w instrukcji, plik Makefile dla danego programu wyglądał następująco:
Terminal kompilował podany plik ze ścieżki dostępu. Sam program wyglądał następująco:
Napisany program działał bez zarzutów. By spełniał warunki zadania należało zmienić wyświetlany tekst na „Podaj imie”. Zmienną odpowiadającą za wiadomość jest „msg_imie” (w pierwotnym programie „msg_helloworld”). Długość msg_imie_len wczytywana automatycznie z długości podanego ciągu znaków. Funkcją wyświetlającą wiadomość na ekranie jest SYSWRITE. W podanym kodzie nie używa się SYSREAD, do wczytywania ciągu znaków z klawiatury, jednak nie wykasowano go z listy inicjalizacyjnej. Użyto znacznika `.text'.
Struktura programu jest podobna do struktury języków wyższego rzędu. Pojawia się deklaracja zmiennych, główne ciało programu po komendzie „_start:” oraz deklaracja zakończenia komendą SYSEXIT.
Zadanie 2:
Napisać program, który zapyta użytkownika o imię, użytkownik ma je wprowadzić z klawiatury, po czym program wyświetli je ponownie na ekranie.
Wykonanie:
Procedura ta sama. Utworzenie pliku Makefile o zawartości:
Kompilator skompiluje plik imie2 o zawartości:
Pojawia się komenda SYSREAD, której zadaniem jest pobranie ciągu znaków z klawiatury. Poza zmienną, która zawiera ciąg „Podaj imie” w tym wypadku nazywającą się „msg_hello”, należało wprowadzić drugą, do której zostanie zapisany ciąg znaków zczytany z klawiatury. W tym wypadku nazywa się „msg_hel”. Należało nadać długość drugiej zmiennej, by była w stanie spamiętać odczyt z klawiatury. Uznano, że 20 znaków wystarczy na podanie imienia. (`xx…xx'). Użyto również znacznika „.data”, gdyż z .text pojawiały się problemy przy wyświetlaniu informacji na ekran. Pierwszym przyjętym znakiem była zawsze spacja, która zastępowała pierwszy znak we wprowadzanym ciągu znaków. Przyczyna problemu nie była znana i do tej pory jest nieznana. Rozwiązaniem okazało się potraktowanie informacji nie jako tekst lecz dane.
Wnioski:
Oba programy działały prawidłowo, mimo drobnych problemów przy realizacji drugiego z nich.
Elżbieta Tchorowska 171067
Konrad Kukulski 163930
imie: imie.o
ld -o imie imie.o
imie.o: imie.s
as -o imie.o imie.s
SYSEXIT = 1
SYSREAD = 3
SYSWRITE = 4
STDOUT = 1
STDIN = 0
EXIT_SUCCESS = 0
.align 32
.text
msg_imie: .ascii "Podaj imie \n"
msg_imie_len = . - msg_imie
.global _start
_start:
mov $SYSWRITE, %eax
mov $STDOUT, %ebx
mov $msg_imie, %ecx
mov $msg_imie_len, %edx
int $0x80
mov $SYSEXIT, %eax
mov $EXIT_SUCCESS, %ebx
int $0x80
Imie2 imie2.o
ld -o imie2 imie2.o
imie2.o: imie2.s
as -o imie2.o imie2.s
SYSEXIT = 1
SYSREAD = 3
SYSWRITE = 4
STDOUT = 1
STDIN = 0
EXIT_SUCCESS = 0
.align 32
.data
msg_hello: .ascii "Podaj imie\n"
msg_hello_len = . - msg_hello
msg_hel: .ascii "xxxxxxxxxxxxxxxxxx"
msg_hel_len = . - msg_hel
.global _start
_start:
mov $SYSWRITE, %eax
mov $STDOUT, %ebx
mov $msg_hello, %ecx
mov $msg_hello_len, %edx
int $0x80
mov $SYSREAD, %eax
mov $STDIN, %ebx
mov $msg_hel, %ecx
mov $msg_hel_len, %edx
int $0x80
mov $SYSEXIT, %eax
mov $EXIT_SUCCESS, %ebx
int $0x80