# # char find_op(char *s) # { # char op = ‘\0’; # while (*s != ‘\0’) { if (*s < ’0’ || *s > ’9’) { op = *s; break; } else { ++s; } } # return (op); # } # # char buff[80] = “2*3+4/5”; # # main() # { # int a, b, d; double f, g, h; float w, x, y; char c, *p; # # do { # switch (c = find_op(p++)) { # case ‘+’: a = b + d; break; # case ‘*’: f = g / x; break; # case ‘/’: w = x * y; break; # } # } while (c != ‘\0’) # h = a * w; # } # .data buff: .asciiz "2*3+4/5" .space 72 sep: .asciiz " - " #parametri ingresso: char *s in $a0 .text .globl main #__________________________________BB-BA find_op: addi $v1, $v1, 2 addi $s7, $s7, 2 add $v0, $0, $0 # op = '\0' add $t9, $a0, $0 # t9 = s (param. ingresso) #__________________________________BB-BB while: addi $v1, $v1, 8 addi $s7, $s7, 2 lb $t0, 0($t9) # carica il carattere *s beq $t0, $0, end2 # se *s==0 termina il ciclo #__________________________________BB-BC addi $v1, $v1, 7 addi $s7, $s7, 5 slti $t1, $t0, '0' # t1 = (t0 ? '9') or $t4, $t1, $t3 # t4 = t1 || t3 bne $t4, $0, end1 # se la cond. e' vera ho finito #__________________________________BB-BD addi $v1, $v1, 4 addi $s7, $s7, 2 addi $t9, $t9, 1 # ...altrimenti s++ j while # e continuo il ciclo while #__________________________________BB-BE end1: addi $v1, $v1, 1 addi $s7, $s7, 1 add $v0, $t0, $0 # scrivo in op il risultato #__________________________________BB-BF end2: addi $v1, $v1, 3 addi $s7, $s7, 1 jr $ra # $s3 = a, $s1 = b, $s2 = d # $f14 = f, $f10 = g, $f12 = h # $f3 = w, $f1 = x, $f2 = y; main: addi $s1, $0, 1 # s1 = b = 1 addi $s2, $0, 2 # s2 = d = 2 addi $t0, $0, 3 mtc1 $t0, $f10 cvt.s.w $f10,$f10 cvt.d.s $f10,$f10 # f10 = g = 3 addi $t0, $0,4 mtc1 $t0, $f12 cvt.s.w $f12,$f12 cvt.d.s $f12,$f12 # f12 = h = 4 addi $t0, $0, 5 mtc1 $t0, $f1 cvt.s.w $f1, $f1 # f1 = x = 5 addi $t0, $0, 6 mtc1 $t0, $f2 cvt.s.w $f2, $f2 # f2 = y = 6 #Azzeramento variabili per instrumentazione add $v1, $0, $0 #contatore cicli totali add $s7, $0, $0 #contatore ncpu #__________________________________BB-B1 addi $v1, $v1, 1 addi $s7, $s7, 1 la $a0, buff # p = buff #__________________________________BB-B2 dowhile: addi $v1, $v1, 8 addi $s7, $s7, 4 jal find_op # chiamo la find_op addi $a0, $a0, 1 # p++ addi $t0, $0, '+' # case '+' ? bne $t0, $v0, sw2 # se no --> caso successivo #__________________________________BB-B3 addi $v1, $v1, 4 addi $s7, $s7, 2 add $s3, $s1, $s2 # se si', esegui a=b+d j fine_sw # break #__________________________________BB-B4 sw2: addi $v1, $v1, 4 addi $s7, $s7, 2 addi $t0, $0, '*' # case '*' ? bne $t0, $v0, sw3 # se no --> caso successivo #__________________________________BB-B5 addi $v1, $v1, 5 addi $s7, $s7, 3 cvt.d.s $f16, $f1 # se si', esegui f=g/x div.d $f14, $f10, $f16 j fine_sw # break #__________________________________BB-B6 sw3: addi $v1, $v1, 4 addi $s7, $s7, 2 addi $t0, $0, '/' # case '/' ? bne $t0, $v0, fine_sw #__________________________________BB-B7 addi $v1, $v1, 1 addi $s7, $s7, 1 mul.s $f3, $f1, $f2 # se si', esegui w=x*y # break #__________________________________BB-B8 fine_sw: addi $v1, $v1, 3 addi $s7, $s7, 1 bne $v0, $0, dowhile # c !=? '\0', se si' do_while #__________________________________BB-B9 addi $v1, $v1, 4 addi $s7, $s7, 4 mtc1 $s3, $f7 cvt.s.w $f4, $f7 mul.s $f5, $f4, $f3 # h = a * w cvt.d.s $f12, $f5 # Stampa risultato instrumentazione add $a0, $0, $v1 # cicli totali addi $v0, $0, 1 syscall addi $v0, $0, 4 # separatore la $a0, sep syscall add $a0, $0, $s7 # ncpu addi $v0, $0, 1 syscall # exit (servizio #10) li $v0, 10 syscall