Text Segment 0x00400000 0x3c0800f3 lui $8,243 13 main: lui $t0,0xf3 # 0x00400004 0x35080023 ori $8,$8,35 14 ori $t0,$t0,0x23 # $t0<= 0x00f30023 0x00400008 0x3c090052 lui $9,82 15 lui $t1,0x52 # 0x0040000c 0x352900e2 ori $9,$9,226 16 ori $t1,$t1,0xe2 # $t1<= 0x005200e2 0x00400010 0x3c0a0000 lui $10,0 17 lui $t2,0x00 # 0x00400014 0x354a008f ori $10,$10,143 18 ori $t2,$t2,0x8f # $t2<= 0x0000008f 0x00400018 0x112a002d beq $9,$10,45 19 beq $t1,$t2,loop # Obviamente, esta instrução nunca deve saltar 0x0040001c 0x152a0001 bne $9,$10,1 20 bne $t1,$t2,next_i # Obviamente, esta instrução sempre deve saltar 0x00400020 0x254a008f addiu $10,$10,143 21 addiu $t2,$t2,0x8f # Obviamente, esta instrução nunca deve executar 0x00400024 0x01095821 addu $11,$8,$9 22 next_i: addu $t3,$t0,$t1 # $t3<= 0x00f30023 + 0x005200e2 = 0x01450105 0x00400028 0x01096023 subu $12,$8,$9 23 subu $t4,$t0,$t1 # $t4<= 0x00f30023 - 0x005200e2 = 0x00a0ff41 0x0040002c 0x01296823 subu $13,$9,$9 24 subu $t5,$t1,$t1 # $t5<= 0x0 0x00400030 0x01097024 and $14,$8,$9 25 and $t6,$t0,$t1 # $t6<= 0x00f30023 and 0x005200e2 = 0x00520022 0x00400034 0x01097825 or $15,$8,$9 26 or $t7,$t0,$t1 # $t7<= 0x00f30023 or 0x005200e2 = 0x00f300e3 0x00400038 0x0109c026 xor $24,$8,$9 27 xor $t8,$t0,$t1 # $t8<= 0x00f30023 xor 0x005200e2 = 0x00a100c1 0x0040003c 0x0109c827 nor $25,$8,$9 28 nor $t9,$t0,$t1 # $t9<= 0x00f30023 nor 0x005200e2 = 0xff0cff1c 0x00400040 0x01090019 multu $8,$9 29 multu $t0,$t1 # Hi & Lo <= 0x00f30023 * 0x005200e2 = 0x00004dd6e1bc1ee6 0x00400044 0x00008010 mfhi $16 30 mfhi $s0 # $s0<= 0x00004dd6 0x00400048 0x00008812 mflo $17 31 mflo $s1 # $s1<= 0xe1bc1ee6 0x0040004c 0x0109001b divu $8,$9 32 divu $t0,$t1 # Hi,Lo<= 0x00f30023 mod,/ 0x005200e2 = 0x4efe5f,0x00000002 0x00400050 0x250800ab addiu $8,$8,171 33 addiu $t0,$t0,0x00ab # $t0<= 0x00f30023 + 0x000000ab = 0x00f300ce 0x00400054 0x310800ab andi $8,$8,171 34 andi $t0,$t0,0x00ab # $t0<= 0x00f300ce and 0x000000ab = 0x0000008a 0x00400058 0x3908ffab xori $8,$8,65451 35 xori $t0,$t0,0xffab # $t0<= 0x0000008a xor 0x0000ffab = 0x0000ff21 0x0040005c 0x00084100 sll $8,$8,4 36 sll $t0,$t0,4 # $t0<= 0x000ff210 (deslocado 4 bits para a esquerda) 0x00400060 0x00084242 srl $8,$8,9 37 srl $t0,$t0,9 # $t0<= 0x000007f9 (deslocado 9 bits para a direita) 0x00400064 0x24120008 addiu $18,$0,8 38 addiu $s2,$zero,8 # $s2<= 0x00000008 0x00400068 0x02594004 sllv $8,$25,$18 39 sllv $t0,$t9,$s2 # $t0<= 0x0007f900 0x0040006c 0x02484004 sllv $8,$8,$18 40 sllv $t0,$t0,$s2 # $t0<= 0x07f90000 0x00400070 0x02484004 sllv $8,$8,$18 41 sllv $t0,$t0,$s2 # $t0<= 0xf9000000 0x00400074 0x00084103 sra $8,$8,4 42 sra $t0,$t0,4 # $t0<= 0xff900000 0x00400078 0x02484007 srav $8,$8,$18 43 srav $t0,$t0,$s2 # $t0<= 0xffff9000 0x0040007c 0x02484006 srlv $8,$8,$18 44 srlv $t0,$t0,$s2 # $t0<= 0x00ffff90 0x00400080 0x3c011001 lui $1,4097 45 la $t0,array # coloca em $t0 o endereço inicial do vetor array (0x10010000) 0x00400084 0x34280000 ori $8,$1,0 0x00400088 0x91090006 lbu $9,6($8) 46 lbu $t1,6($t0) # $t1<= 0x000000ef (primero byte é terceiro byte do segundo elemento) 0x0040008c 0x392900ff xori $9,$9,255 47 xori $t1,$t1,0xff # $t1<= 0x00000010, inverte byte inferior 0x00400090 0xa1090006 sb $9,6($8) 48 sb $t1,6($t0) # segundo byte do segundo elemento do vetor <= 10 (resto não muda) 0x00400094 0x24080001 addiu $8,$0,1 50 addiu $t0,$zero,0x1 # $t0<= 0x00000001 0x00400098 0x00084023 subu $8,$0,$8 51 subu $t0,$zero,$t0 # $t0<= 0xffffffff 0x0040009c 0x0501000c bgez $8,12 52 bgez $t0,loop # Esta instrução nunca deve saltar, pois $t0 = -1 0x004000a0 0x0109582a slt $11,$8,$9 53 slt $t3,$t0,$t1 # $t3<= 0x00000001, pois -1 < 10 0x004000a4 0x0109582b sltu $11,$8,$9 54 sltu $t3,$t0,$t1 # $t3<= 0x00000000, pois (2^32)-1 > 10 0x004000a8 0x290b0001 slti $11,$8,1 55 slti $t3,$t0,0x1 # $t3<= 0x00000001, pois -1 < 1 0x004000ac 0x2d0b0001 sltiu $11,$8,1 56 sltiu $t3,$t0,0x1 # $t3<= 0x00000000, pois (2^32)-1 > 1 0x004000b0 0x3c011001 lui $1,4097 60 soma_ct:la $t0,array # coloca em $t0 o endereço do vetor (0x10010000) 0x004000b4 0x34280000 ori $8,$1,0 0x004000b8 0x3c011001 lui $1,4097 61 la $t1,size # coloca em $t1 o endereço do tamanho do vetor 0x004000bc 0x34290020 ori $9,$1,32 0x004000c0 0x8d290000 lw $9,0($9) 62 lw $t1,0($t1) # coloca em $t1 o tamanho do vetor 0x004000c4 0x3c011001 lui $1,4097 63 la $t2,const # coloca em $t2 o endereço da constante 0x004000c8 0x342a0024 ori $10,$1,36 0x004000cc 0x8d4a0000 lw $10,0($10) 64 lw $t2,0($t2) # coloca em $t2 a constante 0x004000d0 0x19200006 blez $9,6 65 loop: blez $t1,end_add # se/quando tamanho é/torna-se 0, fim do processamento 0x004000d4 0x8d0b0000 lw $11,0($8) 66 lw $t3,0($t0) # coloca em $t3 o próximo elemento do vetor 0x004000d8 0x016a5821 addu $11,$11,$10 67 addu $t3,$t3,$t2 # soma constante 0x004000dc 0xad0b0000 sw $11,0($8) 68 sw $t3,0($t0) # atualiza no vetor o valor do elemento 0x004000e0 0x25080004 addiu $8,$8,4 69 addiu $t0,$t0,4 # atualiza ponteiro do vetor. Lembrar, 1 palavra=4 posições de memória 0x004000e4 0x2529ffff addiu $9,$9,-1 70 addiu $t1,$t1,-1 # decrementa contador de tamanho do vetor 0x004000e8 0x08100034 j 0x004000d0 71 j loop # continua execução 0x004000ec 0x27bdfffc addiu $29,$29,-4 75 end_add:addiu $sp,$sp,-4 # assume-se $sp inicializado, aloca espaço na pilha 0x004000f0 0xafbf0000 sw $31,0($29) 77 sw $ra,0($sp) # salva endereço de retorno de quem chamou (trap handler) 0x004000f4 0x0c100041 jal 0x00400104 78 jal sum_tst # salta para subrotina sum_tst 0x004000f8 0x8fbf0000 lw $31,0($29) 79 lw $ra,0($sp) # ao retornar, recupera endereço de retorno da pilha 0x004000fc 0x27bd0004 addiu $29,$29,4 80 addiu $sp,$sp,4 # atualiza apontador de pilha 0x00400100 0x03e00008 jr $31 81 end: jr $ra # volta para o "sistema operacional" FIM DO PROGRAMA AQUI 0x00400104 0x3c011001 lui $1,4097 83 sum_tst:la $t0,var_a # pega endereço da primeira variável (pseudo-instrução) 0x00400108 0x34280028 ori $8,$1,40 0x0040010c 0x8d080000 lw $8,0($8) 84 lw $t0,0($t0) # toma o valor de var_a e coloca em $t0 0x00400110 0x3c011001 lui $1,4097 85 la $t1,var_b # pega endereço da segunda variável (pseudo-instrução) 0x00400114 0x3429002c ori $9,$1,44 0x00400118 0x8d290000 lw $9,0($9) 86 lw $t1,0($t1) # toma o valor de var_b e coloca em $t1 0x0040011c 0x01285021 addu $10,$9,$8 87 addu $t2,$t1,$t0 # soma var_a com var_b e coloca resultado em $t2 0x00400120 0x27bdfff8 addiu $29,$29,-8 88 addiu $sp,$sp,-8 # aloca espaço na pilha 0x00400124 0xafaa0000 sw $10,0($29) 89 sw $t2,0($sp) # no topo da pilha coloca o resultado da soma 0x00400128 0xafbf0004 sw $31,4($29) 90 sw $ra,4($sp) # abaixo do topo coloca o endereço de retorno 0x0040012c 0x3c010040 lui $1,64 91 la $t3,ver_ev # pega endereço da subrotina ver_ev (pseudo-instrução) 0x00400130 0x342b0144 ori $11,$1,324 0x00400134 0x0160f809 jalr $31,$11 92 jalr $ra,$t3 # chama subrotina que verifica se resultado da soma é par 0x00400138 0x8fbf0004 lw $31,4($29) 93 lw $ra,4($sp) # ao retornar, recupera endereço de retorno da pilha 0x0040013c 0x27bd0008 addiu $29,$29,8 94 addiu $sp,$sp,8 # atualiza apontador de pilha 0x00400140 0x03e00008 jr $31 95 jr $ra # PROGRAMA ACABA AQUI. Retorna para quem chamou 0x00400144 0x8fab0000 lw $11,0($29) 97 ver_ev: lw $t3,0($sp) # tira dados to topo da pilha (parâmetro) 0x00400148 0x316b0001 andi $11,$11,1 98 andi $t3,$t3,1 # $t3 <= 1 se parâmetro é ímpar, 0 caso contrário 0x0040014c 0x03e00008 jr $31 99 jr $ra # e retorna Data Segment 0x10010000 0xabcdef03 0xcdefab18 0xefabcd35 0xbadcfeab 0xdcfebacd 0xfebadc77 0xdefabc53 0xcbafed45 0x10010020 0x00000008 0xffffffff 0x000000ff 0x00000100 0x00000000 0x00000000 0x00000000 0x00000000