Exercícios resolvidos (aula de 4 de Maio) 1. Um microprocessador gera endereços de memória de 14 bits. Desenhe um mapa de memória dos seus endereços de memória fronteira especificados em hexadecimal. Uma ROM de 4 Ké localizada no espaço de memória de endereços mais baixos. Uma RAM de 2K é localizada nos espaços de memória mais altos. Repita considerando agora endereços de 16 bits e 20 bits e 32 bits.
Resolução: Se o microprocessador gera endereços de memória de 14 bits, significa que possui 14 linhas para efectuar o endereçamento das posições de memória. O intervalo de endereçamento é de 0 até 16K posições ou seja 3FFFh. Para: 16 bits: 0.. 64K, 20 bits: 0..1M, 32 bits: 0..4G,
2k
3FFF 3800
4k
0FFF 0000
FFFFh FFFFFh FFFFFFFFh
2k
FFFF F800
4k
0FFF 0000
-1-
2k
FFFFF FF800
4k
0FFF 0000
2k
FFFFFFFF FFFFF800
4k
0FFF 0000
2. Para o seguinte código comente as instruções e identifique o que fazem escrevendo o seu equivalente em C: loop:
finish:
add beq add sub j addi add
$t0, $a1, $t0, $a1, loop $t0, $v0,
$zero, $zero $zero, finish $t0, $a0 $a1, 1 $t0, 100 $t0, $zero
Resolução:
loop:
finish:
Entradas: Operação: Saídas:
add $t0, $zero, $zero beq $a1, $zero, finish add $t0, $t0, $a0 sub $a1, $a1, 1 j loop addi $t0, $t0, 100 add $v0, $t0, $zero
# coloca $t0 a zero # enquanto $a1 não for zero # $t0=$t0+$a0 # subtrai 1 de $a1 # salta para loop # soma 100 a $t0 # guarda resultado em $v0
$ao e $a1 Multiplica $a0 por $a1 (soma $a0 $a1 vezes) em $v0 o resultado da multiplicação $a0 por $a1
Considerando a atribuição de variáveis: $a0 a a0, $a1 a a1 e $v0 a v Em C temos: v=a0*a1
-2-
3. Depois da execução do seguinte código, qual o valor de $s0 e $s1 em decimal? (lb significa load byte neste caso apenas lê um byte de um conteúdo de memória). Considere números com sinal: lb lb
$s0, 100 ($zero) $s1, 200 ($zero)
Resolução: Depois da execução das instruções fica em: $s0=0F $s1=FF Como são números com sinal: 0F=0000 1111 Æ Numero positivo +15 FF=1111 1111 Æ É um numero negativo. Qual? -1
-3-
# conteúdo 100 = 0x0f # conteúdo 200 = 0xff
4. Para cada instrução do programa abaixo identifique os formatos de codificação e os modos de endereçamento. add beq lw
$t0, $zero, $zero $a1, $zero, finish $t0, 100( $a0)
Resolução: No MIPS existem 3 formatos para a codificação em linguagem máquina das instruções. O formato R, I e J No Mips existem 5 modos de endereçamento, que são: Por Registo, Base ou deslocamento de endereço, imediato, relativo ao PC e pseudo endereçamento. add
$t0, $zero, $zero formato: R endereçamento: por registo, pois os operandos são registos
beq
$a1, $zero, finish formato: I endereçamento: Relativo ao PC, pois o operando é especificado pela soma de um registo com o PC, cujo endereço corresponde ao especificado por finish
lw
$t0, 100( $a0) formato: I endereçamento: Relativo à Base(registo) , pois o operando é especificado pela soma de um registo com uma constante, neste caso $a0+100
-4-
5. Qual o intervalo de endereços para um salto condicional no MIPS?
Resolução: Uma instrução de salto condicional significa que o salto só se toma caso uma expressão (de comparação) seja verdadeira. A não tomada da salto significa que a execução do programa continua na próxima instrução (PC+4). A tomada do salto significa que a próxima instrução a ser executada está localizada em PC+4+deslocamento, em que o valor do deslocamento é o um número com sinal de 16 bits. Um valor negativo do deslocamento representa salto no sentido decrescente dos endereços e um valor positivo representa um salto no sentido crescente dos endereços da memória de programa. Para o cálculo dos endereços é preciso saber qual o espaço para representar esse valor no formato da instrução. Neste caso esse espaço é de 16 bits, assim com uma representação de números com sinal em complementos de 2, temos um intervalo entre os valores: 1000 0000 0000 0000 -32 768, que corresponde ao maior numero negativo 0111 1111 1111 1111 +32 767, que corresponde ao maior numero positivo O intervalo de salto será: 6. [-32 768 + PC +4, +32 767 +PC +4]
-5-
7. A execução de um programa numa determinada máquina só pode ser efectuada se esse programa se apresentar ao microprocessador dessa máquina na sua linguagem nativa. Esclareça os diferentes passos desde a escrita do código fonte até á sua execução pela máquina, considere a linguagem C. Compare com escrita e execução na plataforma .NET
Resolução: Procedimento tradicional utilizando compilador de C, escreve-se um programa em código fonte utilizando um editor de texto. Efectua a compilação que gera instruções assembly para o microprocessador da máquina correspondente às instruções do código fonte. Estas instruções são convertidas para código máquina e ligadas a outras rotinas de outros módulos (caso existam) ou a rotinas de livrarias que estão incluídas no código fonte. Obtêm-se no final um programa para ser executado pelo processador, cujo conteúdo são instruções máquinas para serem executadas pelo processador. A execução do programa é efectuada depois do carregamento do programa para a memória pelo sistema operativo da máquina. No caso da plataforma .NET o funcionamento é diferente, aqui o código fonte até pode ser o mesmo do anterior mas a sua compilação gera um assembly especifico para a plataforma .Net, desta forma a plataforma .Net pode ser visto com um processador virtual. Na execução o código do programa é compilado em tempo real para o código do processador da máquina pelo compilador JIT (Just In Time)
-6-
8. Para o seguinte programa explique a operação que é efectuada em cada estado do pipeline. lw lw add beq j sw
r1, 0(r0) r2, 1(r0) r3, r1, r2 r1, r2, salto rotina 2(r0), r3
Resolução: Estamos a considerar um pipeline de 5 estados: (1) Busca da Instrução, (2) descodificação, (3) Execução, (4) Memória, (5) Escrita de resultados. Para a resolução do exercício apenas interessa a classificação das instruções em grupos: Lw – Load: estados 1 e 2 é efectuada a busca e descodificação da instrução, no estado 3 é calculado o endereço da posição de memória, no estado 4 é lido o conteúdo da posição de memória calculado em 3 e no estado 5 é escrito o seu conteúdo no registo. Sw – Store: estados 1 e 2 é efectuado a busca e descodificação da instrução, no 3 efectua o cálculo do endereço da posição de memória, no estado 4 é escrito o valor do registo na memória. O estado 5 não é usado. Add – operações na ALU: estados 1 e 2 para a busca e descodificação da instrução, no 3 executa a instrução, ou seja efectua a soma e no 5 escreve resultado. (Não é usado o estado 4) Beq – Saltos condicionais: estados 1 e 2 para a busca e descodificação da instrução e 3 para verificar se a expressão de teste para o salto é verdadeira? Estados 4 e 5 não usados. J – Saltos incondicionais: estados 1 e 2 busca e descodificação da instrução, suficientes para actualizar o PC com o novo valor. Estados 3, 4 e 5 não usados.
-7-
9. Considere o datapath da figura de ciclo simples
0 M u x
Add Add
4
Control
PC
Instruction [25–21]
Read register 1
Instruction [20–16]
Read register 2
Read address Instruction [31–0] Instruction memory
0 M u Instruction [15–11] x 1
Write register Write data
Instruction [15–0]
16
1
Shift left 2
RegDst Branch MemRead MemtoReg ALUOp MemWrite ALUSrc RegWrite
Instruction [31–26]
ALU result
Read data 1 Zero Read data 2
Registers
Sign extend
ALU ALU result
0 M u x 1
Address
Read data
1 M u x 0
Data Write memory data
32 ALU control
Instruction [5–0]
a. O que significa datapath ciclo simples? b. Como é que o bloco de controlo selecciona as linhas de controlo para as diferentes unidades do datapath c. Esclareça o significado dos módulos “Sign Extended” e “Shift Left 2”e que instruções afecta? d. Qual o efeito na execução das instruções se as linhas de controlo dos multiplexer estiver sempre a ‘1’ e. Complete a seguinte tabela, com o valor das linhas de controlo
add addi lw sw beq
Instrução $t1, $t1, $s2 $v0, $zero, 0 $t0, 0($t1) $v1, 0($a1) $v1, $zero, loop
ResDst
ALUSrc
MemtoReg
-8-
RegWrite
MemRead
MemWrite
Branch
Resolução: a. Entende-se por datapath de ciclo simples quando a execução de todos os estados acontece num único ciclo de relógio, por este motivo também se designa de datapath de ciclo longo. b. O bloco de controlo utiliza lógica combinatória para gerar os diversos sinais de controlo (RegWrite,…) em que as entradas desse circuito combinatório são os 6 bits mais significativos do código de instrução de 26 a 31. c. O bloco “Sign- Extended” converte de 16 para 32 bits mantendo o valor de 16 para 32 bits, significa que os 16 bits mais significativo são completados com o valor do bit mais significativo da palavra de 16 bits. As instruções que utilizam esta instrução são as que utilizam o formato I. O bloco “Shift Left 2” significa multiplicar por 4 o deslocamento para calcular o endereço da próxima instrução. Afecta as instruções de salto relativo. d. Se o mux(RegDest) estiver a 1, apenas podem ser executadas instruções do tipo R. Se o mux(ALUSrc) estiver a 1 apenas podem ser executadas instruções do tipo I, com endereçamento imediato e de salto relativo a Base(registo) ALU-imediato e loads e stores. Se o mux(de salto) estiver a 1 apenas são executadas as instruções de salto apenas se o salto se tomar. Se o mux(MemtoReg) estiver a 1apenas podem ser executadas instruções de load. e. Instrução
ResDst
ALUSrc
MemtoReg
RegWrite
MemRead
MemWrite
Branch
add
$t1, $t1, $s2
1
0
0
1
0
0
0
addi
$v0, $zero, 0
0
1
0
1
0
0
0
lw
$t0, 0($t1)
0
1
1
1
1
0
0
sw
$v1, 0($a1)
x
1
x
0
0
1
0
beq
$v1, $zero, loop
x
0
x
0
0
0
1
-9-