Lista Rozkazów:
Transkrypt
Lista Rozkazów:
Lista Rozkazów: Język komputera (cd.) Stałe 32-bitowe Większość stałych jest mała 16-bitowe stałe wystarczają Czasem potrzeba stałej 32-bitowej lui rt, constant Wstawia 16-bitową stałą do bardziej znaczącej części rejestru rt Pozostałe bity rejestru ustawia na 0 lui $s0, 61 0000 0000 0111 1101 0000 0000 0000 0000 ori $s0, $s0, 2304 0000 0000 0111 1101 0000 1001 0000 0000 Rozkazy – język komputera Adresy w skokach branch Rozkaz skoku (typ I) Opcode, dwa rejestry, adres skoku Zazwyczaj potrzebna ,,krótkie skoki’’ do przodu lub do tyłu op rs rt constant or address 6 bits 5 bits 5 bits 16 bits Adresowanie względem PC Adres skoku = PC + offset × 4 PC zwiększony o 4 przed obliczeniem adr. Rozkazy – język komputera Adresy w skokach Jump Skoki bezwarunkowe (j, jal – ten drugi poznamy wkrótce) skaczą ,,daleko’’ Pełny adres zakodowany w rozkazie op address 6 bits 26 bits Adresowanie (pseudo)bezpośrednie: Adres docelowy = PC31…28 : (address × 4) Rozkazy – język komputera Przykład adresowania Pętla z jednego z przykładów Zakładamy, że Loop etykietuje 80000 $t1, $s3, 2 80000 0 0 19 9 4 0 add $t1, $t1, $s6 80004 0 9 22 9 0 32 lw $t0, 0($t1) 80008 35 9 8 0 bne $t0, $s5, Exit 80012 5 8 21 2 addi $s3, $s3, 1 80016 8 19 19 1 j 80020 2 Loop: sll Exit: … Loop 80024 Rozkazy – język komputera 20000 Dalekie ,,branche’’ Jeśli adres docelowy jest daleki asembler przeorganizuje kod. Przykład: beq $s0,$s1, L1 ↓ bne $s0,$s1, L2 j L1 L2: … Rozkazy – język komputera Tryby adresowania MIPS Rozkazy – język komputera Procedury int funkcja (int n){ int i,j; (...) return j; } main () { int i,j; i=funkcja(i); ... j=funkcja(i); } • funkcja operuje na pewnych rejestrach, być może na tych samych co program główny • po skoku do funkcji musimy wrócić do miejsca z którego skakaliśmy -- funkcja jest wywoływana z różnych miejsc; musimy zapamiętać adres powrotu • do funkcji w jakiś sposób musimy przekazać parametry i w jakiś sposób musimy otrzymać wyniki. Rozkazy – język komputera Procedury Wymagane kroki 1. 2. 3. 4. 5. 6. Przekaż parametry do procedury Przekaż sterowanie do procedury Przygotuj miejsce na dane procedury Wykonaj procedurę Przekaż wyniki stronie wywołującej Powróć do miejsca wywołania Rozkazy – język komputera Użycie rejestrów $a0 – $a3: parametry wywołania (rej. 4 – 7) $v0, $v1: zwracane wyniki (rej. 2 i 3) $t0 – $t9: zmienne tymczasowe, mogą być zmienione przez procedurę $s0 – $s7: muszą być odtworzone po zakończeniu procedury $gp: global pointer (rej. 28) $sp: stack pointer (rej. 29) $fp: frame pointer (rej. 30) $ra: return address (rej. 31) Rozkazy – język komputera Wywołanie procedury Wywołanie: jump and link jal ProcedureLabel Adres kolejnego rozkazu umieszczany w $ra Skok pod wskazaną etykietę Powrót z procedury: jump register jr $ra Kopiuje $ra do licznika rozkazów PC Może być użyty do innych celów Np. konstrukcje case/switch Rozkazy – język komputera Procedura ,,liść’’ Procedura nie wywołująca innych procedur Kod C: int leaf_example (int g, h, i, j) { int f; f = (g + h) - (i + j); return f; } Parametry g, …, j w $a0, …, $a3 f w $s0 (musimy zachować $s0 na stosie) Wynik w $v0 Rozkazy – język komputera Procedura ,,liść’’ Kod MIPS: leaf_example: addi $sp, $sp, -4 sw $s0, 0($sp) add $t0, $a0, $a1 add $t1, $a2, $a3 sub $s0, $t0, $t1 add $v0, $s0, $zero lw $s0, 0($sp) addi $sp, $sp, 4 jr $ra Rozkazy – język komputera odłóż $s0 na stosie kod procedury Wynik odtworzenie $s0 Powrót Procedury wywołujące inne W szczególności procedury rekurencyjne Strona wywołująca musi odłożyć na stosie: Swój adres powrotu Parametry i zmienne tymczasowe, które będą potrzebne po powrocie Po powrocie z wywoływanej procedury odtwarza powyższe Rozkazy – język komputera Przykład procedury rekuren. Kod C: int fact (int n) { if (n < 1) return f; else return n * fact(n - 1); } Parametr n w $a0 Wynik w $v0 Rozkazy – język komputera Przykład procedury rekuren. Kod MIPS: fact: addi sw sw slti beq addi addi jr L1: addi jal lw lw addi mul jr $sp, $ra, $a0, $t0, $t0, $v0, $sp, $ra $a0, fact $a0, $ra, $sp, $v0, $ra $sp, -8 4($sp) 0($sp) $a0, 1 $zero, L1 $zero, 1 $sp, 8 $a0, -1 0($sp) 4($sp) $sp, 8 $a0, $v0 # # # # zrób 2 miejsca na stosie zachowaj adres powrotu zachowaj parametr czy n < 1 # # # # # # # # # # jeśli tak, wynik = 1 usuń 2 elementy ze stosu i wróć wpp. zmniejsz n wywołanie rekurencyjne odtwórz oryginalne n i adres powrotu usuń 2 elementy ze stosu wykonaj domnożenie do wyniku i wróć Rozkazy – język komputera Dane lokalne na stosie Dane lokalne procedury Ramka procedury (rekord aktywacji) Niekiedy, oprócz $sp, wygodnie użyć $fp, ale nie jest to niezbędne Rozkazy – język komputera Układ pamięci Text: kod programu Static data: zmienne globalne Dynamic data: sterta Np. zmienne globalne w C, tablice, napisy… $gp zainicjowany tak, aby łatwo było się odwoływać do danych za pomocą ujemnego/dodatniego przesunięcia Np. malloc w C, new w Javie Stack: zmienne lokalne Rozkazy – język komputera Dane tekstowe Znaki kodowane bajtowo ASCII: 128 znaków Latin-1: 256 znaków 95 graficzne, 33 sterujące ASCII, +96 znaków graficznych Unicode: kod 32-bit Używany m.in. w Javie, Większość światowych alfabetów, plus inne symbole UTF-8, UTF-16: kodowania zmiennej długości Rozkazy – język komputera Operacje bajtowe/półsłowowe Można użyć operacji na bitach Operacje na bajtach i połowach słów: Przetwarzanie tekstów lb rt, offset(rs) Roszerzenie arytm. do 32 bitów rt lbu rt, offset(rs) lhu rt, offset(rs) Uzupełniane zerami rt sb rt, offset(rs) lh rt, offset(rs) sh rt, offset(rs) Wysyła mniej znaczącą część rejestru Rozkazy – język komputera Przykład: kopiowanie napisu Kod C: Zakładamy, że łańcuch zakończony zerem void strcpy (char x[], char y[]) { int i; i = 0; while ((x[i]=y[i])!='\0') i += 1; } Adresy x, y w $a0, $a1 i w $s0 Rozkazy – język komputera Przykład: kopiowanie napisu Kod MIPS: strcpy: addi sw add L1: add lbu add sb beq addi j L2: lw addi jr $sp, $s0, $s0, $t1, $t2, $t3, $t2, $t2, $s0, L1 $s0, $sp, $ra $sp, -4 0($sp) $zero, $zero $s0, $a1 0($t1) $s0, $a0 0($t3) $zero, L2 $s0, 1 0($sp) $sp, 4 # # # # # # # # # # # # # 1 miejsce na stosie zachowaj $s0 i = 0 adres y[i] w $t1 $t2 = y[i] adres x[i] w $t3 x[i] = y[i] kończ pętlę gdy y[i] == 0 i = i + 1 na początek pętli odtwórz $s0 zwolnij miejsce na stosie powrót Rozkazy – język komputera