Bąkowski Łukasz I8X3S1
1
Architektura i Organizacja
Komputerów II
Analiza i projektowanie programów na poziomie asemblera.
Program, realizujący zadane przekształcenia tablic liczb
zmiennoprzecinkowych
.
Konkurs na najszybciej działający program, realizujący zadane
przekształcenia tablic liczb zmiennoprzecinkowych.
Bąkowski Łukasz I8X3S1
Bąkowski Łukasz I8X3S1
2
Treść zadania
I.
Napisać program Lab9v3 w asemblerze komputera DLX, który:
1. Zadeklaruje dwie tablice przechowujące liczby zmiennoprzecinkowe podwójnej
precyzji: T 110- elementową oraz Twy 100-elementową, a także zmienną Suma
zmiennoprzecinkową podwójnej precyzji
2. Komórki tablicy T wypełni (nie za pomocą statycznej deklaracji z nadaniem
wartości początkowych) kolejnymi liczbami o części ułamkowej równej 0.9 i
części całkowitej rosnącej, począwszy od powiększonego o 100 numeru
w dzienniku studenta/ studentki (np. nr=1, liczby T[1] = 101.9, T[2] = 102.9 itd.).
3. Następnie dla każdego elementu tablicy Twy wykona operację
4. W zmiennej Suma umieści sumę wszystkich elementów tablicy Twy.
II.
Przed rozpoczęciem tworzenia programu zaprojektować arkusz kalkulacyjny w
Excelu, wykonujący te same obliczenia.
III.
Zmierzyć liczbę cykli zegarowych dla wykonania uzyskanego programu przy
dowolnej, wybranej przez studentkę/ studenta konfiguracji sprzętowej, za wyjątkiem
czasów fazy Execute jednostek zmiennoprzecinkowych (2/5/19).
IV.
W przypadku uzyskania poprawnego wyniku działania programu (zmienna Suma i
tablice T i Twy), program bierze udział w konkursie na „najszybciej działający
program”. Kryterium oceny jest liczba cykli zegarowych, potrzebnych do wykonania
programu. Zwycięzca konkursu otrzymuje dwie oceny bdb do średniej z laboratorium.
Pozostali uczestnicy oceny pozytywne, zależne od uzyskanego czasu wykonania. W
przypadku niepoprawnego działania programu ocena za ćwiczenie 9-10 jest równa
ndst. Zwycięzca jest zobowiązany do publicznego przedstawienia na forum grupy
opracowanego programu, ze wskazaniem sposobów uzyskania najszybszego
programu.
Bąkowski Łukasz I8X3S1
3
Kod programu LB_L910v3.s
Opisy poszczególnych funkcji oraz komentarze zostały napisane kursywą. W wypadku
powtórzenia wielokrotnie komendy, komentarz występuje przy pierwszym jej wystąpieniu
oraz przy ważnych miejscach kodu. Sam kod programu został napisany czcionką
Luicid
Console.
; Lukasz Bakowski I8X3S1
linijki kodu zaczynające się od “ ;” są komentarzami autora programu.
; Zadanie Laboratoryjne 9-10
.data
dyrektywa mówiąca, że występujący po niej kod jest deklaracją zmiennych
T:
.space
880
deklaracja miejsc w pamięci o nazwie T i wielkości 880 bajty
.align 4
wyrównywanie danych
Twy: .space
800
.align 4
Suma: .space 8
a:
.double
104.9
.text
dyrektywa mówiąca, że napisy poniżej, są traktowane jako instrukcje
.global main
main:
; ---------------------------
addi R2,R0,a
do rejestru r2 załaduj adres danej a
ld F4,0(R2)
do f4 wpisywane jest 8bajtow spod 0bajtu adresu zapisanego w r2
;----------------------------
addi R6,R0,1
do rejestru r6 załaduj wartość 1
movi2fp F0,R6
wartości rejestru r6 kopiowana do rejestru f0
cvti2d F2,F0
konwertowanie liczby pojedynczej precyzji na podwójnej precyzji
; ----------------------------
addi R2,R0,T
do rejestru r2 załaduj adres tablicy danych T
;----------------------------
addi R5,R0,7
;----------------------------
Petla1:
nazwa etykiety
movd F24,F22
; Ti+5 * Ti+4 * Ti+3
do f24 przesyłana jest wartość spod rejestru f22
multd F22,F20,F4
; Ti+6 * Ti+5 * Ti+4
do f22 zapisywana jest wartość iloczyny wartości spod rejestrów f20 i f4
multd F20,F18,F4
; Ti+6 * Ti+5
Bąkowski Łukasz I8X3S1
4
subi R5,R5,1
wartości rejestr r5 zmieszana o 1
movd F18,F4
; Ti+6
movd F16,F14
; Ti+1
movd F14,F12
; Ti+2
movd F12,F10
; Ti+3
movd F10,F8
; Ti+4
movd F8,F6
; Ti+5
movd F6,F4
; Ti+6
sd 0(R2),F4
zapisanie wartości rejestru f4 do adresu spod r2
addd F4,F4,F2
do wartości rejestru f4 dodawana wartość rejestru f2
addi R2,R2,8
bnez R5,Petla1
jeżeli r5 = 0, idź dalej, jeżeli nie, idź do etykiety Petla1
; ----------------------------
addi R3,R0,Twy
subi R3,R3,8
; ----------------------------
subd F28,F22,F16
; E = (Ti+6 * Ti+5 * Ti+4) - Ti+2
do f28przesyłana jest różnica wartość rejestru f22 i F16
; ----------------------------
addi R5,R0,100
; ----------------------------
addd F26,F24,F14
; F = (Ti+5 * Ti+4 * Ti+3) + Ti+1
; ----------------------------
Petla2:
divd F30,F28,F26
; E/F
do f30 zapisywana jest wartość ilorazu wartości spod f28 przez f26
subi R5,R5,1
subd F28,F22,F16
; E = (Ti+6 * Ti+5 * Ti+4) - Ti+2
addd F26,F24,F14
; F = (Ti+5 * Ti+4 * Ti+3) + Ti+1
movd F24,F22
; Ti+5 * Ti+4 * Ti+3
multd F22,F20,F4
; Ti+6 * Ti+5 * Ti+4
multd F20,F18,F4
; Ti+6 * Ti+5
movd F18,F4
; Ti+6
movd F16,F14
; Ti+1
movd F14,F12
; Ti+2
movd F12,F10
; Ti+3
movd F10,F8
; Ti+4
movd F8,F6
; Ti+5
movd F6,F4
; Ti+6
sd 0(R3),F30
addd F0,F0,F30
sd 0(R2),F4
addi R3,R3,8
addi R2,R2,8
addd F4,F4,F2
bnez R5,Petla2
; ----------------------------
divd F30,F28,F26
; E/F
; ----------------------------
Bąkowski Łukasz I8X3S1
5
addi R5,R0,3
; ----------------------------
Petla3:
sd 0(R2),F4
subi R5,R5,1
addd F4,F4,F2
addi R2,R2,8
bnez R5,Petla3
; ----------------------------
sd 0(R3),F30
sd Suma, F0
dwa słowa z rejestru f0 zapisywane są pod adres Suma
trap 0
przerwanie końca progamu
Bąkowski Łukasz I8X3S1
6
Algorytm programu LB_L910v3.s
Start
Koniec
R2 – adres początku tabeli T
F2=1.0 F4=104.9 R5=7
R5 == 0
F24 = F22 F22 = F20*F4
F20 = F18*F4 F18 = F4
F16 = F14 F14 = F12
F12 = F10 F10 = F8
F8 = F6 F6 = F4 R5=R5-1
F4 zapisywane do T
F4=F4+F2 R2=R2+8
R3 – adres początku tabeli Twy
R5=100 R5 = R5-1 R2 = R2+8
F28 = F22-F16 F26 = F24+F14
R5 == 0
F30 = F28/F26
F28 = F22-F16 F26 = F24+F14
F24 = F22 F22 = F20*F4
F20 = F18*F4 F18 = F4
F16 = F14 F14 = F12
F12 = F10 F10 = F8
F8 = F6 F6 = F4 R5=R5-1
F0=F0+F30
F4 zapisywane do T
F4=F4+F2 R2=R2+8
F30 = F28 / F26
F0 = F0+F30
F0 zapisywane do Suma
R5=3
R5 == 0
F4 zapisywane do T
F4=F4+F2 R2=R2+8
NIE
TAK
NIE
TAK
NIE
TAK
Bąkowski Łukasz I8X3S1
7
Zawartość arkusza kalkulacyjnego oraz pamięci operacyjnej
symulatora WinDLX
Zawartość arkusza kalkulacyjnego dla pierwszych i ostatnich 10 elementów tablicy T i Twy.
Oraz dla sumy elementów Twy:
Nr
T
1
104,9
2
105,9
3
106,9
4
107,9
5
108,9
6
109,9
7
110,9
8
111,9
9
112,9
10
113,9
…
…
101
204,9
102
205,9
103
206,9
104
207,9
105
208,9
106
209,9
107
210,9
108
211,9
109
212,9
110
213,9
Nr
Twy
1
1,02764
2
1,02738
3
1,02714
4
1,02689
5
1,02665
6
1,02642
7
1,02619
8
1,02596
9
1,02574
10
1,02552
…
…
91
1,01511
92
1,01503
93
1,01496
94
1,01488
95
1,01481
96
1,01474
97
1,01467
98
1,01459
99
1,01452
100
1,01445
Zawartość pamięci operacyjnej symulatora WinDLX dla programu LB_L910v3.s :
Suma:
Nr w dzienniku
4
Suma
101,96547
Bąkowski Łukasz I8X3S1
8
T:
Twy:
Bąkowski Łukasz I8X3S1
9
Opis Podgląd okna STATISTICA
dla programu LB_L910v3.s
CPI programu =
1,325446.