1 1 Przykład 1/3 main() { int i,j,k,m; /* i-m : $s0-$s3 */... i = mult(j,k);... m = mult(i,i);... } int mult (int mcand, int mlier){ int product; product.

1 1 1 Przykład 1/3 main() { int i,j,k,m; /* i-m : $s0-$s3...
Author: Beatrycze Świt
0 downloads 4 Views

1 1 1 Przykład 1/3 main() { int i,j,k,m; /* i-m : $s0-$s3 */... i = mult(j,k);... m = mult(i,i);... } int mult (int mcand, int mlier){ int product; product = 0; while (mlier > 0) { product += mcand; mlier -= 1; } return product; }

2 2 2 Przykład 2/3 start:... add $a0,$s1,$0 # arg0 = j add $a1,$s2,$0 # arg1 = k jal mult # call mult add $s0,$v0,$0 # i = mult()... add $a0,$s0,$0 # arg0 = i add $a1,$s0,$0 # arg1 = i jal mult # call mult add $s3,$v0,$0 # m = mult()... j exit main() { int i,j,k,m; /* i-m:$s0-$s3 */... i = mult(j,k);... m = mult(i,i);... }

3 3 3 Przykład 3/3 mult: add $t0,$0,$0 # prod=0 Loop: slt $t1,$0,$a1 # mlr > 0? beq $t1,$0,Fin # no=>Fin add $t0,$t0,$a0 # prod+=mc addi $a1,$a1,-1 # mlr-=1 j Loop # goto Loop Fin: add $v0,$t0,$0 # $v0=prod jr $ra # return int mult (int mcand, int mlier){ int product = 0; while (mlier > 0) { product += mcand; mlier -= 1; } return product; }

4 4 4 System Calls Umożliwia realizację operacji we/wyj (biblioteka we/wyj) w symulatorze SPIM Rejestr $v0 jest używany jako rejestr sterujący – wskazuje na operację do wykonania (tabela) Argumenty sa ładowane do rejestrów $a0 oraz $a1. Odpowiedź w rejestrze $v0 (operacje czytania) Sugerowana kolejność instrukcji -Załaduj rejestry argumentu -Wprowadź kod operacji -Wykonaj syscall li $a0, 10 # load argument $a0=10 li $v0, 1 # call code to print integer syscall # print $a0

5 5 5 System Calls

6 6 6 Dyrektywy Asemblera - wybrane.text - sekcja kodu, po tej dyrektywie występują instrukcje asemblera.data- sekcja danych.globl- specyfikacja etykiet globalnych (adres symboliczny)

7 7 7 Pełny przykład 1.text # sekcja kodu.globl main main:li $v0, 4 # ustawienie drukowania stringu la $a0, str # adres stringu do wydruku syscall # drukuj string li $v0, 10 # ustawienie wyjścia syscall # wyjście.data # sekcja danych str:.asciiz Hello world!\n # NUL kończy string (jak w C)

8 8 8 Pełny przykład 2.text.globl main main:la $t0, Aaddr # $t0 = wskaznik na tablicę A lw $t1, len # $t1 = rozmiar tablicy A sll $t1, $t1, 2 # $t1 = 4*rozmiar add $t1, $t1, $t0 # $t1 = za ostatnim elementem A

9 9 9 Pełny przykład 2 Loop:lw $t2, ($t0) # $t2 = A[i] addi $t2, $t2, 5 # $t2 = $t2 + 5 sw $t2, ($t0) # A[i] = $t2 addi $t0, $t0, 4 # i = i+1 bne $t0, $t1, loop # if $t0

10 10 Przykłady we/wyj.data # sekcja danych promptInt:.asciiz Wprowadz wartosc typu int " resultInt:.asciiz Nastepna wartosc = " linefeed:.asciiz "\n" enterkey:.asciiz Nacisnij dowolny klawisz aby zakonczyc".text # sekcja kodu main: # zaproszenie do wprowadzenia wartosci int li $v0,4 # kod dla wydruku napisu la $a0,promptInt # w $a0 adres napisu syscall # wydrukuj zaproszenie # pobranie int z wejścia li $v0,5 # kod odczytu int syscall # pobierz int – wynik w $v0 move $t0,$v0 # int w $t0 # wylicz następną wartość int addi $t0, $t0, 1 # t0

11 11 Przykłady we/wyj # wydrukuj kolejna wartosc li $v0,4 # kod dla wydruku napisu la $a0,resultInt # w $a0 adres napisu syscall # wydrukuj napis # print out the result li $v0,1 # kod wydruku int move $a0,$t0 # wynik w $a0 syscall # wydrukuj wynik # przejscie do nowej linii li $v0,4 # kod dla wydruku napisu la $a0,linefeed # w $a0 adres napisu syscall # przejscie do nowej lini # oczekiwanie na nacisniecie klawisza li $v0,4 # kod dla wydruku napisu la $a0,enterkey # w $a0 adres napisu syscall # wydrukuj napis # oczekiwanie na nacisniecie klawisza – odczytana wartosc jest ignorowana li $v0,5 # kod odczytu int syscall # pobierz int – wynik w $v0 # Koniec li $v0,10 # kod wyjscia syscall # wyjscie z programu

12 12 Lista instrukcji add Rd, Rs, Rt Rd = Rs + Rt (signed) addu Rd, Rs, Rt Rd = Rs + Rt (unsigned) addi Rd, Rs, Imm Rd = Rs + Imm (signed) sub Rd, Rs, Rt Rd = Rs - Rt (signed) subu Rd, Rs, Rt Rd = Rs - Rt (unsigned) div Rs, Rt lo = Rs/Rt, hi = Rs mod Rt (integer division, signed) divu Rs, Rt lo = Rs/Rt, hi = Rs mod Rt (integer division, unsigned) div Rd, Rs, Rt Rd = Rs/Rt (integer division, signed) divu Rd, Rs, Rt Rd = Rs/Rt (integer division, unsigned) rem Rd, Rs, Rt Rd = Rs mod Rt (signed) remu Rd, Rs, Rt Rd = Rs mod Rt (unsigned) mul Rd, Rs, Rt Rd = Rs * Rt (signed) mult Rs, Rt hi, lo = Rs * Rt (signed, hi = high 32 bits, lo = low 32 bits)

13 13 Lista instrukcji multu Rd, Rs hi, lo = Rs * Rt (unsigned, hi = high 32 bits, lo = low 32 bits) and Rd, Rs, Rt Rd = Rs Rt andi Rd, Rs, Imm Rd = Rs Imm neg Rd, Rs Rd = -(Rs) nor Rd, Rs, Rt Rd = (Rs + Rt) not Rd, Rs Rd = (Rs) or Rd, Rs, Rt Rd = Rs + Rt ori Rd, Rs, Imm Rd = Rs + Imm xor Rd, Rs, Rt Rd = Rs Rt xori Rd, Rs, Imm Rd = Rs Imm sll Rd, Rt, Sa Rd = Rt left shifted by Sa bits sllv Rd, Rs, Rt Rd = Rt left shifted by Rs bits srl Rd, Rs, Sa Rd = Rt right shifted by Sa bits srlv Rd, Rs, Rt Rd = Rt right shifted by Rs bits move Rd, Rs Rd = Rs

14 14 Lista instrukcji mfhi Rd Rd = hi mflo Rd Rd = lo li Rd, Imm Rd = Imm lui Rt, Imm Rt[31:16] = Imm, Rt[15:0] = 0 lb Rt, Address(Rs) Rt = byte at M[Address + Rs] (sign extended) sb Rt, Address(Rs) Byte at M[Address + Rs] = Rt (sign extended) lw Rt, Address(Rs) Rt = word at M[Address + Rs] sw Rt, Address(Rs) Word at M[Address + Rs] = Rt slt Rd, Rs, Rt Rd = 1 if Rs = Rt (signed) slti Rd, Rs, Imm Rd = 1 if Rs = Imm (signed) sltu Rd, Rs, Rt Rd = 1 if Rs = Rt (unsigned) beq Rs, Rt, Label Branch to Label if Rs == Rt beqz Rs, Label Branch to Label if Rs == 0 bge Rs, Rt, Label Branch to Label if Rs >= Rt (signed) bgez Rs, Label Branch to Label if Rs >= 0 (signed) · bgezal Rs, Label Branch to Label and Link if Rs >= Rt (signed)

15 15 Lista instrukcji bgt Rs, Rt, Label Branch to Label if Rs > Rt (signed) bgtu Rs, Rt, Label Branch to Label if Rs > Rt (unsigned) bgtz Rs, Label Branch to Label if Rs > 0 (signed) ble Rs, Rt, Label Branch to Label if Rs