Apresentação do PowerPoint

Propaganda
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
Download