Apresentação do PowerPoint

Propaganda
Exercício 11.1
„
Escreva um programa em código assembly
correspondente ao seguinte programa C.
cont=0;
for (n=0; n<32; n++) {
if [bit n = 1]
cont = cont +1;
}
NOTA: Atribua o registo $s0 a cont.
O ciclo vai contar o número de ocorrências do bitn=1 numa
palavra de 32 bits. Implemente como um procedimento com
parâmetros de entrada $a0 e o resultado em $v0.
Aula 11
1
Exercício 11.1
Estrutura do Programa
„
.data # alocação de espaço no data segment
„
Directivas space para criar buffer de
armezenamento
„
„
Directivas asciiz para armazenar strings
„
„
„
„
palavra = buffer(5)
Mens1 "\n Digite uma palavra de 4 letras:"
Mens2 "\n O número de bits é:"
Mens3 "\n“
.text # alocação de espaço no text segment
„
<< Instruções do Programa >>
Aula 11
2
Exercício 11.1
Estrutura do Programa
„
<<Instruções>>
„
„
Main
„
„
„
„
„
Preservar $ra
Imprimir mens. de
entrada de palavra
Ler string para palavra
Preparar e chamar
procedimento Contabits
Aula 11
„
„
„
Guardar em $t2 result. Contabits
Imprimir mens. de resultado
Imprimir num. de bits
Recuperar $ra
Jr $ra
3
Exercício 11.1
Estrutura do Programa
„
<<Instruções>>
„
Contabits
„
„
„
Inicializa mascara $t6 = 1
(1º Bit)
Inicializa cont. bits a 0 $s0
Ciclo:
„ AND para $t5 de
mascara c/ Palavra
„ Se $t5 = 0 vai para
label Zero
„ Incrementa cont. de bits
„ Zero:Desloca $s6 1 bit
a esquerda
Aula 11
Se $t6 != 0 volta para Ciclo
„Devolve em $v1 result.
„Jr $ra
„
4
# Arquitectura de Computadores,
# Programa que conta o número de bits que contem uma palavra de 32 bits
# lida por chamada ao sistema para ler string, indicando o nº de bits
.data
palavra: .space 5
frase1: .asciiz "\n Digite uma palavra de 4 letras:"
frase2: .asciiz "\n O número de bits é:"
enter: .asciiz "\n"
.text
main:
addi $sp, $sp, -4
# Reserva 1 posição na stack
sw $ra, 0($sp)
# Guarda $ra na stack
# Mostra frase1
addi $v0, $0, 4
# $v0=4, syscall call = 4
la $a0, frase1
# Carrega endereço da string frase1
syscall
# Escreve no monitor o pedido de nomes
# Lê string de palavra
addi $v0, $0, 8
# Ler string no buffer de endereço $a0
la $a0, palavra
# Carregue endereço de palavra $a0=end buffer
addi $a1, $0, 5
# Outro argumento de ler string (comprimento)
syscall
# Chama subrotina de chamada ao sistema
# Chama procedimento
la $t0, palavra
# Carrega em $t0= endereço de palavra
lw $a0, 0($t0)
# Carrega palavra de 4 letras em $a0
jal contabits
add $t2, $v0, $0
# Guarda em $t2 o valor retornado em $v0
Resolução
do
Exercício
11.1
Aula 11
5
# Programa que conta o número de bits que contem uma palavra de 32 bits
# Mostra frase2
addi $v0, $0, 4
# Syscall para imprimir string
la $a0, frase2
# Endereço de frase2
syscall
# Mostra número de ocorrências
addi $v0, $0, 1
# Imprimir inteiro
addi $a0, $t2, 0
# Valor do inteiro a imprimir
syscall
lw $ra, 0($sp)
addi $sp, $sp, 4
end: jr $ra
# Termina Programa
contabits:
addi $t6, $0, 1
# Bit a avaliar
add $s0, $0,$0
# Inicializa contador de bits
ciclo: and $t5, $a0, $t6 # $t5 = $a0 & $t6
beq $t5, $0, zero
# Se $t5 = 0 => bitn = 0
addi $s0, $s0, 1
# Conta os bits 1
zero: sll $t6, $t6, 1
# Desloca à esquerda 1 bit o $s6
bne $t6, $0, ciclo # Se $t6!=0 vai p/ ciclo,se $t6=0 último shift
addi $v0, $s0, 0
# Copia $s0 para $v0
jr $ra
Resolução
do
Exercício
7.1
(Cont)
Aula 11
6
Exercício 11.2
„
Escreva um programa em código assembly
que permita o deslocamento de n bits para a
esquerda de um operando de 64 bits colocado
em $t1 e $t0. O registo $t3 contém o valor do
deslocamento.
Aula 11
7
Exercício 11.2
Estrutura do Programa
„
.data # alocação de espaço no data segment
„
Directivas asciiz para armazenar strings
„
„
„
„
Mens1 "\n Indique 2 números inteiros, para
deslocar os bits:"
Mens2 "\n Indique no teclado o número de
deslocamentos (< 64):"
Mens3 "\n"
.text # alocação de espaço no text segment
„
<< Instruções do Programa >>
Aula 11
8
Exercício 11.2
Estrutura do Programa
„
<<Instruções>>
„
„
„
Main
„
„
„
„
„
„
„
„
„
„
Preservar $ra
Imprimir mens. de entrada de 2
inteiros
Ler 1 inteiro do teclado e
guardar em $t1
Ler outro inteiro do teclado e
guardar em $t0
Imprimir mens. de entrada de
num. de bits deslocam.
Ler num do teclado e guardar
em $t3 (shamt)
Se $t3 < 64 vai para label Zero
Se $t3 > 64 põe $t1 e $t0 a 0 e
salta para label End.
Zero:Se $t3 != 0 vai para label Cont.
senão vai para End.
„
„
„
„
„
„
„
„
„
„
„
„
„
„
„
Aula 11
„
Cont:Se $t3 < 32 vai para label Less32
$t4 = $t3 –32 (instr. Sub)
Inicializa var. ciclo $t8 = 0
Põe em$t1 conteúdo de $t0
G32:desloca $t1 1 bit para esq.
Incrementa $t8
Se $t8!=$t4 volta G32
Salta para End.
Less32:Inicializa var. ciclo $t8=0
Less:Transporta Bit 31 de $t1 para bit 0
de $t7 (srl de 31 bit)
desloca $t1 1 bit para esq.
desloca $t0 1 bit para esq.
Coloca bit 0 de $t7 em $t1 ($t1=$t1+$t7)
Incrementa $t8
Se $t8!=t3 volta para Less
End: Imprime $t1 ($v0=1)
Imprime nova linha
Imprime $t0 ($v0=1)
9
Jr $ra
# Arquitectura de Computadores,
# Programa que faz uma operação de deslocamento(shift)
# de n bits para a esquerda num registo de 64 bits
.data
frase1: .asciiz "\n Indique 2 números inteiros, para deslocar os bits:"
frase2: .asciiz "\n Indique no teclado o número de deslocamentos (< 64):"
enter: .asciiz "\n"
.text
main: la $a0, frase1
# Imprimir mensagem da frase1
addi $v0,$0, 4
syscall
addi $v0, $0, 5
# Ler no teclado 2 inteiros
syscall
add $t1, $v0,$0
# Guardar em $t1 o 1º inteiro
addi $v0, $0, 5
syscall
add $t0, $v0,$0
# Guardar em $t0 o 2º inteiro
la $a0, frase2
addi $v0,$0, 4
# Imprimir frase2
syscall
addi $v0, $0, 5
# Ler no teclado nº de deslocamentos=shamt
syscall
add $t3,$0, $v0
# Shamt lido pelo teclado guardado em $t3
slti $t5, $t3, 64
# Shamt < 64 ?
bne $t5, $0, zero
# Se shamt < 64 vai para zero
andi $t0, $t0, 0
# $t0 = 0, resultado é zero, se shamt>64
andi $t1, $t1, 0
# $t1 = 0, resultado é zero
j end
zero: bne $t3, $0, cont
# Se shamt !=0 vai para cont
j end
Resolução
de
Exercício
7.2
Aula 11
10
# Programa que faz uma operação de deslocamento(shift)
# de n bits para a esquerda num registo de 64 bits
cont: slti $t5, $t3, 32
# Shamt < 32?
bne $t5, $0, less32
# Se shamt < 32 vai para less32
addi $t4, $t3, 0
# $t4= shamt ( > 32)
sub $t4, $t4, 32
# $t4 = $t4 - 32 (bits mais significativos)
addi $t8,$0,0
great32:
add $t1, $0, $t0
andi $t0, $t0, 0
g32:
# shamt > 32
sll $t1, $t1, 1
# $t1 = $t1 << 1
addi $t8,$t8, 1
bne $t4, $t8, g32
j end
less32:
# shamt < 32
addi $t8,$0,0
less: srl $t7,$t0,31
# Transpõe bit 32 de $t0 para bit 1 de $t1
sll $t0, $t0, 1
# $t0 = $t0 << shamt
sll $t1, $t1, 1
# $t1 = $t1 << shamt
add $t1, $t7, $t1
# Bit 32 de $t0, post o $t7 passa para $t1
addi $t8,$t8, 1
bne $t3, $t8, less
end: addi $v0, $0, 4
# Imprime $t1
add $a0, $0, $t1
syscall
addi $v0, $0, 4
la $a0, enter
syscall
addi $v0, $0, 4
# Imprime $t0
add $a0, $0, $t0
syscall
jr $ra
Resolução
de
Exercício
7.2 (Cont)
Aula 11
11
Download