2. Napisz program, który prosi użytkownika o wprowadzenie dwóch liczb całkowitych: n1,n2 i wypisuje sumę wszystkich liczby od n1 do n2.
Na przykład, jeśli użytkownik wprowadzi n1 = 3 i n2 = 7, wówczas program powinien wyświetlać sumę jako 25. (Assembler)



Odpowiedź :

Rekah4

Odpowiedź:

li $v0,5

syscall

move $s0, $v0

li $v0,5

syscall

move $s1, $v0

move $s3,$s0

add $s1,$s1,0x1

L0:

add $s4,$s4,$s3

add $s3,$s3,0x1

bne $s3,$s1,L0

li $v0,1

move $a0,$s4

syscall

addi $v0, $zero, 10

syscall

**poniższy kod łatwiej będzie interpretować za pomocą np. Marsa:

Wersja z opisami:

#Pobieranie liczby n1

li $v0,5 #ustawienie flagi na 5 - stdin

syscall #wywołanie przerwania systemowego

move $s0, $v0 #przenosimy zapisaną wartość z stdin (z klawy) do rejestru s0

#Pobieranie liczby n2

li $v0,5 #ustawienie flagi na 5 - stdin

syscall #wywołanie przerwania systemowego

move $s1, $v0 #przenosimy zapisaną wartość z stdin (z klawy) do rejestru s1

#Aktualnie mamy zapisane nasze n1 pod $s0 i n2 pod $s1

#lecimy dalej

#przydało by się zrobić coś w stylu pętli  albo użyć wzoru na sume ciągów

#trochę utrudnimy i zrobimy pętle:

#wykorzystamy rejestr s3 jako licznik do pętli oraz s4 jako rejestr sumujący kolejne elementy

move $s3,$s0 #licznikowi ustawiamy wartość n1

add $s1,$s1,0x1 #dodajemy do maxymalnej wartości +1 aby zliczało ostatni element

L0: #etykieta coś jak kiedyś GOTO umożliwia powrót do tej części kodu z innej części

add $s4,$s4,$s3 #do sumy dodajemy sume i licznik  s+=i

add $s3,$s3,0x1 #podnosimy licznik o 1

bne $s3,$s1,L0 # if( licznik != n2) skocz do etykiety L0:

#ta część kodu wykona się jeżeli licznik i n2 są równe

#Wyświetlamy nasz wynik sumowania

li $v0,1 #flaga na 1 - stdout int

move $a0,$s4 # wkładamy sume do rejestru a0 odpowiedzialnego w tym przerwaniu za wyświetlanie

syscall

addi $v0, $zero, 10 #ustawiamy flage na 10 - return

syscall