Arquitetura de Computadores Linguagem de Máquina Ivan Saraiva Silva Formato de Instrução MAC O MIC possui dois formatos de instrução: 4 bits 12 bits Formato 1 CODOP ENDEREÇO 8 bits 8 bits Formato 2 CODOP ENDEREÇO 16 bits Formato 3 CODOP 1
Conjunto de Instruções MAC Instrução Mnemônico Significado 0000xxxxxxxxxxxx LODD X AC := M[X] 0001xxxxxxxxxxxx STOD X M[X] := AC 0010xxxxxxxxxxxx ADDD X AC := AC + M[X] 0011xxxxxxxxxxxx SUBD X AC := AC - M[X] 0100xxxxxxxxxxxx JPOS X If AC 0; PC := X 0101xxxxxxxxxxxx JZER X If AC = 0; PC := X 0110xxxxxxxxxxxx JUMP PC := X 0111xxxxxxxxxxxx LOCO AC := X 1000xxxxxxxxxxxx LODL AC := M[SP +X] Conjunto de Instruções do MAC Instrução Mnemônico Significado 1001xxxxxxxxxxxx STOL M[X + SP] := AC 1010xxxxxxxxxxxx ADDL AC := AC + M[SP + X] 1011xxxxxxxxxxxx SUBL AC := AC - M[SP + X] 1100xxxxxxxxxxxx JNEG if AC < 0; PC := X 1101xxxxxxxxxxxx JNZE if AC 0; PC := X 1110xxxxxxxxxxx CALL SP := SP - 1; M[SP] := PC; PC := X 2
Conjunto de Instruções MAC Instrução Mnemônico Significado 1111000000000000 PSHI SP := SP - 1; M[SP] := M[AC] 1111001000000000 POPI M[AC] := M[SP] SP := SP + 1; 1111010000000000 PUSH SP := SP - 1; M[SP] := AC 1111011000000000 POP AC := M[SP]; SP := SP + 1; 1111100000000000 RETN PC := M[SP]; SP := SP + 1; 1111101000000000 SWAP TMP := AC; AC := SP; SP := TMP 11111100yyyyyyyyy INSP SP = SP + Y 11111110yyyyyyyyy DESP SP := SP - Y MAR MBR RD WR ULA P A S C C P I R T I R A B 0 1-1 A B C D E M M F 16 Z N 3
Programação no MIPS Programação no MIPS A notação em assembly do MIPS usa add a, b, c # que significa a = b + c Sub a, b, c # que significa a = b - c sub add Ordem dos operandos indica operandos fonte e destino 4
Programação no MIPS Para somar os conteúdos de b, c, d e e add a, b, c # a = b + c add a, a, d # a = (b+c) + d add a, a, e # a = (b+c+d) + e Cada linha do programa tem apenas uma instrução Os operandos das instruções MIPS precisam ser um registrador O conteúdo de um registrador Programação no MIPS A ISA MIPS usa três formatos de instrução 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits op rs rt rd shamt funct Formato tipo R (Operações entre registradores) 6 bits 5 bits 5 bits 16 bits op rs rt constante ou endereço Formato tipo I (Endereçamento imediato) 5
Programação no MIPS A ISA MIPS usa três formatos de instrução 6 bits 26 bits op constante ou endereço Formato tipo J (Saltos e chamada de procedimentos) Uso de Registradores no MIPS 32 registradores estão disponíveis no MIPS $s0, $s1, $s2, # para variáveis $t0, $t1, $t2, # para temporários A palavra do MIPS é de 32 bits Registradores também têm 32 bits 6
Uso de Registradores no MIPS Registrador Número Uso Preservado na chamada? $zero 0 Valor 0 n.a. $at 1 Assembler temporary N $v0-$v1 2-3 Resultados (procedimentos) N $a0-$a3 4-7 Argumentos (procedimentos) N $t0-$t7 8-15 Temporários N $s0-$s7 16-23 Valores salvos S $t8-$t9 24-25 Temporários N $gp 28 Ponteiro global S $sp 29 pilha S Sfp 30 quadro S $ra 31 retorno S Instruções de Formato R op: opcode operação básica da instrução rs: registrador do primeiro operando de origem rt: registrador do segundo operando de origem rd: registrador do operando destino shamt: Quantidade de deslocamento funct: função define uma variante da operação 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits op rs rt rd shamt funct Formato tipo R 7
Representando Instruções Tipo R Exemplo: Como codificar: add $t0, $s1, $s2 op 6 bits rs 5 bits rt 5 bits rd 5 bits shant 5 bits funct 6 bits 000000 10001 10010 01000 00000 100000 add (17 = $s1) (18 = $s2) (8 = $t0) Instruções do Formato R Instruções aritméticas add $s0, $s1, $s2 sub $s0, $s1, $s2 Instruções lógicas (entre registradores) AND bit-a-bit and $t0, $t1, $t2 OR bit-a-bit or $t0, $t1, $t2 NOR bit-a-bit nor $t0, $t1, $t2 # $t0 = NOT ($t1 OR $t2) 8
Instruções do Formato R Instruções de deslocamento Shift à esquerda sll $t2, $s0, 4 # $t2 = shift a esquerda de $s0 de 4 bits O campo shamt indica o tamanho do deslocamento Shift à direita Codificado no Campo shamt srl $t2, $s0, 4 # $t2 = shift a direita de $s0 de 4 bits Codificado no campo shamt Instruções do Formato R Teste de igualdade ou desigualdade slt $t0, $s3, $s4 # $t0 = 1 se $s3 < $s4; cc $t0 = 0 Retorno de procedimento jr $ra Instrução de retorno incondicional de procedimento Salta para o endereço armazenado em $ra Esta instrução é usada coma a última instrução de um procedimento A instrução de salto para procedimento é a instrução jal (tipo J) 9
Instruções do Formato I Permite a utilização de constantes e operandos Imediatos As vezes é importante evitar o tempo de carga (load) de uma constante O MIPS faz isto com endereçamento imediato Aumenta da velocidade de execução Instruções do Formato I Instruções aritméticas addi $s3, $s3, 4 # $s3 = $s3 + 4 4 é um operando imediato O operando imediato é codificado na instrução Instruções lógicas Codificado no andi $t0, $t1, 100 campo constante ou endereço de ori $t0, $t1, 100 16 bits Teste de igualdade ou desigualdade slti $t0, $s2, 10 # $t0 = 1 se $s2 < 10; cc $t0 = 0 10
Instruções do Formato I Instruções de controle de fluxo Desvios Condicionais beq $s3, $s4, label # salte para label se ($s3 = $s4) bne $s3, $s4, label # salte para label se ($s3 $s4) Carga e armazenamento envolvendo a memória lw $t0, 32 ($s3) # salte para label se ($s3 = $s4) sw $t0, 32($s3) Instruções do Formato I Carga e armazenamento menores que uma palavra lh $s1, 100($s2) # load meia palavra (2 bytes) $s1 = M(($s2 + 100) sh $s1, 100($s2) # store meia palavra (2 bytes) M(($s2 + 100) = $s1 lb $s1, 100($s2) # load um byte sb $s1, 100($s2) # store um byte 11
Instruções do Formato I Carga e armazenamento menores que uma palavra lui $t0, 255 # carrega constante nos 16 bits mais significativos de $t0 Instruções do Formato J Desvios Incondicionais j label # salte para label de forma incondicional A instrução jump usa um formato chamado formato j Chamada de procedimento jal label # label é o endereço do procedimento Para executar um procedimento é necessário garantir certos recursos... 12
Programação no MIPS Exemplo if (i == j) f = g + h; else f = g h; Supor i e j armazenados em $s3 e $s4 f, g e h estão armazenados em $s0, $s1 e $s2 bne $s3, $s4, Else # PC = Else se $s3 $s4 add $s0, $s1, $s2 # f = g + h j Exit; Else: sub $s0, $s1, $s2 # # f = g - h Exit: Programação no MIPS Exemplo While (save[i] = = k) i += 1; Supor i e k armazenados em $s3 e $s5 Precisamos do endereço de do array save Supor que o endereço base do array save armazenada em $s6. Loop: sll $t1, $s3, 2 # $t1=4*i add $t1, $t1, $s6 # save = (4*i) + $s6 lw $t0, 0($t1) # $t0 = save(i) bne $t0, $s5, Exit # sai se i k addi $s3, $s3, 1 # i = i + 1 j Loop # vá para Loop Exit: 13
Procedimentos no MIPS Para a execução de um procedimento é necessário: Colocar parâmetros em um local conhecido do procedimento Transferir o controle para o procedimento Adquirir recursos de armazenamento para o procedimento Realizar a tarefa desejada Colocar o valor de retorno em um valor conhecido por quem chamou o procedimento Retornar ao ponto de origem Procedimentos no MIPS Registradores e procedimentos $a0 a $a3 - Quatro registradores para passar parâmetros $v0 e $v1 Dois registradores para valores de retorno $ra Registrador de endereço de retorno ao ponto de origem Mais registradores Para usar mais registradores para parâmetros ou valores de retorno usa-se o $sp (apontador de pilha) 14
Programação no MIPS Exemplo procedimento int exemplo (int g, int h, int i, int j) { int f; f = (g + h) (I + j) } g, h, i e j usam os registradores de argumento $a0 a $a3 f corresponde a $s0 Preparando a execução do procedimento addi $sp, $sp, -12 sw $t1, 8($sp) # empilha $t1 sw $t0, 4($sp) # empilha $t0 sw $s0, 0($sp) # empilha $s0 Executando o procedimento add $t0, $a0, $a1 # $t0 contém g + h add $t1, $a2, $a3 # $t1 contém i + j sub $s0, $t0, $t1 # f = $t0 - $t1 Programação no MIPS Armazenando valor de retorno add $v0, $s0, $zero Preparando o retornoimento lw $s0, 0($sp) # restaura $s0 lw $t0, 4($sp) # restaura $t0 lw $t1, 8,($sp) # restaura $t1 addi $sp, $sp, 12 # ajusta a pilha jr $ra # retorna para o chamador 15
Modos de endereçamento Dois formatos envolvem constantes ou endereços da memória Formato I: constantes ou endereços de 16 bits Desvio máximo de 2 16, insuficiente para os dias atuais. Solução é usar o salto relativo a um registrador PC = Registrador + Endereço de desvio PC = (PC + 4) + Endereço de desvio (em # de palavras) Formato J: Constantes ou endereços de 26 bits Desvio máximo de 2 26, podes ser insuficiente Modos de endereçamento O MIPS disponibiliza cinco modos de endereçamento Endereçamento em registrador O operando é um registrador O endereço é o endereço do registrador (formato R) Endereçamento de base ou deslocamento O operando está na posição de memória apontada pela soma de um registrador com uma constante na instrução Ex. lw $t0, 4($sp) 16
Modos de endereçamento Endereçamento Imediato O operando é uma constante na instrução Ex. addi $A0, $A0, -1 Endereçamento relativo ao PC O endereço é a soma do PC com uma constante na instrução Endereçamento Pseudodireto O endereço do jump são os 26 bits do campo endereço da instrução concatenados com os 4 bits superiores de PC Programação no MIPS Estudo de caso Com o que foi visto até agora tente escrever em assembly do MIPS o algoritmo ao lado Identifique o que o algoritmo faz int X, S = 4, D = 2, R = 1, T = 0; cin >> X; While (T >= 0) { } R = R+1; D = D+2; S = S+D+1; T = X S; 17
Atividades Recomendadas Baixar o simulador MARS http://courses.missouristate.edu/kenvollmar/mars/ Estudar o capítulo 2 do livro: até a seção 2.9. Exercitar-se no uso do simulador MARS 18