Arquitetura de Computadores Cap7

Propaganda
Organização e Arquitetura de Computadores
Aula 7 – Linguagem de Máquina
Strings, Endereçamento Imediato e Relativo
e Pseudo-Instruções
2002
Juliana F. Camapum Wanderley
http://www.cic.unb.br/docentes/juliana/cursos/oac
OAC – Ling. de Máquina – Strings, Endereçamento - 1
Juliana F Camapum Wanderley
Panorama
„
Além dos Números →Textos
„
Endereçamento imediato (constantes)
„
„
„
Endereçamento relativo (desvios
condicionais)
Endereçamento absoluto (desvios
incondicionais)
Montador → Pseudo-instruções
OAC – Ling. de Máquina – Strings, Endereçamento - 2
Juliana F Camapum Wanderley
1
Além dos Números
„
„
„
Computadores: inicialmente números.
Depois: textos.
Muito usado: código ASCII.
„
„
Seria possível usar instruções vistas até agora (carga de palavra de 32 bits).
Entretanto: operação muito comum → uma instrução específica:
OAC – Ling. de Máquina – Strings, Endereçamento - 3
Juliana F Camapum Wanderley
Transferência de Bytes
„
„
„
„
lb $t0,0($sp)
# ler um byte da memória.
sb $t0,0($sp)
# escrever um byte.
Cada byte ocupa uma posição da memória.
Representação de caracteres:
„
„
„
„
1a posição é reservada para o tamanho do mesmo.
Uma variável associada ao string guarda o tamanho.
Na última posição do string aparece um caracter nulo
(ASCII '0'). Usado na linguagem C.
Exemplo: rotina para copiar um string para outro.
Void strcpy(char x[ ], char y[ ]) {
int i;
i =0;
while (x[i]=y[i]!= 0) i = i+1;
}
OAC – Ling. de Máquina – Strings, Endereçamento - 4
Juliana F Camapum Wanderley
2
Compilação (1/2)
„
x e y: $a0 e $a1, $s0 para i
Void strcpy(char x[ ], char y[ ]) {
int i;
i =0;
while (x[i]=y[i]!= 0) i = i+1;
}
strcpy: addi
sw
add
$sp,$sp,-4
$s0,0($sp)
$s0,$zero,$zero
# reserva espaço na pilha
# salva $s0 (índice i)
#i=0
L1:
add
lb
add
sb
$t1,$a1,$s0
$t2,0($t1)
$t3,$a0,$s0
$t2,0($t3)
# $t1=end. de y[i]=y+i
# $t2 ← y[i]
# $t3=end de x[i]=x+i
# x[i] ← y[i]
addi
$s0,$s0,1
#i←i+1
bne
$t2,$zero,L1
# Volta se y[i]≠0
lw
addi
jr
$s0,0($sp)
$sp,$sp,4
$ra
# restaura $s0
# restaura $sp
OAC – Ling. de Máquina – Strings, Endereçamento - 5
Juliana F Camapum Wanderley
Compilação (2/2)
„
Nota:
„
Procedimento anterior: folha.
„
Seria melhor, ao invés de usar $s0, usar $t0.
„
Não é obrigatório preservar valores de variáveis temporárias.
OAC – Ling. de Máquina – Strings, Endereçamento - 6
Juliana F Camapum Wanderley
3
Operandos Imediatos ou Constantes
„
„
„
„
Incremento do índice de um array.
Incremento do contador de um laço.
Ajuste do $sp.
Exemplo: SPEC...
„
„
„
gcc: 52% das ops: imediatos.
Spice: 69%.
Oferecer versões de instruções em que um dos
operandos é uma constante.
„
„
„
Constante: mantida dentro da própria instrução
(regularidade).
Tipo I (I-type): “I” de Imediato.
Tamanho da constante: 16 bits.
OAC – Ling. de Máquina – Strings, Endereçamento - 7
Juliana F Camapum Wanderley
Instruções Imediatas
„
Princípio de projeto 4: Torne o caso comum mais
rápido.
„
„
Com estas instruções, não é preciso carregar
primeiramente as constantes em registradores antes de
operar.
Nomes das Instruções:
„
„
addi $sp,$sp,4
# $sp ← $sp + 40
op
rs
rt
Imediato
8
29
29
4
6 bits
5 bits
5 bits
16 bits
001000
11101
11101
0000 0000 0000 0100
slti $t0,$s2,10
# seta $t0 se $s2 < 10
OAC – Ling. de Máquina – Strings, Endereçamento - 8
Juliana F Camapum Wanderley
4
Instrução “lui” (load upper immediate)
„
„
Problema: às vezes são necessárias constantes de 32
bits.
Solução: Carregar nos registradores.
„
lui $t0, 255 # 16 bits sup. de $t0 ← 255
Exemplo: Carregar este padrão em $s0:
0000 0000 0011 1101 0000 1001 0000 0000
„
lui
$s0,0x003D
addi $s0,$s0,0x0900
OAC – Ling. de Máquina – Strings, Endereçamento - 9
Juliana F Camapum Wanderley
Endereçamento nos Desvios Condicionais e
Incondicionais
„
Desvio incondicional:
„
j Fim
# desvia para Fim (end.800000=0x000C3500)
Op
(Campo endereço x 4 ) ocupa 28bits: serão
concatenados 4 bits mais significativos do PC para
formar o endereço de 32 bits
„
endereço (palavras)
200000=0x0030D40
26 bits
2
6 bits
Formato do desvio condicional
„
bne $s0,$s1,Exit
# desvia para Exit
Op
End. Instrução bne = 72
(
5
6 bits
(end.100)
rs
16
5 bits
se $s0 ≠ $s1
rt
17
5 bits
)
offset do endereço(palavras)
6
16 bits
end. destino (label ) = end.origem ( PC ) + 4 + offset ( palavras ) × 4
„
„
Efeito do end. Relativo: os 16 bits são um offset que somado à próxima
posição do PC compõe o endereço de destino.
J e JAL: não usa end. Relativo.
OAC – Ling. de Máquina – Strings, Endereçamento - 10
Juliana F Camapum Wanderley
5
Exemplo: loop while
bne
Exit
80000
80004
80008
80012
80016
80020
80024
80028
80032
0
0
0
35
5
0
2
19
9
9
9
8
19
35
9
19
9
21
8
21
20
Loop: add
add
add
lw
bne
add
j
Exit:
9
9
9
19
20000
-----
8
OAC – Ling. de Máquina – Strings, Endereçamento - 11
0
0
0
0
2
0
$t1,$s3,$s3
$t1,$t1,$t1
$t1,$t1,$s5
$t0,0($t1)
$t0,$s5,Exit
$s3,$s3,$s4
Loop
32
32
32
palavras
32
palavras
0
Juliana F Camapum Wanderley
Desvio condicional grande
„
Neste caso, o montador insere um jump
„
Campo offset (end. relativo) é de 16 bits –
beq, bne
„
„
Campo end. absoluto é de 26 bits – j, jal
„
„
Como o campo de offset é relativo a uma
palavra, representa end. em bytes de 18bits,
ou seja, ±217= ±128KB
Exemplo:
Instrução original
beq $s0,$s1,L1
Instrução modificada
bne $s0,$s1,L2
J
L1
L2:
Como o campo de endereço é relativo a uma
palavra, representa end. em bytes de 28bits,
ou seja, 228= 256MB
Acima deste valor (32 bits) usar registrador –
jr $registrador
OAC – Ling. de Máquina – Strings, Endereçamento - 12
Juliana F Camapum Wanderley
6
Transformação C → Executável (1/8)
4 passos: C → Linguagem de máquina.
„
OAC – Ling. de Máquina – Strings, Endereçamento - 13
Juliana F Camapum Wanderley
Transformação C → Executável (2/8)
„
Compilador
„
Transforma C → Assembly
„
Linguagem de alto nível: maior produtividade.
„
„
Antigamente: escrito em Assembly. Presentemente: em ling. de
alto nível.
Montador
„
Assembly → Ling. de máquina.
„
MIPS: O assembly “incrementa” artificialmente o set de instruções.
„
Pseudo-instruções:
„
Não existem na máquina.
„
O montador as cria.
Melhora os recursos do Assembly.
OAC – Ling. de„Máquina – Strings, Endereçamento - 14
Juliana F Camapum Wanderley
7
Transformação C → Executável (3/8)
„
Pseudo-instruções
„
move $t0,$t1
„
„
o montador transforma em: add $t0,$zero,$t1
blt (branch if less than).
„
„
„
„
„
# $t0 ← $t1
o montador substitui esta pseudo-instrução automaticamente por uma
combinação de slt/bne.
bgt, bge, ble
Montador do MIPS: converte um branch fora da faixa em um
branch mais um jump.
Permite carregar constantes de 32 bits em um registrador, usando
combinação de instruções.
O MIPS utiliza o registrador $at para uso exclusivo do montador.
OAC – Ling. de Máquina – Strings, Endereçamento - 15
Juliana F Camapum Wanderley
Transformação C → Executável (4/8)
„
Montador
„
aceitam números em diferentes bases: decimal, binário,
hexadecimal.
„
„
0000 0000 1010 1111 1000 0000 0010 0000 = 00af 8020hexa
transforma o programa em linguagem de máquina em
um arquivo objeto → combinação de:
„
instruções em linguagem de máquina;
„
dados;
„
informações necessárias para carregar o programa
adequadamente na memória.
OAC – Ling. de Máquina – Strings, Endereçamento - 16
Juliana F Camapum Wanderley
8
Transformação C → Executável (5/8)
„
Para produzir a versão binária:
„
„
É preciso saber os endereços dos labels (tabela de símbolos).
Arquivo objeto: deve conter...
„
„
„
„
„
„
Cabeçalho do arquivo objeto, com tamanho e posição.
O segmento de texto que contém o código em linguagem de
máquina.
O segmento de dados, que contém os dados necessários.
Informação sobre relocação: como os endereços absolutos são
redefinidos.
Tabela de símbolos: labels não-definidos, como referências
externas.
Informações para análise de erros (debbuger).
OAC – Ling. de Máquina – Strings, Endereçamento - 17
Juliana F Camapum Wanderley
Transformação C → Executável (6/8)
„
Ligador
„
Mudança em um programa, que é parte de um conjunto: tem
que mudar todo o programa?
„
Não. Só uma parte é recompilada.
„
Cada programa já pode estar compilado (em ling. de máquina).
„
„
Um programa chamado ligador (linker) “monta” os programas
como um único programa.
3 passos:
„
„
„
Colocar os módulos de código e dados
simbolicamente na memória
Determinar os endereços dos labels de dados e de
instruções.
Resolver as referências externas e internas.
Usa, para tal, as informações do programa objeto.
Juliana F Camapum Wanderley
„ de Máquina – Strings, Endereçamento - 18
OAC – Ling.
9
Transformação C → Executável (7/8)
„
MIPS: convenções para o linker alocar
endereços para dados e programas:
„
„
O ligador “monta” o arquivo, colocando os
endereços certos. Gera um arquivo
executável.
Resolver o exemplo no livro: ligação de
arquivos hipotéticos.
$gp – global pointer – aponta para o endereço
1000 8000hexa – inst. lw e sw $t0,offset($gp)
$gp+offset = [1000 0000 – 1000 7FFF]
se offset = [8000 – FFFF]
$gp+offset = [1000 8000 – 1000 FFFF]
se offset = [0000 – 7FFF]
OAC – Ling. de Máquina – Strings, Endereçamento - 19
Juliana F Camapum Wanderley
Exemplo: Ligação de Arquivos-Objeto
Cabeçalho(arq. Obj)
Cabeçalho (arq. Obj)
Nome
Proced. A
Tam(cód)
100hexa
Tam(dados) 20hexa
Segmento (código)
Endereço
Instrução
Nome
Proced. B
Tam(cód) 200hexa
Tam(dados) 30hexa
Segmento (código)
Endereço Instrução
0
4
0
4
0
0
4
X
B
lw $a0,0($gp)
jal 0
…
…
Segmento (dados)
(X)
…
…
Informação relocação
lw
X
jal
B
Tabela de Símbolos
…
…
0
0
4
Y
A
sw $a1,0($gp)
jal 0
…
…
Segmento (dados)
(Y)
…
…
Informação relocação
sw
Y
Jal
A
Tabela de Símbolos
…
…
OAC – Ling. de Máquina – Strings, Endereçamento - 20
Cabeçalho (executável)
Tam(cód)
300hexa
Tam(dados)
50hexa
Segmento (código)
Endereço
Instrução
0040 0000hexa
lw $a0, 8000hexa($gp)
0040 0004hexa jal 0040 0100hexa
…
…
0040 0100hexa sw $a1, 8020hexa($gp)
0040 0104hexa jal 0040 0000hexa
…
…
Segmento (dados)
1000 0000hexa
(X)
…
…
1000 0020hexa
(Y)
…
…
Juliana F Camapum Wanderley
10
Transformação C → Executável (8/8)
„
Carregador (Loader)
„
Realiza o carregamento do programa na memória.
No UNIX:
1.
Leitura do cabeçalho.
2.
Criação de espaço de cód. e dados.
3.
Copiar instr. e dados para a memória.
4.
Copiar os parâmetros p/ a pilha (quando houver).
5.
Iniciar o SP.
6.
Desviar para a rotina de inicialização
OAC – Ling. de Máquina – Strings, Endereçamento - 21
Juliana F Camapum Wanderley
Exemplo Para Juntar as Peças
„
O procedimento swap (folha).
„
Troca dois elementos consecutivos no array.
„
Na tradução:
1.
Alocar registradores para as variáveis.
2.
Produzir código para o procedimento.
3.
Preservar os registradores nas chamadas.
OAC – Ling. de Máquina – Strings, Endereçamento - 22
Juliana F Camapum Wanderley
11
Swap(int v[ ], int k) {
Tradução do procedimento swap
int temp;
temp=v[k];
v : $a0, k: $a1, temp: $t0
v[k]=v[k+1];
Swap:
v[k+1]=temp; }
add $t1, $a1, $a1
add $t1, $t1, $t1
add $t1, $a0, $t1
# $t1←2*k
# $t1←4*k
# base de v[k]
lw $t0, 0($t1)
lw $t2, 4($t1)
# $t0 ← v[k]
# $t2 ← v[k+1]
sw $t2, 0($t1)
sw $t0, 4($t1)
jr
$ra
# v[k] ← $t2
# v[k+1] ← $t0
# retorna
OAC – Ling. de Máquina – Strings, Endereçamento - 23
Juliana F Camapum Wanderley
Procedimento sort (não-folha)
sort (int v[ ], int n) {
int i,j;
for (i=0; i < n; i = i+1)
v : $a0, n: $a1, i: $s0, j: $s1
for (j=i-1; j>=0 &&v[j]>v[j+1];j=j-1)
swap(v, j); }
# for externo → for (i=0; i < n; i = i+1)
move $s0, $zero
for1tst: slt
beq
# i=0
$t0,$s0,$a1
# i<n?
$t0,$0,exit1
#não: vá para exit1 (sai)
# sim: executa segundo loop for (corpo do primeiro loop for)
addi $s0,$s0,1
# i → i+1
j
# vá p/ for1tst
for1tst
exit1:
OAC – Ling. de Máquina – Strings, Endereçamento - 24
Juliana F Camapum Wanderley
12
·
# Segundo loop for→ for (j=i-1; j>=0 && v[j]>v[j+1] ;j= j-1) swap(v, j);
addi $s1,$s0,-1
for2tst: slti
# j←i-1
$t0,$s1,0
# j<0?
bne
$t0,$zero,exit2
#sim (j<0 ): vá para exit2 (sai)
add
$t1,$s1,$s1
#não (j≥0): $t1←2*j
add
$t1,$t1,$t1
#$t1←4*j
add
$t2,$a0,$t1
# end v[j]
lw
$t3,0($t2)
# $t3 ← v[j]
lw
$t4,4($t2)
# $t4 ←v[j+1]
slt
$t0,$t4,$t3
# v[j]>v[j+1] ?deixa loop
beq
$t0,$zero,exit2
#não: vá para exit2(sai)
# sim: executa swap (corpo do segundo loop for)
addi $s1,$s1,-1
j
# j ← j-1
for2tst
v : $a0, n: $a1, i: $s0, j: $s1
exit2:
OAC – Ling. de Máquina – Strings, Endereçamento - 25
Juliana F Camapum Wanderley
Passagem de parâmetros e chamada
„
„
„
„
A rotina sort e swap utilizam os mesmos parâmetros de
passagem $a0 e $a1 → é preciso salvá-los antes de
passá-los para swap.
Uma opção → salvar na pilha, e recuperar depois.
Outra opção → salvar em outros regs. (usaremos esta).
Salvando parâmetros de sort (v[ ],n) v : $a0, n: $a1
„
„
„
move
move
$s2, $a0
$s3, $a1
# $s2 ← $a0
# $s3 ← $a1
Passando parâmetros para rotina swap(v,j) v : $s2, j: $s1
„
„
„
move
move
jal
$a0, $s2 # $ a0← $ s2
$a1, $s1 # $ a1← $ s1
swap
OAC – Ling. de Máquina – Strings, Endereçamento - 26
Juliana F Camapum Wanderley
13
Preservação dos Valores dos Registradores
de sort
„
„
„
„
sort é chamada por outra subrotina.
Não deve destruir os registradores permanentes
utilizados, $s0 a $s3.
Dever preservar o $ra.
Inicialização da rotina sort: salvar reg. na pilha
addi
sw
sw
sw
sw
sw
„
$sp,$sp,-20
$ra,16($sp)
$s3,12($sp)
$s2,8($sp)
$s1,4($sp)
$s0,0($sp)
Antes de sair de sort: reverter estas seqüências.
OAC – Ling. de Máquina – Strings, Endereçamento - 27
Juliana F Camapum Wanderley
Procedimento sort completo
OAC – Ling. de Máquina – Strings, Endereçamento - 28
Juliana F Camapum Wanderley
14
Programa sort
„
C: 9 linhas.
„
Assembly: 35 linhas.
„
Outro método: “inlining”.
„
Vantagem: economiza 4 chamadas.
„
Desvantagem: caso seja utilizada por outras rotinas.
OAC – Ling. de Máquina – Strings, Endereçamento - 29
Juliana F Camapum Wanderley
Programa Clear usando Array e ponteiros.
„
Comparar duas implementações de uma rotina
(para casa).
OAC – Ling. de Máquina – Strings, Endereçamento - 30
Juliana F Camapum Wanderley
15
Download