Sumário Aula Anterior Exercício 7.1 – Contagem de bits a 1 numa palavra Exercício 7.2 – Deslocamento de n bits num operando de 64 bits Aula 12 1 Sumário Nesta Aula Esclarecimento de dúvidas para o Exame Resolução da Frequência Aula 12 2 Problema 1 1) Considere o seguinte código escrito em linguagem assembly MIPS la $t0, palavra lw $a0, 0($t0) jal contabits add $t2,$v0,$0 #palavra corresponde ao end. do data seg. 0x10010005 #contabits corresponde ao end. do text seg. 0x00400060 Sabendo que a 1ª instrução tem como endereço 0x400028, traduza o segmento para linguagem máquina MIPS e escreva o conteúdo de cada instrução em binário e hexadecimal numa tabela com o seguinte aspecto: RESOLUÇÂO: Endereço Cod op rs rt rd Shamt Func 0x400028 15 0 8 0x1001 lui $8, 0x1001 * 0x40002c 8 8 8 5 addi $8, $0, 5 * 0x400030 35 8 4 0 0x400034 3 0x400038 0 2 0 10 0 32 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits 0x400028 001111 00000 01000 0001 0000 0000 0001 0x3c081001 0x40002c 001000 01000 01000 0000 0000 0000 1001 0x21080005 0x400030 100011 01000 00100 0000 0000 0000 0000 0x8d040000 0x400034 000011 0x400038 000000 lw $4, 0($8) 0x400060 jal 0x400060 00 0001 0000 0000 0000 0001 1000 ØØ 00010 00000 010 Observações 1000000 Aula 12 add $10, $2, $0 EM HEXADECIMAL 0x0c100018 ** 100000 0x00405020 3 Problema 2 2) Considere o seguinte programa em assembly MIPS, que tem como objectivo imprimir na consola a soma de inteiros contidos numa array nums até encontrar o caracter definido em char. Identifique e corrija os 6 erros de programação que se encontram neste código. Especifique o numero da linha em que, ou entre quais, estão os erros. 01 02 03 04 05 06 07 08 09 10 11 12 13 .data nums: .word 21,11,33,23,8,0 char: .byte 32 .text main: la $a0, nums la $t0, char lb $a1, 0($t0) jal soma add $a0, $v0, $zero li $v0, 1 syscall jr $ra 14 15 16 17 18 19 20 21 soma: add $s0, $a0, $0 add $v0, $zero, $zero L1:lw $t0, 0($a0) add $v0, $t0, $v0 addi $a0,$a0,1 bne $v0, $zero, L1 jr $ra RESOLUÇÂO 01 02 03 04 05 5a 5b 06 07 08 09 10 11 12 12a 12b 13 .data nums: .word 21,11,33,23,8,0 char: .byte 32 .text main: addi $sp, $sp, -4 sw $ra, 0($sp) la $a0, nums la $t0, char lb $a1, 0($t0) jal soma add $a0, $v0, $zero li $v0, 1 syscall lw $ra, 0($sp) addi $sp, $sp, 4 jr $ra 13a 13b 14 15 16 17 18 19 19a 19b 20 21 soma: addi $sp, $sp, -4 sw $s0, 0($sp) add $s0, $a1, $0 add $v0, $zero, $zero L1:lw $t0, 0($a0) add $v0, $t0, $v0 addi $a0,$a0,4 bne $t0, $s0, L1 lw $s0, 0($sp) addi $sp, $sp, 4 jr $ra Aula 12 4 Problema 3a 3) Considere um programa que pede na consola a introdução duma primeira string, depois pede uma segunda string e posteriormente escreve a seguir a uma mensagem, a concatenação das duas strings na consola. a) Implemente em assembly um procedimento strcat que recebe dois parâmetros que são os endereços da posição de memória onde se encontram as duas strings já lidas, processa a concatenação das strings, e devolve o endereço de memoria onde se encontra a string concatenada. de acordo com o seguinte algoritmo em C: strcat( char *str1, char *str2){ Int i = 0; Int j = 0; while ( str1[ i ] != ’\0’) i = i + 1; i = i + 1; while ( str1[ i ] = str2[ j ] != ‘\0’){ i = i + 1; j = j + 1; } return *str1; } O procedimento pedido é: strcat: addi $sp, $sp, -8 sw $s0, 0($sp) sw $s1, -4($sp) copia: # Preservar $s0 e $s1 # # add $s0, $a0, $ add $s1, $a1, $0 conta: # Guardar end. str1 em $s0 # Guardar end. str2 em $s1 # Cilco encontra fim str1 lb $t0, 0($s0) # Carrega byte de str1 addi $s0, $s0, 1 # Incrementa apontador de str1 bne $t0, $0, conta # Testa se chegou ao fim de str1 addi $s0, $s0, -1 # Decrementa apontador str1 para # escerver por cima de ‘\0’ Aula 12 # Ciclo copia str2 para fim str1 lb $t1, 0($s1) # Carrega byte str2 em $t1 sb $t1, 0($s0) # Carrega byte $t1 em str1 addi $s0, $s0, 1 # Incrementa apontador str2 addi $s1, $s1, 1 # incrementa apontador str1 bne $t1, $0, copia # Testa se chegou fim de str2 la $v0, str1 # Devolve end. str1 onde # esta string concatenada lw $s1, -4($sp) # Recuperar $s0 e $s1 lw $s0, 0($sp) addi $sp, $sp, 8 jr $ra 5 Problema 3b b) Implemente em assembly o programa principal correspondente, que faz a apresentação de mensagens, leitura das strings e apresentação da string concatenada, tendo em conta que vai evocar o procedimento strcat que foi implementado na alínea anterior. O programa principal pedido é: .data str1: .space 120 # buffer para receber 1ª string e concat str2: .space 80 # buffer para receber 2º string msg1: .asciiz "Introduza a str1:" msg2: .asciiz "Introduza a str2:" msg3: .asciiz "A concat das Strings e:" .text main: addi $sp, $sp, -4 # Preserver ran a stack sw $ra, 0($sp) # la $a0, str2 addi $a1, $0, 80 addi $v0, $0, 8 syscall # Ler 2ª string do teclado # # # la $a0, str1 # Passar end. de 1ª str. como parametro la $a1, str2 jal strcat add $t1, $v0, $0 # Passar end. de 2ª str. como parametro # Chamar Proc. strcat # Guardar endereço de string concat la $a0, msg1 addi $v0, $0, 4 syscall # la $a0, str1 addi $a1, $0, 80 addi $v0, $0, 8 syscall # Imprimir 1ª # mensagem na consola la $a0, msg3 addi $v0, $0, 4 syscall # Imprimir na consola 3ª mensagem # # # Ler 1ª string do teclado # até /n ou 79 chars # # add $a0, $t1, $0 Syscall # Imprimir na consola str.concatenada # Recuperar ra da stack la $a0, msg2 addi $v0, $0, 4 syscall # Imprimir 2ª mensagem na consola # # lw $ra, 0($sp) addi $sp, $sp, 4 jr $ra Aula 12 6