Revisão Comp-Prog Autor: Fernando de Mesentier Silva CES • Barramento de dados: 16 bits • Barramento de endereços: 14 bits • Memória: 2^14 * 16 bits = 32Kbytes Registradores do CES • • • • RD -> Registrador de Dados (16 bits) RE -> Registrador de Endereço (14 bits) RI -> Registrador de Instrução (2 bits) RP -> Registrador apontador de programa (14 bits) • RT -> Registrador de Trabalho (16 bits) • RC* -> Registrador de Condição (1 bit) *(armazena o vai-um do somador) Formato da Instrução Instruções • Lê “End” -> Lê da Memória / Cód 00 • Esc “End” -> Escreve na Memória / Cód 01 • Sub “End” -> Subtrai (RT = [End] - RT) / Cód 10 • Task “End” -> Desvio condicional em relação ao valor de RC / Cód 11 Codificação das Instruções Esquema do CES Ciclos de Instrução • L/E/S -> 1º ciclo: Encontra a próxima instrução Dado é lido(L/S) ou escrito(E) Dado lido/escrito é armazenado em RD • L/E/S -> 2º ciclo: Próxima instrução é lida da memória Ao final do ciclo a instrução é copiada para RD, seu operando é copiado para RE e o cód. Instrução é colocado em RI *L/S -> valor produzido é armazenado em RT no final do ciclo. *S -> vai-um é armazenado no RC no final do ciclo Ciclos de Instrução • No caso da instrução T, se o valor armazenando no RC for um, essa instrução também será executada em dois ciclos de relógio: No primeiro é carregado o endereço de desvio para RP, e no segundo ciclo segue como as outras instruções • Se o valor armazenado no RC for zero, a instrução T será executada em apenas um ciclo de relógio. MIPS • 32 registradores de 32 bits cada • 32 bits de endereço • 8 bits por posição de memória • Instruções de 32 bits Tipos de palavras • Byte = 8 bits • Halfword = 2 bytes • Word = 4 bytes • Um caractere ocupa 1 byte na memória • Um inteiro ocupa 1 word(4 bytes) na memória Endian MIPS x Intel Instruções Aritméticas • add Dest, Op1, Op2 Dest = Op1 + Op2 Ex: add $s1, $s2, $s3 => $s1 = $s2 + $s3 addi $t0, $t1, 1 => $t0 = $t1 + 1 addu $s1, $t1, $t2 => $s1 = $t1 + $t2 *sem sinal* • sub Dest, Op1, Op2 Instruções Lógicas • and Dest, Op1, Op2 Dest = Op1 & Op2 *bit a bit andi Dest, Op1, Imediato • or Dest, Op1, Op2 • not Dest, Op1 Instruções Lógicas • sll Dest, Op1, Imediato Dest = Op1 << Imediato => equivalente a multiplicar por 2^Imediato • srl Dest, Op1, Imediato Dest = Op1 >> Imediato => equivalente a dividir por 2^Imediato Instruções de carga • lw Dest, Imediato(registrador) Carrega o dado endereçado por [reg+imed], e salva em Dest • sw Fonte, Imediato(registrador) Salva o valor dado por fonte na posição de memória endereçada por [reg+imed] Instruções de comparação • slt Dest, Op1, Op2 *set on less than* Dest = 0, Op1 >= Op2 Dest = 1, Op1 < Op2 • slti Dest, Op1, Imediato • sltu Dest, Op1, Op2 • sltiu Dest, Op1, Imediato Instruções de desvio • beq Reg1, Reg2, Label Desvia para Label, se Reg1 == Reg2 • bne Reg1, Reg2, Label Desvia para Label, se Reg1 != Reg2 • j Label * • jr Registrador * *Desvio incondicional Subrotinas • $a0 - $a3 => registradores usados na passagem de parâmetros • $v0 e $v1 => registradores para os valores de retorno • $ra => registrador de endereço de retorno Subrotinas • jal Label Desvia para a subrotina, e salva o endeço de retorno em $ra • jr $ra Desvia de volta para o endereço de retorno Subrotinas • Cuidado! Quando temos subrotinas aninhadas, o valor de retorno($ra) será perdido a cada chamada de subrotina feita em seqüência, por isso é importante que o valor de retorno seja preservado(Melhor solução é empilhar o mesmo). Pilha • $sp => registrador que aponta para o topo da pilha • $fp => frame pointer (serve ao mesmo uso do EBP no intel) • Manipulando o valor do registrador $sp é possível simular as instruções PUSH e POP Codificação de Instruções • Instruções costumam ser representadas em binário ou hexadecimal • Os nomes dos registradores são convertidos pela tabela de registradores • Cada instrução é mapeada conforme o código dado na tabela de instruções • Endereço de memória e constantes se mantêm. Tabela dos Registradores • Formato das Instruções • Formato R => Instruções aritméticas • Formato I => Instruções de transferências de dados ou com valores imediatos • Formato J => Instruções de desvio Formato das Instruções Formato R • • • • • op => código da operação (em R = 000000) rs => código do operador 1 (00000 em srl/sll) rt => código do operador 2 shamt => quantidade de shift (00000 exceto para srl/sll) funct => código da função Exemplo Exemplo Formato I • • • • op => código da operação rs => valor do operando 1 rt => valor do operando 2(destino/fonte) Constante / Endereço Exemplo Formato J • op => código da operação • Endereço => endereço do desvio Endereçamento nas Instruções • Instruções de formato J usam o endereçamento absoluto. • Instruções de formato I usam o endereçamento relativo (a partir de PC) • Cuidado! O MIPS multiplica por 4 o valor de endereço da instrução, uma vez que cada instrução ocupa 32 bits (4 posições de memória) • Cuidado! A contagem do endereço relativo começa a partir da instrução abaixo da atual(porque o PC já está carregado com o endereço da próxima instrução). Exemplo Instrução lui Caracteres • São representados pela tabela ASCII • Ocupam 8 bits (1 espaço de memória) • Variações de lw e sw para bytes: lb e sb - Trabalham com os 8 bits mais a direita Strings • São cadeias de caracteres • Costumam ser representados em uma das 3 formas: 1) A primeira posição da string indica o tamanho dela 2) Uma variável que a acompanha guarda o tamanho da string 3) Ultima posição da string é ocupada por um caractere especial que marca o fim da string Referência Slides da professora Silvanna GOOGLE