Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 OAC – Ling. de Máquina – Strings, Endereçamento - 1 Juliana F Camapum Wanderley 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 - 2 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 2 OAC – Ling. de Máquina – Strings, Endereçamento - 3 Juliana F Camapum Wanderley 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 - 4 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; } 3 OAC – Ling. de Máquina – Strings, Endereçamento - 5 Juliana F Camapum Wanderley Compilação (1/2) x e y: $a0 e $a1, $s0 para i strcpy: addi $sp,$sp,-4 # reserva espaço na pilha sw $s0,0($sp) # salva $s0 (índice i) add $s0,$zero,$zero # i = 0 L1: add $t1,$a1,$s0 # $t1=end. de y[i]=y+i lb $t2,0($t1) # $t2 ← y[i] add $t3,$a0,$s0 # $t3=end de x[i]=x+i sb $t2,0($t3) # x[i] ← y[i] addi $s0,$s0,1 # i ← i + 1 bne $t2,$zero,L1 # Volta se y[i]≠0 lw $s0,0($sp) # restaura $s0 addi $sp,$sp,4 # restaura $sp jr $ra 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 - 6 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. 4 OAC – Ling. de Máquina – Strings, Endereçamento - 7 Juliana F Camapum Wanderley 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 - 8 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 5 OAC – Ling. de Máquina – Strings, Endereçamento - 9 Juliana F Camapum Wanderley 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 - 10 Juliana F Camapum Wanderley Endereçamento nos Desvios Condicionais e Incondicionais Desvio incondicional: j Fim # desvia para Fim (end.800000=0x000C3500) Formato do desvio condicional bne $s0,$s1,Exit # desvia para Exit (end.100) se $s0 ≠ $s1 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. 2 200000=0x0030D40 6 bits 26 bits 5 16 17 6 6 bits 5 bits 5 bits 16 bits ( ) 44end.origemdestino end. )()()( ×++= palavrasPClabel offset Op endereço (palavras) Op rs rt offset do endereço(palavras) End. Instrução bne = 72 (Campo endereço x 4 ) ocupa 28bits: serão concatenados 4 bits mais significativos do PC para formar o endereço de 32 bits 6 OAC – Ling. de Máquina – Strings, Endereçamento - 11 Juliana F Camapum Wanderley Exemplo: loop while Loop: add $t1,$s3,$s3 add $t1,$t1,$t1 add $t1,$t1,$s5 lw $t0,0($t1) bne $t0,$s5,Exit add $s3,$s3,$s4 j Loop Exit: 80000 0 19 19 9 0 32 80004 0 9 9 9 0 32 80008 0 9 21 9 0 32 80012 35 9 8 0 80016 5 8 21 2 80020 0 19 20 19 0 32 80024 2 20000 80028 ----- 80032 35 9 8 0 Exit palavrasbne palavras OAC – Ling. de Máquina – Strings, Endereçamento - 12 Juliana F Camapum Wanderley Desvio condicional grande Neste caso, o montador insere um jump Campo offset (end. relativo) é de 16 bits – beq, bne Como o campo de offset é relativo a uma palavra, representa end. em bytes de 18bits, ou seja, ±217= ±128KB Campo end. absoluto é de 26 bits – j, jal 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 Exemplo: Instrução original beq $s0,$s1,L1 Instrução modificada bne $s0,$s1,L2 J L1 L2: 7 OAC – Ling. de Máquina – Strings, Endereçamento - 13 Juliana F Camapum Wanderley 4 passos: C → Linguagem de máquina. Transformação C → Executável (1/8) OAC – Ling. de Máquina – Strings, Endereçamento - 14 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. 8 OAC – Ling. de Máquina – Strings, Endereçamento - 15 Juliana F Camapum Wanderley Transformação C → Executável (3/8) Pseudo-instruções move $t0,$t1 # $t0 ← $t1 o montador transforma em: add $t0,$zero,$t1 blt (branch if less than). 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 - 16 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. 9 OAC – Ling. de Máquina – Strings, Endereçamento - 17 Juliana F Camapum Wanderley 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 linguagemde 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 - 18 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. 10 OAC – Ling. de Máquina – Strings, Endereçamento - 19 Juliana F Camapum Wanderley 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 - 20 Juliana F Camapum Wanderley Exemplo: Ligação de Arquivos-Objeto Tabela de Símbolos …X B Xlw 0 jal 4 (X)0 …… Informação relocação lw $a0,0($gp)0 jal 04 …… Segmento (dados) Segmento (código) Cabeçalho(arq. Obj) Proced. ANome …B InstruçãoEndereço 20hexaTam(dados) 100hexaTam(cód) Tabela de Símbolos …Y A Ysw 0 Jal 4 (Y)0 …… Informação relocação sw $a1,0($gp)0 jal 04 …… Segmento (dados) Segmento (código) Cabeçalho (arq. Obj) Proced. BNome …A InstruçãoEndereço 30hexaTam(dados) 200hexaTam(cód) …… (Y) (X) …… jal 0040 0000hexa sw $a1, 8020hexa($gp)0040 0100hexa 0040 0104hexa Segmento (dados) …… 1000 0020hexa lw $a0, 8000hexa($gp)0040 0000hexa jal 0040 0100hexa0040 0004hexa …… 1000 0000hexa Segmento (código) Cabeçalho (executável) InstruçãoEndereço 50hexaTam(dados) 300hexaTam(cód) 11 OAC – Ling. de Máquina – Strings, Endereçamento - 21 Juliana F Camapum Wanderley 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 - 22 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. 12 OAC – Ling. de Máquina – Strings, Endereçamento - 23 Juliana F Camapum Wanderley Tradução do procedimento swap Swap: add $t1, $a1, $a1 # $t1←2*k add $t1, $t1, $t1 # $t1←4*k add $t1, $a0, $t1 # base de v[k] lw $t0, 0($t1) # $t0 ← v[k] lw $t2, 4($t1) # $t2 ← v[k+1] sw $t2, 0($t1) # v[k] ← $t2 sw $t0, 4($t1) # v[k+1] ← $t0 jr $ra # retorna Swap(int v[ ], int k) { int temp; temp=v[k]; v[k]=v[k+1]; v[k+1]=temp; } v : $a0, k: $a1, temp: $t0 OAC – Ling. de Máquina – Strings, Endereçamento - 24 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) for (j=i-1; j>=0 &&v[j]>v[j+1];j=j-1) swap(v, j); } v : $a0, n: $a1, i: $s0, j: $s1 # for externo → for (i=0; i < n; i = i+1) move $s0, $zero # i=0 for1tst: slt $t0,$s0,$a1 # i<n? beq $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 for1tst # vá p/ for1tst exit1: 13 OAC – Ling. de Máquina – Strings, Endereçamento - 25 Juliana F Camapum Wanderley · # Segundo loop for→ for (j=i-1; j>=0 && v[j]>v[j+1] ;j= j-1) swap(v, j); addi $s1,$s0,-1 # j←i-1 for2tst: slti $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-1 j for2tst exit2: v : $a0, n: $a1, i: $s0, j: $s1 OAC – Ling. de Máquina – Strings, Endereçamento - 26 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 $s2, $a0 # $s2 ← $a0 move $s3, $a1 # $s3 ← $a1 Passando parâmetros para rotina swap(v,j) v : $s2, j: $s1 move $a0, $s2 # $ a0← $ s2 move $a1, $s1 # $ a1← $ s1 jal swap 14 OAC – Ling. de Máquina – Strings, Endereçamento - 27 Juliana F Camapum Wanderley 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 Antes de sair de sort: reverter estas seqüências. addi $sp,$sp,-20 sw $ra,16($sp) sw $s3,12($sp) sw $s2,8($sp) sw $s1,4($sp) sw $s0,0($sp) OAC – Ling. de Máquina – Strings, Endereçamento - 28 Juliana F Camapum Wanderley Procedimento sort completo 15 OAC – Ling. de Máquina – Strings, Endereçamento - 29 Juliana F Camapum Wanderley 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 - 30 Juliana F Camapum Wanderley Programa Clear usando Array e ponteiros. Comparar duas implementações de uma rotina (para casa).
Compartilhar