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. deMá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