MIPS load/store word, con indirizzamento al byte aritmetica solo su registri Istruzioni Significato add $t1, $t2, $t3 $t1 = $t2 + $t3 sub $t1, $t2, $t3 $t1 = $t2 - $t3 mult $t1, $t2 Hi,Lo = $t1*$t2 div $t1, $t2 Lo=$t1/$t2; Hi=$t1mod$t2 lw $t0, 100($t1) $t0 = Memory[$t1+100] sw $t0, 100($t1) Memory[$t1+100] = $t0 Istruzioni aritmetiche add, sub, mult, div Esempio: add $t0,$s1,$s2 000000 10001 10010 01000 00000 100000 op rs rt rd shamt funct Istruzioni di trasferimento dati lw, sw Esempio: lw $t0,32($s3) 100011 10011 01000 0000000000100000 op rs rt address 37 6 bit 5 bit 5 bit 16 bit 38 Concetto di programma memorizzato Ciclo fetch&execute Le istruzioni sono strighe di bits I programmi sono memorizzati in memoria semplificazione hw/sw dei calcolatori Instruction Fetch Instruction Decode Processore Memoria memoria per dati, programmi, compilatori, editor, etc Operand Fetch Execute Ciclo Fetch & Execute l istruzione corrente viene letta e messa in uno speciale registro interno i bit nel registro controllano le azioni seguenti viene letta la nuova istruzione e cosi via 39 Result Store Next Instruction 40
Programma memorizzato Organizzazione della memoria memory 0x7fffffff stack Segmento stack CPU OS Program 1 unused Program 2 code data 0x10000000 Dati dinamici Dati statici Segmento di dato text Segmento di codice unused 0x400000 Riservata 41 42 Istruzioni per prendere le decisioni alterano il controllo del flusso (sequenziale) cambiano quindi la prossima istruzione da eseguire Istruzioni MIPS di salto condizionato bne $t0, $t1, Label beq $t0, $t1, Label Esempio: if (i==j) h = i + j; # branch if not equal # branch if equal bne $s0, $s1, Label add $s3, $s0, $s1 Label:... Salto non condizionato j label Formato J-Type J op 26 bit address 6 bit 26 bit Esempio (costrutto if...then...else): if (i!= j) h=i+j; beq $s4, $s5, Lab1 else h=i-j; add $s3, $s4, $s5 j Lab2 Lab1: sub $s3, $s4, $s5 Lab2:... 43 44
Esempio costrutto while: while (vett[i] == k) i=i+j; i, j e k sono contenuti nei registri $s3, $s4 e $s5 e l indirizzo base di vett in $s6 ciclo:add $t1, $s3, $s3 add $t1, $t1, $t1 add $t1, $t1, $s6 lw $t0, 0($t1) bne $t0, $s5, esci add $s3, $s3, $s4 j ciclo Esci:... #t1 =2*i #t1 =4*i #t1 = indirizzo di vett[i] #t0 = vett[i] #vai a esci se #vett[i] = k #i=i+j #vai a ciclo Istruzione set on less than: #if $s1 < $s2 then slt $t0, $s1, $s2 # $t0 = 1 # else $t0 = 0 Questa istruzione puo essere utilizzata per creare blt che non e predefinita nel linguaggio MIPS. Per fare questo e necessario l uso del registro $zero. slt $t0,$s0,$s1 <=> blt $s0, $s1, Label bne $t0,$zero, Label 45 46 Comando FOR Comando Case/Switch C code: MIPS: for (i=0; i!= n; i = i+k) a = a+b; add $t0, $zero, $zero # i=$t0=0 Loop: beq $t0, $s0, Exit # if (i==n) goto Exit add $s1, $s1, $s2 # a = a+b; add $t0, $t0, $t1 # i = i+k; j Loop # goto Loop Exit: Comando Case/switch puo essere tradotto in una catena di if-then-else caso peggiore: tempo di esecuzione proporzionale al numero di casi puo essere reso piu veloce con un salto ad una tabella di indirizzi (jump address table) dove si trovano le sequenze di istruzioni = vettore con indirizzi delle etichette Nuova istruzione: salto tramite registro jr $t0 (jump register ) switch (k){ case 0: f = i+j; break; case 1: f = g+h; break; case 2: f = g-h; break; case 3: f = i-j; break; } 47 48
Comando Case/Switch $t4 $t4+4 $t4+8 $t4+12 Assembler code: 1. test se 0 <= k <= 3 2. calcola indirizzo 3. trova indirizzo di salto e salta 4. esegue il codice Data: jump table address L0 address L1 address L2 address L3 $t4 <-> base $t2 <-> 4 $s5 <-> k slt $t3, $s5, $zero bne $t3, $zero, Exit slt $t3, $s5, $t2 beq $t3, $zero, Exit add $t1, $s5, $s5 add $t1, $t1, $t1 add $t1, $t1, $t4 lw $t0, 0($t1) jr $t0 L0: add $s0, $s3, $s4 L1: add $s0, $s1, $s2 L2: sub $s0, $s1, $s2 L3: sub $s0, $s3, $s4 Exit: 49 Istruzioni di confronto Istruzione Esempio Significato Commenti set less than slt $1,$2,$3 if ($2<$3) $1=1; Confronto tra registri (con segno) set less than imm. slti $1,$2,100 if ($2<100)$1=1; Confronto registro-costante (con segno) set less than uns. sltu $1,$2,$3 if ($2<$3) $1=1; Confronto tra registri (senza segno) set l. t. imm. uns. sltiu $1,$2,100 if ($2<100) $1=1; Confronto registro-costante (senza segno) 50 Branch e Branch&Link Istruzione Esempio Significato Commenti Jump branch on equal beq $1,$2,L if ($1 == $2) go to L Test di uguaglianza; PC-rel. branch on not eq. bne $1,$2,L if ($1!= $2) go to L Test di disuguaglinza; PC-rel. branch gr. eq. zero bgez $1, L if ($1>= $0) go to L Test di non negativo; PC-rel. branch gr. th.. zero bgtz $1, L if ($1> $0) go to L Test di positivo; PC-rel. branch less eq. zero blez $1, L if ($1<= $0) go to L Test di non positivo; PC-rel. branch less th. zero bltz $1, L if ($1< $0) go to L Test di negativo; PC-rel. Istruzione Es. Significato Commenti jump j L go to L Salta all istruzione di etichetta L jump register jr $31 go to $31 Per i ritorni da procedura jump and link jal P $31 = PC + 4; Per le chiamate di procedura go to P jump and link jalr $1 $31 = PC + 4; Per le chiamate di procedura reg. go to $1 branch gr. eq. zero bgezal $1, P if ($1>= $0) { Test di non negativo; PC-rel. and link $31 = PC + 4; Per le chiamate a procedura go to P} branch less th. zero bltzal $1, P if ($1< $0) { Test di negativo; PC-rel. and link $31 = PC + 4; Per le chiamate a procedura go to P} 51 52
bne, beq, slt Esempio: beq $t0,$t1, Label Operazioni logiche A volte e utile lavorare sui singoli bit all interno di una parola. Shift (scalamento): sposta tutti i bit di una parola verso sinistra o verso destra riempendo con degli 0 i bit rimasti vuoti 000100 01000 01001 Offset 6 bit 5 bit Esempio: slt $t0,$s1,$s2 000000 10001 10010 01000 000000 101010 Implementazione dei costrutti if then else for 5 bit 16 bit shift left logical (sll) e shift right logical (srl) Esempio: sll $t2, $s0, 3 ($s0) 0000 0000 0000 0000 0000 0000 0000 1010 ($t2) 0000 0000 0000 0000 0000 0000 0101 0000 op rs rt rd shamt funct 0 0 16 10 3 0 53 54 Operazioni logiche AND e OR bit a bit Esempio 1:and $t0, $t1, $t2 0000 0000 0000 0000 0110 1010 1110 0000 0000 0000 0000 1100 0001 1100 0000 0000 0000 0000 0100 0000 1100 Esempio 2: or $t0, $t1, $t2 0000 0000 0000 0000 0110 1010 1110 0000 0000 0000 0000 1100 0001 1100 0000 0000 0000 0000 1110 1011 1110 Istruzioni Logiche Istruzione Esempio Significato Commento and and $1,$2,$3 $1 = $2 & $3 3 reg. operands; Logical AND or or $1,$2,$3 $1 = $2 $3 3 reg. operands; Logical OR xor xor $1,$2,$3 $1 = $2 ^ $3 3 reg. operands; Logical XOR nor nor $1,$2,$3 $1 = ~($2 $3) 3 reg. operands; Logical NOR and immediato andi $1,$2,10 $1 = $2 & 10 Logical AND reg, constant or immediato ori $1,$2,10 $1 = $2 10 Logical OR reg, constant xor immediato xori $1, $2,10 $1 = ~$2 &~10 Logical XOR reg, constant shift left logical sll $1,$2,10 $1 = $2 << 10 Shift left by constant shift right logical srl $1,$2,10 $1 = $2 >> 10 Shift right by constant shift right arithm. sra $1,$2,10 $1 = $2 >> 10 Shift right (sign extend) shift left logical sllv $1,$2,$3 $1 = $2 << $3 Shift left by variable shift right logical srlv $1,$2, $3 $1 = $2 >> $3 Shift right by variable shift right arithm. srav $1,$2, $3 $1 = $2 >> $3 Shift right arith. by variable 55 56