Wydanie R2020.06.1
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
|
@ Jan Potocki 2020
|
||||||
|
|
||||||
.global fibb
|
.global fibb
|
||||||
.type fibb, %function
|
.type fibb, %function
|
||||||
|
|
||||||
|
@ Segment kodu
|
||||||
.text
|
.text
|
||||||
fibb:
|
fibb:
|
||||||
push {r4, lr}
|
push {r4, lr}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
|
@ Jan Potocki 2020
|
||||||
|
|
||||||
.global timestamp
|
.global timestamp
|
||||||
.type timestamp, %function
|
.type timestamp, %function
|
||||||
|
|
||||||
|
@ Segment kodu
|
||||||
.text
|
.text
|
||||||
timestamp:
|
timestamp:
|
||||||
isb
|
isb
|
||||||
|
|||||||
+55
-33
@@ -1,10 +1,15 @@
|
|||||||
|
@ Jan Potocki 2020
|
||||||
|
|
||||||
|
@ Definicje numerow funkcji systemowych i ich parametrow
|
||||||
SYSEXIT = 1
|
SYSEXIT = 1
|
||||||
SYSREAD = 3
|
SYSREAD = 3
|
||||||
SYSWRITE = 4
|
SYSWRITE = 4
|
||||||
STDIN = 0
|
STDIN = 0
|
||||||
STDOUT = 1
|
STDOUT = 1
|
||||||
|
|
||||||
|
@ Stale okreslajace rozmiar przetwarzanych danych
|
||||||
num_length = 256
|
num_length = 256
|
||||||
|
@ ...tego nie ruszac - inaczej stanie sie "cud nad klawiatura" :-D
|
||||||
word_length = 4
|
word_length = 4
|
||||||
buf_length = num_length * 2
|
buf_length = num_length * 2
|
||||||
num_words = num_length / word_length
|
num_words = num_length / word_length
|
||||||
@@ -12,92 +17,109 @@ buf_words = buf_length / word_length
|
|||||||
|
|
||||||
.global main
|
.global main
|
||||||
|
|
||||||
|
@ Segment niezainicjalizowanych danych
|
||||||
.bss
|
.bss
|
||||||
num1: .space num_length
|
num1: .space num_length
|
||||||
num2: .space num_length
|
num2: .space num_length
|
||||||
result: .space buf_length
|
result: .space buf_length
|
||||||
|
|
||||||
|
@ Segment kodu
|
||||||
.text
|
.text
|
||||||
main:
|
main:
|
||||||
|
|
||||||
|
@ Glowna petla
|
||||||
loop:
|
loop:
|
||||||
mov r7, #SYSREAD
|
mov r7, #SYSREAD @ Wczytanie danych ze standardowego wejscia
|
||||||
mov r0, #STDIN
|
mov r0, #STDIN @ ...funkcja systemowa read
|
||||||
ldr r1, =num1
|
ldr r1, =num1
|
||||||
mov r2, #buf_length
|
mov r2, #buf_length
|
||||||
swi 0x0
|
swi 0x0
|
||||||
|
|
||||||
cmp r0, #buf_length
|
@ UWAGA
|
||||||
blt end
|
@ Tutaj wczytane zostana od razu obie liczby
|
||||||
|
@ num1 i num2 sa w pamieci bezposrednio po sobie...
|
||||||
|
@ ...i zostala przekazana do funkcji read dlugosc calego bloku
|
||||||
|
|
||||||
ldr r8, =num1
|
cmp r0, #buf_length @ r0 - liczba wczytanych bajtow
|
||||||
ldr r9, =num2
|
blt end @ Jezeli nie ma 512, to dane sie skonczyly
|
||||||
ldr r10, =result
|
|
||||||
|
|
||||||
eor r0, r0, r0
|
ldr r8, =num1 @ r8 - adres pierwszej liczby
|
||||||
|
ldr r9, =num2 @ r9 - adres drugiej liczby
|
||||||
|
ldr r10, =result @ r10 - adres bufora na wynik
|
||||||
|
|
||||||
eor r4, r4, r4
|
eor r0, r0, r0 @ r0 - wartosc zero (do zapisu w pamieci)
|
||||||
|
|
||||||
|
eor r4, r4, r4 @ r4 - indeks petli zerujacej
|
||||||
|
|
||||||
|
@ Petla zerujaca bufor na wynik
|
||||||
zero:
|
zero:
|
||||||
str r0, [r10, r4, lsl#2]
|
str r0, [r10, r4, lsl#2]
|
||||||
add r4, r4, #1
|
add r4, r4, #1
|
||||||
cmp r4, #buf_words
|
cmp r4, #buf_words
|
||||||
blt zero
|
blt zero
|
||||||
|
|
||||||
eor r4, r4, r4
|
eor r4, r4, r4 @ r0 - indeks pierwszej petli
|
||||||
|
|
||||||
|
@ Mnozenie - petla zewnetrzna
|
||||||
loop1:
|
loop1:
|
||||||
eor r11, r11, r11
|
eor r2, r2, r2 @ r2 - miejsce na starsza czesc wyniku
|
||||||
eor r12, r12, r12
|
|
||||||
|
|
||||||
eor r2, r2, r2
|
@ Flagi przeniesienia (potrzebne sa dwie i tego sie nie uprosci)
|
||||||
|
eor r11, r11, r11 @ r11 - dla biezacego mnozenia (rejestry)
|
||||||
|
eor r12, r12, r12 @ r12 - dla koncowego wyniku (w pamieci)
|
||||||
|
|
||||||
eor r5, r5, r5
|
eor r5, r5, r5 @ r5 - indeks drugiej petli
|
||||||
|
|
||||||
|
@ Mnozenie - petla wewnetrzna
|
||||||
loop2:
|
loop2:
|
||||||
ldr r0, [r8, r4, lsl#2]
|
ldr r0, [r8, r4, lsl#2]
|
||||||
ldr r3, [r9, r5, lsl#2]
|
ldr r3, [r9, r5, lsl#2]
|
||||||
umull r0, r1, r0, r3
|
umull r0, r1, r0, r3
|
||||||
|
|
||||||
msr apsr_nzcvq, r11
|
@ Dodanie starszej czesci wyniku z poprzedniej iteracji
|
||||||
adcs r0, r0, r2
|
msr apsr_nzcvq, r11 @ Ladowanie flag z r11
|
||||||
mrs r11, apsr
|
adcs r0, r0, r2 @ Dodawanie z przeniesieniem i ustawieniem flag
|
||||||
|
mrs r11, apsr @ Zapis rejestru apsr (calego) w r11
|
||||||
|
|
||||||
mov r2, r1
|
mov r2, r1 @ Przechowanie starszej czesci wyniku w r2
|
||||||
add r6, r4, r5
|
|
||||||
|
|
||||||
msr apsr_nzcvq, r12
|
add r6, r4, r5 @ r6 - indeks wyniku (suma indeksow obu petli)
|
||||||
|
|
||||||
|
msr apsr_nzcvq, r12 @ Ladowanie flag z r12
|
||||||
ldr r1, [r10, r6, lsl#2]
|
ldr r1, [r10, r6, lsl#2]
|
||||||
adcs r1, r0, r1
|
adcs r1, r0, r1 @ Dodawanie z przeniesieniem i ustawieniem flag
|
||||||
str r1, [r10, r6, lsl#2]
|
str r1, [r10, r6, lsl#2]
|
||||||
mrs r12, apsr
|
mrs r12, apsr @ Zapis rejestru apsr (calego) w r12
|
||||||
|
|
||||||
add r5, r5, #1
|
add r5, r5, #1
|
||||||
cmp r5, #num_words
|
cmp r5, #num_words
|
||||||
blt loop2
|
blt loop2 @ Koniec wewnetrznej petli
|
||||||
|
|
||||||
|
@ Tutaj musimy sie jeszcze zajac najstarsza czescia wyniku
|
||||||
|
@ (z ostatniej iteracji petli wewnetrznej)
|
||||||
add r6, r6, #1
|
add r6, r6, #1
|
||||||
|
|
||||||
msr apsr_nzcvq, r11
|
msr apsr_nzcvq, r11 @ Ladowanie flag z r11
|
||||||
adc r2, r2, #0
|
adc r2, r2, #0 @ Dodawanie z przeniesieniem bez ustawiania flag
|
||||||
|
|
||||||
msr apsr_nzcvq, r12
|
msr apsr_nzcvq, r12 @ Ladowanie flag z r12
|
||||||
ldr r1, [r10, r6, lsl#2]
|
ldr r1, [r10, r6, lsl#2]
|
||||||
adc r1, r1, r2
|
adc r1, r1, r2 @ Dodawanie z przeniesieniem bez ustawiania flag
|
||||||
str r1, [r10, r6, lsl#2]
|
str r1, [r10, r6, lsl#2]
|
||||||
|
|
||||||
add r4, r4, #1
|
add r4, r4, #1
|
||||||
cmp r4, #num_words
|
cmp r4, #num_words
|
||||||
blt loop1
|
blt loop1 @ Koniec zewnetrznej petli
|
||||||
|
|
||||||
mov r7, #SYSWRITE
|
mov r7, #SYSWRITE @ Wypisanie wyniku na standardowe wyjscie
|
||||||
mov r0, #STDOUT
|
mov r0, #STDOUT @ ...funkcja systemowa write
|
||||||
ldr r1, =result
|
ldr r1, =result
|
||||||
mov r2, #buf_length
|
mov r2, #buf_length
|
||||||
swi 0x0
|
swi 0x0
|
||||||
|
|
||||||
b loop
|
b loop @ Koniec glownej petli
|
||||||
|
|
||||||
end:
|
end:
|
||||||
mov r7, #SYSEXIT
|
mov r7, #SYSEXIT @ Funkcja systemowa exit...
|
||||||
mov r0, #0
|
mov r0, #0 @ ...kod zakonczenia - 0
|
||||||
swi 0x0
|
swi 0x0
|
||||||
|
|||||||
Reference in New Issue
Block a user